系统初始化过程

系统初始化过程是指从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,弹出登录提示。至此系统就已经启动完成了,用户可以输入用户名和密码登录并使用系统。

原文地址:https://www.cnblogs.com/nufangrensheng/p/3477783.html