Note: These tricks apply to any Linux based OS. But I have tested them only on Fedora, so can’t say whether they’ll work on other Linux(s).
My current Fedora installation is now almost one and a half years old. Yes. I am still using Fedora 7 😀 I have Fedora 10 on my other machine. Coming to the agenda, my Fedora installation has grown beyond control and I have services from named, squid, drbl, privoxy, vsftpd, vbox*, smb and what not on a personal desktop. These services really force my system startup to slow down to more than two minutes. While shutting down, its very easy to just cut the power supply but while booting up I can’t help and it frustrates me. And what frustrates me further that I have 4GB DDR2 RAM and AMD64 X2 5600+ (2.8GHz x 2) and booting time is still more than two minutes.
Agenda
- Boot Fedora faster using whatever techniques possible.
Remove the services from normal order and delay their execution to a later stage. So, services like network, squid, privoxy, named, vsftpd, smb etc. doesn’t make sense unless I am not logged in and using them. Let us start them after we have login screen.
Turn off all the services by using the command
[root@bordeaux ~]# chkconfig service_name off |
[root@bordeaux ~]# chkconfig service_name off
where service_name is the service you want to turn off.
Now create a file /etc/startup.sh. Enter a line like this
[root@bordeaux ~]# service service_name start |
[root@bordeaux ~]# service service_name start
for every service that you have turned off in the Step 1.1 and you want it to be running after your machine starts up. Now, your startup.sh file should look like this
service network start &
service sshd start &
modprobe it87 &
modprobe k8temp &
/usr/bin/iptraf -s eth0 -B &
/usr/bin/iptraf -s lo -B &
service squid start &
service privoxy start &
service httpd start &
service mysqld start &
service named start &
service smb start &
service vboxdrv start &
service vboxnet start &
service vsftpd start & |
service network start &
service sshd start &
modprobe it87 &
modprobe k8temp &
/usr/bin/iptraf -s eth0 -B &
/usr/bin/iptraf -s lo -B &
service squid start &
service privoxy start &
service httpd start &
service mysqld start &
service named start &
service smb start &
service vboxdrv start &
service vboxnet start &
service vsftpd start &
Add the following line to /etc/rc.local file
/bin/bash /etc/startup.sh & |
/bin/bash /etc/startup.sh &
Done!!! Notice the &s in both files. They are for execution in background so that a process can block boot process. You’ll observe a drop of 10-20 seconds in system startup time.
Problem with Hack #1 : The execution is not really parallel. It executes like a process in the background. So we can’t get the real advantage of parallel execution.
Hack #2 solves this problem. Now we don’t put processes in background. We use daemon forking to fork a separate daemon process which will start all the services for us in parallel. Here we’ll get the real advantage and startup time will decrease further.
This step is totally similar to Step 1.1. So skipping it.
This step is also similar to Step 1.2. The /etc/startup.sh file should look like this.
service network start
service xinetd start
service crond start
service anacron start
service atd start
service sshd start
service rpcbind start
service rpcgssd start
service rpcimapd start
modprobe it87
modprobe k8temp
/usr/bin/iptraf -s eth0 -B
/usr/bin/iptraf -s lo -B
service nasd start
service squid start
service privoxy start
service httpd start
service iptables start
service lm_sensors start
service mysqld start
service named start
service nfs start
service nfslock start
service smb start
service vboxdrv start
service vboxnet start
service vsftpd start
service autofs start
service smartd start |
service network start
service xinetd start
service crond start
service anacron start
service atd start
service sshd start
service rpcbind start
service rpcgssd start
service rpcimapd start
modprobe it87
modprobe k8temp
/usr/bin/iptraf -s eth0 -B
/usr/bin/iptraf -s lo -B
service nasd start
service squid start
service privoxy start
service httpd start
service iptables start
service lm_sensors start
service mysqld start
service named start
service nfs start
service nfslock start
service smb start
service vboxdrv start
service vboxnet start
service vsftpd start
service autofs start
service smartd start
Notice the absence of &s in the file.
Download the attached startup.py file attached at the end of this post or copy paste the following code to /etc/startup.py file.
#!/usr/bin/env python
# (C) Copyright 2008 Kulbir Saini
# License : GPL
import os
import sys
def fork_daemon(f):
"""This function forks a daemon."""
# Perform double fork
r = ''
if os.fork(): # Parent
# Wait for the child so that it doesn't defunct
os.wait()
# Return a function
return lambda *x, **kw: r
# Otherwise, we are the child
# Perform second fork
os.setsid()
os.umask(077)
os.chdir('/')
if os.fork():
os._exit(0)
def wrapper(*args, **kwargs):
"""Wrapper function to be returned from generator.
Executes the function bound to the generator and then
exits the process"""
f(*args, **kwargs)
os._exit(0)
return wrapper
def start_services(startup_file):
command = '/bin/bash ' + startup_file + ' > /dev/null 2> /dev/null '
os.system(command)
return
if __name__ == '__main__':
forkd = fork_daemon(start_services)
forkd(sys.argv[1])
print 'Executing ', sys.argv[1], '[ OK ]' |
#!/usr/bin/env python
# (C) Copyright 2008 Kulbir Saini
# License : GPL
import os
import sys
def fork_daemon(f):
"""This function forks a daemon."""
# Perform double fork
r = ''
if os.fork(): # Parent
# Wait for the child so that it doesn't defunct
os.wait()
# Return a function
return lambda *x, **kw: r
# Otherwise, we are the child
# Perform second fork
os.setsid()
os.umask(077)
os.chdir('/')
if os.fork():
os._exit(0)
def wrapper(*args, **kwargs):
"""Wrapper function to be returned from generator.
Executes the function bound to the generator and then
exits the process"""
f(*args, **kwargs)
os._exit(0)
return wrapper
def start_services(startup_file):
command = '/bin/bash ' + startup_file + ' > /dev/null 2> /dev/null '
os.system(command)
return
if __name__ == '__main__':
forkd = fork_daemon(start_services)
forkd(sys.argv[1])
print 'Executing ', sys.argv[1], '[ OK ]'
Add the following line to your /etc/rc.local file.
/usr/bin/python /etc/startup.py /etc/startup.sh |
/usr/bin/python /etc/startup.py /etc/startup.sh
Thats it. Done!!! Now you’ll experience a boost of about 25-30 seconds of decrease in boot time.
Stats of my machine
With all services started in normal order : 2minutes.
With Hack #1 : 1minute 42 seconds.
With Hack #2 : 1minute.
Warning : These hacks may break your system and can make it unusable. Use at your own risk.