Concurrent init.d scripts and HAL initialise error on boot up

Posted by on Apr 30, 2008 in Ubuntu1 comment

I wanted to see if I could take advantage of my Dual Core CPU during boot time, by enabling concurrent init.d scripts, in the hope this could improve (an already pretty fast) boot time. The implementation is pretty simple – first, I backed up /etc/init.d/rc

cd /etc/init.d/
sudo cp rc rc.BAK

then set about editing /etc/init.d/rc

gksu gedit /etc/init.d/rc

Actually, there isn’t much to edit – I just needed to change:




on line 24, save the file, and reboot. However, when I rebooted, there was a gnarly error caused by HAL (Hardware Abstraction Layer) failing to initialise. After some digging, I found a bug report, and a solution. The cause of the problem, and the solution is actually quite simple. At run level 2, HAL and DBus are set to start at the same time – in the /etc/rc2.d/ directory, both symbolic links have the same S12 prefix (S12hal and S12dbus):

ls -l
lrwxrwxrwx 1 root root 14 2008-04-26 00:52 S12dbus -> ../init.d/dbus
lrwxrwxrwx 1 root root 13 2008-04-25 18:58 S12hal -> ../init.d/hal

which causes a problem with concurrent init.d scripts, since they are now executed at the same time. HAL initialises slightly faster than DBus, but requires DBus in order to initialise, hence the “failed to initialize” error. The solution is equally simple. As suggested in the bug report, I changed the execution order of HAL. I had to do this via the recovery console, but so long as you don’t reboot after saving the /etc/init.d/rc file, it can be done via the GUI terminal:

sudo mv /etc/rc2.d/S12hal /etc/rc2.d/S13hal
sudo reboot

This time, there was no problem, and no error, since it ensures that DBus (S12dbus) initialises before HAL (S13hal).

If I still get problems in the future, I can always restore the old version of /etc/init.d/rc:

cd /etc/init.d
sudo cp rc.BAK rc

Coupled with boot profiling, this does speed up my boot time by shaving an extra few seconds away.

Tags: , , ,