The upgrade process
The Fedora project page recommends to do the upgrade entirely without a DVD or CD image, by using preupgrade. Preupgrade downloads all packages that need to be upgraded, creates new repository metadata and installs an installer that is run after reboot and installs the new packages, including a new kernel.
I started with bringing my current system up to date by running yum update. After that I ran preupgrade. However, there was a problem. When preupgrade created new repository metadata, it crashed with an xml parser error. This is due to a bug in yum that has been fixed, however the fix is not available in Fedora 9. The solution is to fake a Fedora 10 system by installing the Fedora 10 release files (manually using rpm) and updating yum to the latest Fedora 10 version (with the bugfix), as described in this forum thread. After performing these steps, preupgrade succeeded. Rebooting ran the installer which installed the new packages.
When the upgrade was finished, I rebooted, however the boot process got stuck before the X-server could be started (my default runlevel was 5). Some daemons, including HAL and NetworkManager, failed to start. The first thing I did was to boot from my Knoppix live CD, change the default runlevel to 3 (no X-server) in /etc/inittab and disable some services that I thought were not necessary at this point, like jexec and avahi-daemon.
Fixing SELinux policies
After doing some research, it turned out that most problems were caused by SELinux denying access to various files and other resources, either because of mislabeled files or missing policies. The first issue should be solved by relabeling the filesystem:
touch /.autorelabel
reboot
This took a while, but after relabeling the boot process was much better. Some services would still not start, but the X-server came up now. There were still access denials by SELinux though, so I turned to the next step, which was to set SELinux to permissive mode (change one line in /etc/selinux/config) and reboot. By that time I had also changed the default runlevel back to 5.
When SELinux is in permissive mode, access requests are no longer denied but still logged in /var/log/audit/audit.log, which can then be used to create a policy module, as described below. I recommend to perform some common tasks that involve system processes, like hibernating (close and open the laptop lid), so that most access violations are logged. Then I created a policy module (this is described in the audit2allow man page):
# generate the policy module source
audit2allow -m local < /var/log/audit/audit.log > local.te
# compile the module
checkmodule -M -m -o local.mod local.te
# create a module package
semodule_package -o local.pp -m local.mod
# load the module into the kernel
semodule -i local.pp
Finally I set SELinux back to enforcing and rebooted. At this point everything came up nicely. At one point a couple of new access violations were intercepted, but now the setroubleshoot daemon was running, so I added the missing rules to the policy module and reinstalled.
Gnome panel and dual-head display
At work I connect a second screen to my laptop, and my Gnome desktop extends over both screens. For some reason, when I logged in with the second screen connected, Gnome decided to place the top and bottom panels on the external screen, rather than the laptop screen. In Fedora 9, it was possible to simply drag a panel and move it to a different position or even a different screen, but that did not work anymore. A web search revealed that this option had been disabled because some users accidentially grabbed a panel and moved it and messed up their desktop and weren't even aware what they had done and how to fix it.
I fixed this problem by invoking gconf-editor and setting
/apps/panel/toplevels/top_panel/monitor=0
/apps/panel/toplevels/bottom_panel/monitor=0
Making audio work
To allow user applications to control sound devices (setting volume), the user must be added to the audio group:
usermod -G audio,othergroups username
The major problem with sound was that after the upgrade the volume was extremely high. Pulseaudio recently introduced a new feature called flat-volumes which, when enabled by default, ties the device (master) volume to the loudest (input) stream volume. So when my earphones explode and I turn down the device volume to 10% and then restart the application (e.g. mplayer), flat-volumes sets the device volume back to 100%. Luckily this can be disabled in /etc/pulse/daemon.conf.
Another problem was the microphone. My laptop has a HDA Intel card. Until this day I have not been able to get the internal microphone working, neither in Fedora 9 nor 12. The external microphone (from my headset) had worked in Fedora 9. I finally got it to work by running alsamixer -c0 (the -c0 argument is important; without it alsamixer shows pulseaudio controls rather than sound card controls) and trying all possible settings in the Capture section, ignoring any control labels like ExtMic and IntMic (in my case, IntMic seems to refer to the external microphone).
Wuala file system integration
Wuala is an online storage application that has full file system integration, meaning that you can mount your cloud storage into your Linux file system. After the upgrade to Fedora 12 mounting the Wuala NFS server did not work anymore. However, Wuala recently added a FUSE-based filesystem as an alternative to NFS (which makes more sense because the Wuala client typically runs locally rather than on a different machine, so the NFS mount comes from localhost and doesn't use the network). FUSE can be enabled by running Wuala with the -useFuse commandline option, and this worked.