Real World Mac Maintenance and Backups
The init Process and/etc/inittab File
When a Linux system is booted, the first process that the kernel starts is /sbin/init. It is always process id (PID) 1 and has a parent process id (PPID) of 0. The init process is always running. root 1 0 0 14:05 ? 00:00:08 init [3]
The /etc/inittab file is the configuration file for /sbin/init. /etc/inittab identifies the processes that init starts, and it can be customized as desired. Few environment variables are set when a process is started by init. The inittab lines have four colon-separated fields: <id>:<runlevels>:<action>:<command>
Let's look at the meaning of each.
See the inittab(8) man page for the complete list of inittab action keywords and a more detailed example of the /etc/inittab file. The following is a typical /etc/inittab file from a SUSE 9.0 system. The lines controlling startup and shutdown are bolded. # # /etc/inittab # # Copyright (c) 1996-2002 SuSE Linux AG, Nuernberg, Germany. All rights # reserved. # # Author: Florian La Roche, 1996 # Please send feedback to http://www.suse.de/feedback # # This is the main configuration file of /sbin/init, which # is executed by the kernel on startup. It describes what # scripts are used for the different runlevels. # # All scripts for runlevel changes are in /etc/init.d/. # # This file may be modified by SuSEconfig unless CHECK_INITTAB # in /etc/sysconfig/suseconfig is set to "no" # # The default runlevel is defined here id:5:initdefault: # First script to be executed, if not booting in emergency (-b) mode si::bootwait:/etc/init.d/boot # /etc/init.d/rc takes care of runlevel handling # # runlevel 0 is System halt (Do not use this for initdefault!) # runlevel 1 is Single user mode # runlevel 2 is Local multiuser without remote network (e.g. NFS) # runlevel 3 is Full multiuser with network # runlevel 4 is Not used # runlevel 5 is Full multiuser with network and xdm # runlevel 6 is System reboot (Do not use this for initdefault!) # l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 #l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # what to do in single-user mode ls:S:wait:/etc/init.d/rc S ~~:S:respawn:/sbin/sulogin # what to do when CTRL-ALT-DEL is pressed ca::ctrlaltdel:/sbin/shutdown -r -t 4 now # special keyboard request (Alt-UpArrow) # look into the kbd-0.90 docs for this kb::kbrequest:/bin/echo "Keyboard Request -- edit /etc/inittab to let this work." # what to do when power fails/returns pf::powerwait:/etc/init.d/powerfail start pn::powerfailnow:/etc/init.d/powerfail now #pn::powerfail:/etc/init.d/powerfail now po::powerokwait:/etc/init.d/powerfail stop # for ARGO UPS sh:12345:powerfail:/sbin/shutdown -h now THE POWER IS FAILING # getty-programs for the normal runlevels # <id>:<runlevels>:<action>:<process> # The "id" field MUST be the same as the last # characters of the device (after "tty"). 1:2345:respawn:/sbin/mingetty --noclear tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 co:2345:respawn:/sbin/agetty -h -t 60 ttyS0 9600 vt102 # #S0:12345:respawn:/sbin/agetty -L 9600 ttyS0 vt102 # # Note: Do not use tty7 in runlevel 3, this virtual line # is occupied by the programm xdm. # # This is for the package xdmsc; after installing and # and configuration you should remove the comment character # from the following line: #7:3:respawn:+/etc/init.d/rx tty7 # modem getty. # mo:235:respawn:/usr/sbin/mgetty -s 38400 modem # fax getty (hylafax) # mo:35:respawn:/usr/lib/fax/faxgetty /dev/modem # vbox (voice box) getty # I6:35:respawn:/usr/sbin/vboxgetty -d /dev/ttyI6 # I7:35:respawn:/usr/sbin/vboxgetty -d /dev/ttyI7 # end of /etc/inittab Up2p::respawn:/opt/uptime2/bin/uptime2+ Up2r::respawn:/opt/uptime2/lbin/Uptime2+.Restart
Startup in Multiuser Mode
Let's look at the inittab lines that affect startup in multiuser mode. The first noncomment line in inittab tells init the runlevel to move the system to at boot up. For example: id:5:initdefault:
If the initdefault line is missing, the boot process pauses with a console prompt asking for the runlevel to be specified before continuing. The inittdefault line typically specifies runlevel 3 or 5. The second non-comment line in inittab is probably the system initialization script or boot script. This script sets up the console, mounts filesystems, sets kernel parameters, and so on. In Red Hat 9.0, the line is: si::sysinit:/etc/rc.d/rc.sysinit
For SUSE 9.0, it is: si::bootwait:/etc/init.d/boot
The Red Hat boot script, /etc/rc.d/rc.sysinit, is a top-down script compared to SUSE's /etc/init.d/boot script. The SUSE script executes the scripts in /etc/init.d/boot.d/ to set up most system needs. You can get an idea of what gets done by looking at a listing of the boot.d directory. The boot.d directory consists of symbolic links to scripts in /etc/init.d. #ll /etc/init.d/boot.d total 9 lrwxrwxrwx 1 root root 12 Jul 6 12:19 S01boot.proc -> ../boot.proc lrwxrwxrwx 1 root root 12 Jul 6 12:20 S01setserial -> ../setserial lrwxrwxrwx 1 root root 10 Jul 6 12:20 S03boot.md -> ../boot.md lrwxrwxrwx 1 root root 11 Jul 6 12:20 S04boot.lvm -> ../boot.lvm lrwxrwxrwx 1 root root 15 Jul 6 12:20 S05boot.localfs -> ../boot.localfs lrwxrwxrwx 1 root root 14 Jul 6 12:20 S06boot.crypto -> ../boot.crypto lrwxrwxrwx 1 root root 19 Jul 6 12:20 S07boot.loadmodules -> ../boot.loadmodules lrwxrwxrwx 1 root root 27 Jul 6 12:20 S07boot.restore_permissions -> ../boot.restore_permissions lrwxrwxrwx 1 root root 12 Jul 6 12:20 S07boot.scpm -> ../boot.scpm lrwxrwxrwx 1 root root 12 Jul 6 12:20 S07boot.swap -> ../boot.swap lrwxrwxrwx 1 root root 13 Jul 6 12:20 S08boot.clock -> ../boot.clock lrwxrwxrwx 1 root root 14 Jul 6 12:20 S08boot.idedma -> ../boot.idedma lrwxrwxrwx 1 root root 16 Jul 6 12:20 S09boot.ldconfig -> ../boot.ldconfig lrwxrwxrwx 1 root root 14 Jul 6 12:20 S10boot.isapnp -> ../boot.isapnp lrwxrwxrwx 1 root root 16 Jul 6 12:20 S10boot.localnet -> ../boot.localnet lrwxrwxrwx 1 root root 13 Jul 6 12:20 S10boot.sched -> ../boot.sched lrwxrwxrwx 1 root root 16 Jul 6 12:20 S11boot.ipconfig -> ../boot.ipconfig lrwxrwxrwx 1 root root 12 Jul 6 12:20 S11boot.klog -> ../boot.klog If you have a SUSE distribution, you should read /etc/init.d/README, which further explains the SUSE boot strategy. The runlevels consist of a set of processes that start at each runlevel. The processes are started by the /etc/rc.d/rc script. In SUSE, the rc.d directory is a symbolic link to /etc/init.d. The rc script is explained further in the next section. The /etc/inittab file includes lines similar to the following to start the services for runlevels 0 through 6. Remember, the second field specifies the runlevel at which the line is executed. The following is from a Red Hat 9.0 system: l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 After the rc scripts finishes, the Linux startup is complete. The /etc/inittab file includes other lines to run getty processes, handle the powerfail condition, and so on. The lines that affect system startup and shutdown are those that run the /etc/rc.d/rc script. The runlevel can be changed after boot up as well. The root user can move Linux to a different runlevel. The telinit command can be used to tell init to move to a new run-level. For example, the command telinit 5 tells init to move to runlevel 5. The telinit command is just a link to init: #ls -al /sbin/telinit lrwxrwxrwx 1 root root 4 Nov 6 2003 /sbin/telinit -> init
Looking at the previous /etc/inittab entries, we can see that the command telinit 5 causes init to execute /etc/rc.d/rc 5. The 5 argument tells /etc/rc.d(or init.d)/rc what runlevel scripts to execute. The telinit command can also make init look for changes in /etc/inittab. The syntax is telinit q. See the telinit(8) man page for further details. init errors
If the console shows errors such as the following, init has detected a problem while running a command from /etc/inittab. INIT: Id "db" respawning too fast: disabled for 5 minutes
In this example, the message corresponds to the following line in /etc/inittab: db:345:respawn:/usr/local/bin/dbmon
Remember that the respawn keyword in /etc/inittab means that init restarts any command whose process terminates. The previous message means init ran the command ten times, but the command keeps terminating, so init is giving up. After the problem with the command is fixed, run telinit u to make init try again, or run telinit q if changes have been made to /etc/inittab. The init process logs its messages using the syslog facility,[3] and by default you can find init messages in the /var/log/messages file. The following is a sample message: Dec 30 10:40:29 sawnee init: Re-reading inittab |