系统初始化过程
系统初始化过程是指从INIT进程成功启动,一直到系统启动并弹出登录提示之间的过程。当INIT进程成功启动后,它会根据配置文件/etc/inittab中的设置初始化系统,这个过程主要完成的工作有:重新挂载文件系统、运行系统需要的进程和服务等。
一、INIT进程的配置文件
INIT进程的配置文件是/etc/inittab,这个配置文件会引导INIT进程初始化系统,开启必要的进程、服务等。
查看inittab内容如下:
[root@localhost ~]# cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # #设置系统默认的运行级别 id:5:initdefault: #初始化系统脚本 # System initialization. si::sysinit:/etc/rc.d/rc.sysinit #启动系统服务 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 #定义Ctrl+Alt+Delete键的作用 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now #设置电源选项 # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" #启动终端 # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty 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 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon
上面的有效行都有一个共同的格式,即使用冒号“:”将4个不同的字段分隔开。查看man手册可以看到每一行的格式如下:
id:runlevels:action:process
id:配置行在配置文件中的标识符,最长可以由4个字符组成。对于大多数文本行来说,这个字段没有太大的意义,但要求每行的id值在该文件中是唯一的。
runlevels:配置行起作用的运行级别列表。如果作用于多个运行级别,可以将其写在一起。
action:配置应该执行的动作。通常有initdefault、sysinit、wait、ctrlaltdel、powerfail、powerokwait和respawn这几个动作。
process:表示配置行要执行的脚本、命令及参数等内容。
二、设置系统默认的运行级别
在INIT进程配置文件的第1行,设置了系统的默认运行级别:
id:3:initdefault:
在这个配置行中,动作initdefault用于设置系统启动时的默认运行级别,即系统启动后将自动进入到运行级别。
在上面的这个示例中,系统运行级别是3.这表示系统启动后,将默认进入完全多用户模式。如果需要改变系统的默认运行级别,可以使用vi等编辑器修改该行中的runlevels字段值。需要注意到是此处设置的runlevels字段,只能使用一个运行级别。
注意:修改系统默认的运行级别时,注意不要将字段设置为0和6,否则系统将无法正常开机。如果黑客将此字段修改为0和6,通常我们将其视为拒绝服务式攻击(Denial of Service,简称DoS)。
三、初始化系统脚本
第2个有效行中用于指定系统的初始化脚本:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
上面这行中的runlevels字段为空,表示INIT将会忽略这一字段,并在每个运行级别都执行系统初始化脚本文件/etc/rc.d/rc.sysinit。
系统初始化脚本文件rc.sysinit是一个可执行文件,它是很重要的系统初始化文件。
四、启动系统服务
INIT进程使用rc.sysinit脚本对系统进行初始化之后,就会启动系统服务。
1、配置文件中的设置
在第3个到第9个有效行中,定义了系统在不同运行级别中需要执行的脚本:
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
上面这几行依次表示在0-6这几个运行级别下分别要执行的脚本、命令及参数。此处的动作全是wait,这表示INIT进程执行process字段定义的文件/etc/rc.d/rc时,需要等待rc执行完毕才能执行下一步操作。
2、启动服务脚本rc
查看配置文本中指定的文件/etc/rc.d/rc的文件类型:
[root@localhost ~]# file /etc/rc.d/rc
/etc/rc.d/rc: Bourne-Again shell script text executable
可以看出这其实是一个可执行的脚本文件:
[root@localhost ~]# cat /etc/rc.d/rc #! /bin/bash # # rc This file is responsible for starting/stopping # services when the runlevel changes. # # Original Author: # Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # set -m # check a file to be a correct runlevel script check_runlevel () { # Check if the file exists at all. [ -x "$1" ] || return 1 is_ignored_file "$1" && return 1 return 0 } # Now find out what the current and what the previous runlevel are. argv1="$1" set `/sbin/runlevel` runlevel=$2 previous=$1 export runlevel previous . /etc/init.d/functions # See if we want to be in user confirmation mode if [ "$previous" = "N" ]; then if [ -f /var/run/confirm ]; then echo $"Entering interactive startup" else echo $"Entering non-interactive startup" fi fi ...
从脚本的内容不难看出,这个文件的主要作用是接收运行级别参数,并启动对应的服务。需要启动的服务都保存在目录/etc/rc.d/rcN.d中(通常将这些目录称为运行级别目录),此处的N表示运行级别。
3、运行级别目录
查看运行级别目录:
[root@localhost ~]# ls /etc/rc.d/
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local
在上面的命令输出中,有7个目录rc0.d、rc1.d...rc6.d,这些目录就是运行级别目录。在这些目录中保存了相应的运行级别要启动的服务。
此处以运行级别3为例:
[root@localhost ~]# ls /etc/rc.d/rc3.d/ K02avahi-dnsconfd K89rdisc S25pcscd K02dhcdbd K99readahead_later S26apmd K02NetworkManager S02lvm2-monitor S26hidd ...
从上面的命令输出中可以看出,这个目录中的所有文件都是一个固定的格式。
- 文件名称开头的大写字母S和K分别代表start和kill,表示需要运行、关闭的服务。
- 后面的两位数字表示优先级。以S开头的服务,系统会按优先级从小到大都顺序启动,以K开头的服务则相反。
- 最后是服务名称。
注意:运行级别目录中的文件全部都是链接文件,这些链接文件的源文件也是一个脚本文件,这些脚本文件通常称为启动脚本。
五、重启快捷键
第10个有效行中,定义了重启快捷键:
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
由于runlevels字段为空,因此此处定义的内容将会在所有运行级别中生效。此行中的ctlaltdel表示按下Ctrl+Alt+Del组合键,其后的process字段中的命令表示系统将会在3分钟后重新启动系统。
六、UPS选项
UPS(Uninterruptible Power System,不间断电源)是一种能够维持服务器稳定运行的设备。当电源出现故障时,UPS能不间断、持续地提供一段时间的电力,以便让管理员有时间排除故障、切换后备电源或启动发电机等。
UPS最大的作用是当市电中断时,服务器可以使用UPS内置的电池继续运行。有些UPS还可以过滤市电杂波,保护硬件设备正常运行,最大限度地防止数据丢失。
在INIT进程配置文件的第11个、第12个有效行,就是用于设置电力故障及电力恢复时系统采取的措施:
# When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
第11个有效行中的powerfail表示当接收到UPS发来的失去电力的信号时,系统无论处于哪个运行级别,都会向在线用户发出关闭系统的信号,并在两分钟后关闭系统。当然也可以根据实际情况修改此行中的设置。
第12个有效行中的powerokwait表示当系统接收到UPS发来的电力恢复信号时,如果系统正处于运行级别1-5,将会取消关机执行,并向所有用户发送电力恢复的通知。
七、运行终端
INIT进程启动需要的服务、设置电源选项之后,就会运行虚拟终端。
(1)第13到第18个有效行定义了一些虚拟终端:
# Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty 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
上面的几个配置项表示运行级别2-5中,添加6个虚拟终端tty1-tty6.这几个配置项中的respawn表示终端如果结束,就需要立即重新启动它。当然如果系统不需要那么多终端,或需要更多的终端,管理员也可以修改此项设置。
(2)配置文件的最后一个有效行是运行图形终端:
# Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon
上面这个配置项表示如果系统处于运行级别5,就运行相应的图形终端。当图形终端退出时,配置项中断respawn会让INIT进程重新启动它。
完成上述步骤后,INIT进程就会运行/bin/login,弹出登录提示。至此系统就已经启动完成了,用户可以输入用户名和密码登录并使用系统。