It is quite a simple change but it makes an Ubuntu laptop to boot 2-3 times faster! What takes the most time during boot in Ubuntu (and many other Linux distros) are DHCP discovery and DHCP timeout that are run by networking startup scripts. This of course can be solved with tweaking the timeout or just configuring a static IP, however this solution is not all that elegant, just because “What if the system needs this particular timeout?” or “What if it is a laptop, and it’s IP cannot be static?”
The idea to solve this is simply to take an advantage of concurrency. So instead of all other boot scripts to wait on the networking script(s) to finish its discovering and “timeouting” during a system boot, these network script(s) could be started in parallel, as separate child processes. This will speed up boot time, since the system should no longer wait on the “networking” to finish.
One thing to understand here, is that networking is not taken out of the boot process – it stills belongs to it (it is its child), and it would still run, and would do its important job – the difference is it would do it in parallel.
Here are two easy steps on howto archive this in Ubuntu (it can be applied to pretty much any Linux/Unix distribution, however the scrips/locations will/might be different) :
Step 1. Find network startup scripts:
cd /etc user@host:/etc$ sudo find . | grep network ./rcS.d/S40networking ./init.d/networking ./network ./network/.interfaces.swp ./network/if-post-down.d ./network/if-post-down.d/avahi-daemon ./network/if-post-down.d/wireless-tools ./network/if-post-down.d/wpasupplicant ./network/interfaces ./network/if-up.d ./network/if-up.d/ntp ./network/if-up.d/clamav-freshclam-ifupdown ./network/if-up.d/ntpdate ./network/if-up.d/avahi-daemon ./network/if-up.d/sendmail ./network/if-up.d/avahi-autoipd ./network/if-up.d/wpasupplicant ./network/if-up.d/mountnfs ./network/if-pre-up.d ./network/if-pre-up.d/wireless-tools ./network/if-pre-up.d/wpasupplicant ./network/if-down.d ./network/if-down.d/clamav-freshclam-ifupdown ./network/if-down.d/sendmail ./network/if-down.d/avahi-autoipd ./network/if-down.d/wpasupplicant ./networks user@host:/etc$ ll ./rcS.d/S40networking lrwxrwxrwx 1 root root 20 2007-05-20 18:48 ./rcS.d/S40networking -> ../init.d/networking |
FOUND IT: In this case the netwoking script that runs on startup is “../init.d/networking”
Step 2. Extract “start” case into a separate method:
user@host:/etc$ sudo vi ../init.d/networking |
here is a “start case” in the original file:
case "$1" in start) log_action_begin_msg "Configuring network interfaces" type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 120" || true if [ "$VERBOSE" != no ]; then if ifup -a; then log_action_end_msg $? else log_action_end_msg $? fi else if ifup -a >/dev/null 2>&1; then log_action_end_msg $? else log_action_end_msg $? fi fi type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 15" || true ;; |
let’s modify it by extracting the “start case” into a separate method so it can be run as a background process on the start up:
here is a “start case” in the modified file:
# adding this method so it can be run as a background process on the start up start_on_boot () { log_action_begin_msg "Configuring network interfaces" type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 120" || true if [ "$VERBOSE" != no ]; then if ifup -a; then log_action_end_msg $? else log_action_end_msg $? fi else if ifup -a >/dev/null 2>&1; then log_action_end_msg $? else log_action_end_msg $? fi fi type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 15" || true } case "$1" in start) # start networking on the background, so it does not slow down the boot time start_on_boot & ;; |
Save the file, reboot and enjoy
DONE :)
Interesting related articles:
making ubuntu boot in 19 seconds
understanding bash fork bomb