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
No comments:
Post a Comment