第7章 系统启动初始化
本章主要内容
● 系统启动概述。
● 系统启动过程。
Linux系统的启动分多个阶段进行,每个阶段都完成不同的任务。在其启动过程的每个阶段,都是在继承上阶段的工作后完成自己的工作。
Linux系统的启动由GRUB多重开机引导程序引导,它负责引导的阶段包括引导加载程序启动、内核映像加载和init进程初始化这三个阶段,在系统的启动过程中每个阶段都不能中断。
7.1 系统启动概述
Linux系统的启动主要由4个阶段组成,分别是BIOS加电自检、引导加载程序、内核映像加载和init进程初始化,如图7-1所示。
图7-1 系统启动的过程
对于启动的每个阶段,其都是继承上一个阶段的工作,然后接着来完成属于自己的工作,之后再交给下一个阶段继续来完成。
从系统启动进入引导加载程序(boot loader)开始到执行系统第一个进程init 的这段时间里,这些启动操作都是由多重开机管理程序(GRand Unified Bootloader,GRUB)来负责管理的。也就是说,除BIOS加电自检阶段之外,其他的三个阶段都在GRUB的管理范围内,如图7-2所示。
图7-2 GRUB管理的范围
1.BIOS加电自检
计算机通电后,BIOS(Basic Input Output System,基本输入输出系统)将对计算机硬件设备进行检查。接着进入启动盘的第一个块中最开始处只有512 字节的MBR(Master Boot Record,主引导记录)区,并将MBR中的引导加载程序加载到内核中,交由引导加载程序执行。
2.引导加载程序启动
引导加载程序(boot loader)将查找加载到内核中的MBR主引导加载程序和次引导程序,在次引导加载程序被主引导加载程序启动后,Linux的内核就加载,此时就启动GRUB多项菜单图形引导界面,之后将控制权交给内核映像。
3.内核映像加载
Linux 内核映像获得控制权后,接着将对自身进行解压缩,然后将系统的核心程序加载到内存中,同时初始化与文件系统有关的虚拟设备,并在这些设备完好的情况下就执行/sbin/init文件来启动第一个系统进程——init进程。
4.Init进程初始化工作
Init进程通过调用/etc/rc.d/rc.sysinit和/etc/rc.d/rc*.d目录中的程序进行初始化,并启动特定的运行级别。Init 进程是所有进程的发起者和控制者,其不会自动终止。系统的其他进程参照 init产生并受到init 过程的控制。
7.2 系统启动过程
Linux 操作系统的启动主要是由 4 个阶段组成,其中 GRUB 就负责三个阶段的启动管理工作,系统的每个启动阶段都完成不同的任务,且这些阶段所未完成的工作总由下一个阶段来完成。
在这4个阶段中,从MBR载入引导加载程序到系统执行/sbin/init 文件都是由 GRUB负责的。如图7-3所示的是RHEL4的GRUB引导界面。
图7-3 RHEL4的GRUB引导界面
自Linux内核被加载后就启动GRUB多菜单选项图形引导界面,但在默认情况下该界面是隐藏的,因此开机之后出现图7-3所示的界面时按任何键就可以看到隐藏的GRUB多菜单选项图形引导界面,如图7-4所示,这时就可以用键盘的上下键来选取某个菜单引导开机。
图7-4 多个开机菜单
7.2.1 BIOS加电自检
计算机上电后,首先进行计算机硬件设备的检查,即所说的BIOS 加电自检(Power On Self Test,POST)。主要包括初始化组件、检测硬件、分配资源、协助加载操作系统等以及选择开机的引导设备。
BIOS 为Base Input Output System(基本输入输出系统)的缩写,是非常基本的硬件和软件接口,其为系统的成功启动提供最基本的机制。如当电源接通的瞬间,由 BIOS 负责检测与所有硬件的沟通并将计算机呈现在用户面前。
在选择开机引导设备之后,接着将读取硬盘上的MBR(Master Boot Record,主引导记录)中的引导加载程序,并将引导程序加载到内存中。此时 BIOS 将控制权移交给引导加载程序,由后者接着引导系统的启动。如图7-5所示,这是一张已安装操作系统且有三个分区的IDE硬盘,而在这块硬盘的最开始处有一个包含引导程序、分区信息等大小为512字节的MBR区,如图7-6所示。
图7-5 硬盘上的分区结构
图7-6 MBR的位置及存储的信息
温馨提示:MBR不属于任何一个操作系统,它负责磁盘操作系统(Disk Operating System, DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由DOS在对硬盘进行初始化时产生,不能用操作系统提供的磁盘操作命令来读取它。
7.2.2 引导加载程序启动
BIOS 完成自检之后,将进入引导加载程序的启动。启动分为两个阶段,首先加载保存在 MBR区中的主引导程序。MBR 区中的主引导加载程序包括二进制代码和一个小分区。其主要任务是加载和执行次引导加载程序,通过它来查找并进行引导加载程序的第二次启动。
主引导程序完成加载后,接着进入次引导加载程序,次引导程序也称内核加载程序,其主要任务是加载Linux内核。
当次引导程序被加载到内核中后,将启动GRUB的图形引导界面(如图7-3及图7-7所示),继续系统的启动引导工作。
图7-7 具有多个启动项的GRUB
在默认情况下,GRUB引导加载程序会在 5 秒后将自动读取其配置文件/boot/grub/grub.conf文件下的配置信息,并根据配置信息来启动引导系统。
GRUB配置文件grub.conf的内容如下所示。
# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root = /dev/sda2
# initrd /initrd-version.img
#boot = /dev/sda
default = 0
timeout = 5
splashimage = (hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Enterprise (2.6.9-42.0.0.0.1.ELhugemem)
root (hd0,0)
kernel /vmlinuz-2.6.9-42.0.0.0.1.ELhugemem ro root = LABEL = / rhgb quietinitrd /initrd-2.6.9-42.0.0.0.1.ELhugemem.img
title Enterprise-smp (2.6.9-42.0.0.0.1.ELsmp)
root (hd0,0)
kernel /vmlinuz-2.6.9-42.0.0.0.1.ELsmp ro root = LABEL = / rhgb quiet
initrd /initrd-2.6.9-42.0.0.0.1.ELsmp.img
title Enterprise-up (2.6.9-42.0.0.0.1.EL)
root (hd0,0)
kernel /vmlinuz-2.6.9-42.0.0.0.1.EL ro root = LABEL = / rhgb quiet
initrd /initrd-2.6.9-42.0.0.0.1.EL.img
系统在读取/boot/grub/grub.conf 文件的配置后,就根据配置的内容来依次引导系统启动,一下是各项的关键字的说明。
(1)default:其值指定使用哪组内核来引导系统,默认值为 0,表示使用第一组内核启动,而当其值为1时,则表示使用第二组内核启动。
(2)timeout:此关键字的值用于设置GRUB停留的时间,默认值为5,并以倒计时的方式进行计时,若在5秒内无任何操作,系统将按默认配置启动。
(3)多个启动引导选项和背景设置,其配置内容如下。
splashimage = (hd0,0)/grub/splash.xpm.gz
hiddenmenu
splashimage用于指定开机背景图案,其中hd0,0即表示/boot,其意思是说,开机背景图案存放在/boot/grub/目录下的splash.xpm.gz文件中。
hiddenmenu 设定是否要隐藏 grub 的开机菜单,在默认的配置下是以倒计时的方式并使用默认引导选项启动。当在“hiddenmenu”行前加上“#”时,将出现如图7-7所示的多个启动项。
(4)引导选单配置信息。
title Enterprise (2.6.9-42.0.0.0.1.ELhugemem)
root (hd0,0)
kernel /vmlinuz-2.6.9-42.0.0.0.1.ELhugemem ro root = LABEL = / rhgb quiet
initrd /initrd-2.6.9-42.0.0.0.1.ELhugemem.img
● title 关键字表示一个新菜单项的开始。在系统进入GRUB 引导界面时,关键字title 后面的内容将显示在GRUB菜单上(如图7-8所示)。若第一个引导菜单的关键字title被删除,那么其后的内容不再显示,而下一条title将作为第一个菜单出现,如图7-9所示。
图7-8 关键字title后的内容
图7-9 菜单移到最前面
● root 关键字用于指定引导目录所在分区位置,root 关键字后的(hd0,0)表示根分区的位置,它表示根分区位于第一个硬盘的第一个分区。其中,hd0表示第1个硬盘,而逗号后的0则表示这个硬盘上的第一个分区。
● kernel:指定用传递的选项引导内核的路径。其中,“vmlinuz-2.6.9-42.0.0.0.1.ELhugemem”是存放在(hd0,0)中的内核,也就是在/boot 目录下;“ro root = LABEL = /”中的ro 表示只读(read only),其整个含义则是以只读方式挂载根目录到“/”目录下;“rhgb quiet”表示在启动过程显示图形界面(如图7-10所示)。当将其删除时系统启动过程就以文本的方式显示出来(如图7-11所示)。
图7-10 图形界面启动过程
图7-11 文本界面启动过程
● initrd 关键字是用于建立一个内存磁盘,该磁盘存放的主要是一些启动程序。
至此,引导加载程序完成系统启动前的加载,之后它就将控制权交给内核映像,由内核映像接着完成系统的启动引导。
7.2.3 内核映像加载
GRUB完成启动加载程序的启动,并将控制权交给内核,之后,获得控制权的内核首先检查计算机的内存、风扇及硬件等设备并初始化配置。接着是对 GRUB 加载到内存下的一个小于512KB的zImage的压缩映像,或一个大于512KB的bzImage压缩映像进行自身的解压缩(就是对内核进行初始化),同时加载必要的设备驱动程序,之后才对根文件系统进行挂载,如图7-12所示。
图7-12 内核初始化流程
内核映像引导加载的时间虽然短,但其所完成的工作非常重要(由于内核的部分初始化特征由交叉运行的子系统组成,因此由始至终跟踪子系统的初始化而不被打断)。在显示“Welcome to Enterprise Linux”的提示信息时(如图7-13所示),此时系统已经完成内核映像的加载。
图7-13 内核加载完成后启动系统进程
7.2.4 init进程初始化
在完成内核镜像的引导后,系统首先执行/sbin/init 文件来启动其第一个系统级的进程——init进程,同时内核将控制权移交给init进程,由其完成系统的最终启动引导,并启动登录Linux系统的窗口。
Linux系统的init进程是系统中所有进程的发起者和控制者(其进程ID为1),在系统启动后它不会终止,除非受到外界的干扰(如断电、硬件故障等),而且在必要时,系统将调用fork()函数并复制其相关参数来创建新的子进程。
从内核获得控制权的init进程,其将控制整个系统并根据需要开始创建新的子进程。init进程首先读取/etc/inittab文件中的配置参数,并根据/etc/inittab文本中设定的参数来逐步完成系统的初始化工作。
以下是/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
# 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
在/etc/inittab 文件的定义中,系统共定义了0~6这7 个运行级别(run level)并给出了相关说明。表7-1是这7个运行级别功能的描述。
表7-1 系统的7个运行级别及说明
init 进程的初始化分为以下几个步骤。
(1)init进程获取控制权后,首先读取/etc/inittab文件,并根据文件中“id:5:initdefault:”这行设置信息参数,从而启动系统运行级别,默认情况下启动X11进程。
Linux系统使用哪个运行级别由init进程来定义,该进程可以通过3种方式来选择使用哪个运行级别:
● 通过读取在/etc/inittab 文件中预设的“id:5:initdefault:”;
● 从引导加载程序传递参数到内核后获取,即在GRUB引导界面中修改内核参数后,并传递到内核被init进程捕获;
● 在开机并登录系统后,通过传递到内核中执行的init c 命令获取;
(2)接着init进程就执行/etc/rc.d目录下rc.sysinit的shell脚本程序来对系统进一步初始化,该文件的内容如下:
[root@cat ~]# cat /etc/rc.d/rc.sysinit
#!/bin/bash
#
# /etc/rc.d/rc.sysinit- run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#
HOSTNAME=`/bin/hostname`
HOSTTYPE=`uname-m`
unamer=`uname-r`
set-m
if [-f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [-z "$HOSTNAME"-o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
if [ !-e /proc/mounts ]; then
mount-n-t proc /proc /proc
mount-n-t sysfs /sys /sys >/dev/null 2>&1
fi
if [ !-d /proc/bus/usb ]; then
modprobe usbcore >/dev/null 2>&1 && mount-n-t usbfs /proc/bus/usb /proc/bus/usb
else
mount-n-t usbfs /proc/bus/usb /proc/bus/usb
fi
. /etc/init.d/functions
# Check SELinux status
selinuxfs="$(fstab_decode_str `LC_ALL=C awk '/ selinuxfs / { print $2 }' /proc/mounts`)"
SELINUX_STATE=
if [-n "$selinuxfs" ] && [ "`cat /proc/self/attr/current`" != "kernel" ]; then
if [-r "$selinuxfs/enforce" ] ; then
SELINUX_STATE=`cat "$selinuxfs/enforce"`
else
#assume enforcing if you can't read it
SELINUX_STATE=1
fi
fi
if [-n "$SELINUX_STATE"-a-x /sbin/restorecon ] && LC_ALL=C fgrep-q " /dev " /proc/mounts ; then
/sbin/restorecon-R /dev 2>/dev/null
fi
disable_selinux() {
echo $"*** Warning-- SELinux is active"
echo $"*** Disabling security enforcement for system recovery."
echo $"*** Run 'setenforce 1' to reenable."
echo "0" > "$selinuxfs/enforce"
}
…‥
/etc/rc.d/rc.sysinit文件的主要工作流程如下所示。
① 启动热插拨设备(如USB 等设备)和SELinux(Security Enhanced Linux)。
② 把在初始化内核时得到的相关参数写入保存系统相关设置的/etc/sysctl.conf 文件中(当使用sysctl命令来变更系统的参数时,这些变更的参数将永久性保存到/etc/sysctl.conf文件中);
③ 设定并初始化系统的时钟。
④ 初始化键盘参数(在系统启动后键盘就可以使用,而且所对应的键位上的相关符号没有出现错误的现象,这是由于计算机预先载入键盘的设置信息)。
⑤ 启动系统虚拟内存分区,即交换分区(Swap 分区);
⑥ 从/etc/sysconfig/network 文件中读取参数来设置计算机主机名,该文件是一个正文文件,其设置内容如下。
[root@cat ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=cat.super.com
GATEWAY=192.168.217.1
如果要更改计算机的主机名,需要同时更改/etc/hosts和/etc/sysconfig/network文件的参数,或在图形系统下依次选择Applications→System→Network打开Network Configuration图形窗口来设置(或在图形系统的终端界面下执行neat命令)。/etc/hosts文件的配置信息如下所示。
[root@rh5 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 cat.super.com cat localhost.localdomain localhost
⑦ 在开机前root文件系统(即根目录)是以只读的方式挂载的,在init 进程获取控制权后它会对root文件系统进行检查,并在无误的情况下将其以可读、可写的状态重新挂载。可执行mount命令查看系统挂载了哪些文件系统。
[root@rh5 ~]# mount
/dev/sda3 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/sda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /proc/fs/vmblock/mountPoint type vmblock (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
⑧ 启动RAID和LVM设备,并把相关参数读入磁盘进行相关限制设定,以避免某个用户对磁盘空间的过度使用。
⑨ 检查/etc/fstab 文件的设置参数,并根据设置的参数挂载其他文件系统。/etc/fstab 文件的内容如下:
[root@rh5 ~]# cat /etc/fstab
# This file is edited by fstab-sync- see 'man fstab-sync' for details
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,managed 0 0
/dev/fd0 /media/floppy auto pamconsole,exec,noauto,managed 0 0
⑩ 清除开机时所使用的临时文件并对一些无用的文件和目录进行删除。
(3)由于系统在默认模式下使用运行级别 5 来启动,因此接着 init进程将读取“5”这个参数,并将此参数传到/etc/rc.d/rc5(如图7-14所示)以便决定在该模式下需要启动哪些服务,实际上,就是执行/etc/rc.d/rc 5.d目录下的所有程序,如下是/etc/rc.d/rc 5.d 目录的内容。
图7-14 系统级别的定义
[root@cat ~]# ls-l /etc/rc.d/rc5.d/
total 412
lrwxrwxrwx 1 root root 24 Jul 6 23:02 K02NetworkManager-> ../init.d/NetworkManager
lrwxrwxrwx 1 root root 14 Jul 6 23:35 K05innd-> ../init.d/innd
lrwxrwxrwx 1 root root 19 Jul 6 23:01 K05saslauthd-> ../init.d/saslauthd
lrwxrwxrwx 1 root root 19 Jul 6 23:03 K10dc_server-> ../init.d/dc_server
lrwxrwxrwx 1 root root 16 Jul 6 23:02 K10psacct-> ../init.d/psacct
lrwxrwxrwx 1 root root 17 Jul 6 23:34 K10radiusd-> ../init.d/radiusd
lrwxrwxrwx 1 root root 19 Jul 6 23:03 K12dc_client-> ../init.d/dc_client
lrwxrwxrwx 1 root root 17 Jul 6 23:22 K12FreeWnn-> ../init.d/FreeWnn
lrwxrwxrwx 1 root root 17 Jul 6 23:23 K12mailman-> ../init.d/mailman
lrwxrwxrwx 1 root root 15 Jul 6 23:03 K15httpd-> ../init.d/httpd
lrwxrwxrwx 1 root root 20 Jul 6 23:23 K20bootparamd-> ../init.d/bootparamd
lrwxrwxrwx 1 root root 24 Jul 6 23:33 K20netdump-server-> ../init.d/netdump-server
lrwxrwxrwx 1 root root 13 Jul 6 23:02 K20nfs-> ../init.d/nfs
lrwxrwxrwx 1 root root 16 Jul 6 23:23 K20rstatd-> ../init.d/rstatd
lrwxrwxrwx 1 root root 17 Jul 6 23:23 K20rusersd-> ../init.d/rusersd
lrwxrwxrwx 1 root root 15 Jul 6 23:23 K20rwhod-> ../init.d/rwhod
lrwxrwxrwx 1 root root 14 Jul 6 23:02 K24irda-> ../init.d/irda
lrwxrwxrwx 1 root root 15 Jul 6 23:03 K25squid-> ../init.d/squid
lrwxrwxrwx 1 root root 13 Jul 6 23:25 K28amd-> ../init.d/amd
lrwxrwxrwx 1 root root 22 Jul 6 23:07 K30spamassassin-> ../init.d/spamassassin
lrwxrwxrwx 1 root root 18 Jul 6 23:32 K34dhcrelay-> ../init.d/dhcrelay
lrwxrwxrwx 1 root root 19 Jul 6 23:35 K34yppasswdd-> ../init.d/yppasswdd
lrwxrwxrwx 1 root root 21 Jul 6 23:23 K35cyrus-imapd-> ../init.d/cyrus-imapd
lrwxrwxrwx 1 root root 15 Jul 6 23:32 K35dhcpd-> ../init.d/dhcpd
lrwxrwxrwx 1 root root 13 Jul 6 23:03 K35smb-> ../init.d/smb
lrwxrwxrwx 1 root root 19 Jul 6 23:04 K35vncserver-> ../init.d/vncserver
lrwxrwxrwx 1 root root 17 Jul 6 23:35 K35winbind-> ../init.d/winbind
lrwxrwxrwx 1 root root 16 Jul 6 23:32 K36dhcp6s-> ../init.d/dhcp6s
lrwxrwxrwx 1 root root 14 Jul 6 23:18 K36lisa-> ../init.d/lisa
lrwxrwxrwx 1 root root 16 Jul 6 23:24 K36mysqld-> ../init.d/mysqld
lrwxrwxrwx 1 root root 20 Jul 6 23:24 K36postgresql-> ../init.d/postgresql
…‥
(4)在init进程完成定义系统运行级别、挂载其他文件系统和执行运行级别进程后,接下来它继续读取/etc/inittab 文件中的“ca::ctrlaltdel:/sbin/shutdown–t3–r now”这行参数来设置系统关机的组合键 ctrlaltdel(即 Ctrl+Alt+Delete),在使用这个组合键时,系统就执行/sbin 目录下的shutdown命令进行关机。
(5)接下来init 进程的工作是为系统定义UPS(Uninterrupted Power Supply,不间断电源)的功能,UPS负责在外部电源停止供电后为Linux 系统在短期内提供有限的电量,使得系统可将必要的数据写到磁盘中,以避免数据的丢失,之后调用 shutdown 来关机,如图7-15中第一行所示。
图7-15 UPS功能定义
而第二行所定义的功能是:若在非常短的时间内电源恢复正常的供电,UPS 将使用shutdown–c 来取消关机操作。
(6)init 进程在/etc/inittab 文件中的最后一项初始化任务是执行/sbin/mingetty 命令来创建6个虚拟终端,即tty1~tty6(如图7-16所示)。
图7-16 虚拟终端
最后,系统将根据/etc/inittab 中设定的运行级别(即run levels 5)来初始化X Window用户环境,也就是启动X11的图形系统,如图7-17中的最后一行所示。
图7-17 初始化登录环境
到此,Linux的启动完成,这时将看到图形登录界面。
当阅读到这里时,相信读者应该知道,使用init 0将关闭系统而init 6可以对系统进行重启。