LINUX INIT
--------------
This is the mother of all other userspace's processes.
Where to find it?
In the util-linux package (to be found at ftp.*.kernel.org) for simpleinit or in the sysvinit package for SysV init.
Probably also in [sunsite|metalab].unc.edu or ftp.debian.org
Title:
sysvinit and utilities
Version:
2.78
Entered-Date:
11FEB2000
Description:
This is the Linux System V init.
The source package has the debian build files included.
This version can be compiled with glibc 2.0.6 and up.
Author:
miquels@cistron.nl (Miquel van Smoorenburg)
Primary-Site:
sunsite.unc.edu /pub/Linux/system/daemons/init
109K sysvinit-2.78.tar.gz
Alternate-Site:
ftp.cistron.nl /pub/people/miquels/software
109K sysvinit-2.78.tar.gz
Alternate-Site:
ftp.debian.org /debian/dists/potato/main/source/base
108K sysvinit_2.78-X.tar.gz
Copying-Policy:
GPL
Keywords:
init shutdown halt reboot
End
ftp.debian.org:/debian/dists/potato/main/source/base/sysvinit_2.78-2.tar.gz
https://build.opensuse.org/package/files?package=sysvinit&project=YaST%3AWeb
Some properties:
#define VT_MASTER
"/dev/tty0"
/* Virtual console master */
#define CONSOLE
"/dev/console"
/* Logical system console */
#define SECURETTY
"/etc/securetty"
/* List of root terminals */
#define SDALLOW
"/etc/shutdown.allow"
/* Users allowed to shutdown */
#define INITTAB
"/etc/inittab"
/* Location of inittab */
#define INIT
"/sbin/init"
/* Location of init itself. */
#define NOLOGIN
"/etc/nologin"
/* Stop user logging in. */
#define FASTBOOT
"/fastboot"
/* Enable fast boot. */
#define FORCEFSCK
"/forcefsck"
/* Force fsck on boot */
#define SDPID
"/var/run/shutdown.pid"
/* PID of shutdown program */
#define SHELL
"/bin/sh"
/* Default shell */
#define SULOGIN
"/sbin/sulogin"
/* Sulogin */
#define INITSCRIPT
"/etc/initscript"
/* Initscript. */
#define PWRSTAT_OLD
"/etc/powerstatus"
/* COMPAT: SIGPWR reason (OK/BAD) */
#define PWRSTAT
"/var/run/powerstatus"
/* COMPAT: SIGPWR reason (OK/BAD) */
#if 0
#define INITLVL
"/etc/initrunlvl"
/* COMPAT: New runlevel */
#define INITLVL2
"/var/log/initrunlvl"
/* COMPAT: New runlevel */
/* Note: INITLVL2 definition needs INITLVL */
#define HALTSCRIPT1
"/etc/init.d/halt"
/* Called by "fast" shutdown */
#define HALTSCRIPT2
"/etc/rc.d/rc.0"
/* Called by "fast" shutdown */
#define REBOOTSCRIPT1
"/etc/init.d/reboot" /* Ditto. */
#define REBOOTSCRIPT2
"/etc/rc.d/rc.6"
/* Ditto. */
- It exits if UID is != 0 (root)
- It exits if PID != 1 (the first process in Kernel's userspace)
- It check command-line args:
"single", "-s" : dfl_level is set to 'S'
"-a", "auto" : set environment "AUTOBOOT=YES"
"-b", "emergency" : emerg_shell = 1
"-z" : ignore -z xxxx
any of [0-9],[sS] : dfl_level is set accordingly to that level
- set default environment PATH to "/sbin:/usr/sbin:/bin:/usr/bin"
- say "@(#) init version 2.89 DATE 26-Mar-2010 miquels@cistron.nl booting" into syslog
- spawn/fork to emergency shell if emerg_shell == 1
- read inittab and configure setting based on the settings stored in INITTAB
init.c: main() ---> setproctitle()
|
|
V
init_main() ----------------------------> read_inittab()
| | |
| | |
| | V
| | init_reboot(BMAGIC_SOFT)
| |
| |
| V
| ioctl(f, KDSIGACCEPT, SIGWINCH): tell kernel SIGACCEPT
|
+---> set a bunch of signals' flags
|
+----> console_init(), open /dev/CONSOLE (or otherwise if specified in env "CONSOLE") for O_RDONLY
|
+----> console_stty() : Set terminal settings to reasonable defaults
|
+----> set default environment PATH to "/sbin:/usr/sbin:/bin:/usr/bin"
|
loop forever by doing this stuf:
1) boot transitions
2) Read from the init FIFO by calling check_init_fifo():
2.1) try to create /dev/initctl if not present.
2.2) If /dev/initctl is open, stat the file to see if it is still the _same_ inode
2.3) try to open /dev/initctl
2.4) Read data from the pipe, return on EINTR
2.5) console_init
2.6) process requests (e.g., runlevel change request, power fail request, set env)
3) check the 'failing' flags
4) process any signal:
4.1) SIGPWR event/signal
4.2) SIGINT
4.3) SIGWINCH
4.4) SIGALRM
4.5) SIGCHLD
4.6) SIGHUP
5) See whether we need to start up (again)
BOOT TRANSITION FSM
--------------------
'#' (SYSINIT) --+-----> '*' (BOOT) ------> (NORMAL)
| ^
| |
newlevel=='S'| | !did_boot && newlevel != 'S'
| |
+-----> 'S' (INIT)
^
|
|
start here