本文介绍了linux系统开机引导与关机过程的相关内容,系统必须检查并安装文件系统,而且系统的守护进程必须启动起来,这些步骤是由init 进程按顺序运行一系列shell 脚本来管理的。
linux开机引导过程与关机过程详解 第二部分。
5.1 init 和运行级
传统的init 定义了7个运行级(run level),每一个级别都代表系统应该补充运行的某些特定服务:
(1)0级是完全关闭系统的级别
(2)1级或者S级代
表单用户模式
(3)2-5 级 是多用户级别
(4)6级 是 重新引导的级别
0级和6级比较特殊,因为系统实际上不能留在这两个级别里,进入这两个级别的效果是关闭系统或者重新引导系统。 在大多数系统上,正常的多用户运行级别是2或者3级。运行级别5 经常用于X windows的登陆进程,比如xdm. 运行级别4很少用,运行级别1和S 的定义在每种系统上是不同的。
单用户模式传统上是init的级别1. 它关闭所有的多用户和远程登陆进程,确保系统运行在最小软件组合的模式下。 不过, 由于单用户模式提供对系统的超级用户访问权限,因此只要引导系统进入到单用户模式,管理员都要让系统提示用户输入root口令。 创建S运行级是为了解决下面的需要:它产生一个进程提示输入root的口令。 在Linux上,这一级别只是用来提示输入root的口令,而它本身并不是最终的运行目的。
/etc/inittab 文件告诉init 在它的每个级别上要做什么事情。 它的格式随系统的不同而异,但基本思想是:inittab 规定了系统进入到每一级别时要运行(或者要保持运行)的命令。
在机器引导时,init 从运行级0开始,一级一级往上运行到在/etc/inittab中所设置的默认运行级别。 为了完成在每一对相邻运行级别之间的过渡,init 运行在/etc/inittab中为这种过度而说明的一些操作。 当机器关闭时,以相反的顺序执行同样的处理过程。
遗憾的是,inittab 文件语义有点儿不那么完善,为了把inittab 文件的功能能映射成为某种更为灵活的形式,Linux 系统实现了另一层抽象,它通常采用“改变运行级”脚本的形式(通常为/etc/init.d/rc),由inittab来调用。 这一脚本接下来执行位于与运行级有关的目录下的其他脚本,从而把系统带入到新的状态。
现在,大多数Linux发行版本模式启动到运行级别5,对于不需要运行X的
服务器来说,这个级别并不合适。 默认运行级别很容易修改。 直接修改/etc/inittab 文件中的 id: 5: initdefault 即可。
启动脚本的主拷贝位于/etc/init.d这个目录下。 每个脚本负责一个守护进程或者系统的某个特定方面。 这些脚本都认识参数start和stop. 从而知道他们所处理的服务是应该启动还是应该停止。 大多数脚本还是认识参数restart, 通常该参数等同于在stop 后面在接start。 作为系统管理员,要启动和停止各个服务,只要手工运行与之有关的init.d 脚本就可以了。
尽管/etc/init.d 中的脚本能够启动和停止各个服务,但是由init运行的主控制脚本需要知道其他一些信息,这些信息说明了要进入任何指定的运行级别需要运行哪些脚本,并带什么参数。 当主脚本把系统引入到一个新的运行级别时,它不是直接在init.d 目录下找,而是查找叫作reN.d 的目录,这个n 就是要进入运行级别的编号(如rc0.d,rc1.d).
在典型情况下,这些rcn.d 目录包含的符号链接都链接到了init.d 目录中的脚本上。 这些符号链接的名称都以S或者K开头,后跟一个数字以及该脚本所控制的服务名(如:S34named)。 当init从低级别向高的运行级别过度时,它按照数字递增的顺序运行所有以S开头的,带有start 参数的脚本。 当init 从高的运行级别向低的运行级别过度时,它按照数据递减的顺序运行所有以K(表示kill)开头的,带有参数stop 参数的脚本。
这一机制让系统管理员可以细粒度地控制启动服务的顺序。
5.2Red Hat 和Fedora 的启动脚本
Redhat 和Fedora 的启动脚本历来非常混乱,代码中包含有许多的解释。 在每个运行级别上,init都把新运行级别作为参数来调用脚本/etc/rc.d/rc。 /etc/rc.d/rc 一般运行在 正常模式下,在这种模式下,它只做自己的事情,它也可以运行在确认模式下,在这种模式下,它在运行每个单独的启动脚本以前询问用户。
Redhat 和Fedora 有一个chkconfig 命令来帮助用户管理服务。 这条命令可以在系统增删启动脚本,也可以管理这些脚本执行的运行级,还能列出一个脚本目前为哪些运行级别做了配置。
Redhat 还有一个rc.local脚本。 该脚本是启动过程中一部分而运行的最后一个脚本。
Redhat 引导过程的大多数配置应该通过操作/etc/sysconfig中的配置文件来完成。 /etc/sysconfig 目录中各项的功能如下表:
六.重新引导和关机
Linux 的文件系统缓冲一般在内存中变化,只是偶尔才把他们写回磁盘。 这种方案使得磁盘I/O速度更快,但是当系统被粗暴的中止时,这种方式也更容易使文件系统丢失数据。
传统的Unix 和Linux 机器要非常小心地处理关机方式才行。 现在的系统已经变的不那么敏感了,尤其是使用ext3 这样强健的文件系统时,但是妥善关机总是一个好习惯。
Linux 系统的故障比较微妙,复杂。 因此要先考虑清楚,在重新引用机器。 还有,Linux 系统引导所花费的时间很长。
当添加一种新硬件或者现有硬件出现问题设置不能复位时,通常需要重新引导系统。 如果所修改的配置文件只有在引导过程中才能使用,那么要让改动起作用,也必须重新引导系统。 只要修改启动脚本,就应该重新引导系统,以确保系统能够成功地运行起来。
引导系统本质上只能用一种方法来完成,于此不同的是,关闭或者重新引导系统有许多种方法。 如下:
(1)关闭电源
(2)使用shutdown命令
(3)使用halt或者reboot命令
(4)使用telinit 来改变init的运行级别
(5)使用poweroff 命令告诉系统关闭电源。
6.1 关闭电源
即使是在桌面系统上,关闭电源也不是关闭系统的一个好办法。 这样做有可能丢失数据和破坏文件系统。
许多机器有一个软电源开关,当用户按下电源按钮时,机器实际上运行一串命令来执行关闭系统的正确操作。 不过,这种情况也是相对的。发生紧急情况时,如果没有足够的时间来妥善关机,那么关闭电源也是可以的。
6.2shutdown 停止系统的妥善方式
Shutdown 是停止或重新引导系统,或者返回到单用户模式的最安全,考虑最周到的,最彻底的方式。
可以让shutdown在开始关闭系统以前等待一定的时间。 在这个等待的过程中,shutdown以越来越短的
时间间隔发送一些消息给已经登陆的用户,警告用户关闭系统的时间即将到来。 默认情况下,这些警告消息只是说系统即将关闭并给出离关闭系统还剩的时间,管理员也可以提供自己的简单消息。 消息应该说明为什么要关闭,并应该估计多长时间以后用户可以再次登陆进入系统。 在大多数系统上,立即执行shutdown时,用户是不能够登陆进入系统的,但如果管理员设定自己的消息,那么用户能够看到信息,从而明白是怎么回事。
Shutdown 让管理员指定当该任务完成后,机器是应该停机(-h),还是重新引导(-r)。 还可以指定在重新引导后是强制使用fsck命令检查磁盘(-F),还是不检查(-f)。 在默认情况下,只要文件系统是正确卸载的,Linux系统会自动跳过fsck检查。
例一: 上午9:30 停机维护
Shutdown –h 9:30 “going down for scheduled maintenance. Expected downtime is 1 hour”
例二:指定相对的关机时间,如15分钟后关机。
Shutdown –h +15 “going down for emergency disk repair.”
6.3 halt : 关闭系统的更简单方式
halt 命令执行关闭系统所需要的基本任务。 它可以被shutdown –h 调用,也可以单独使用。 Halt 记录关机的情况,终止那些非必要的进程,执行sync 系统调用(被sync 命令调用与sync 命令等效),等待文件系统写操作完成,然后停止内核。
Halt –n 不执行sync 调用。 在fsck 修好了根分区之后会用到这个条命令。 如果fsck 没有使用-n 选项, 那么内核可能会用到内存中的缓存的超级块的老版本覆盖fsck的修改。
6.4 reboot:快速的重新启动
reboot 几乎跟halt 完全一样,只不过它是让机器重新启动,而halt 是让机器停止。 Reboot 由shutdown –r 来调用。 与halt 类型,它也不支持-n 参数。
6.5 telinit 改变init 的运行级
使用telinit 可以指引init 进入特定的运行级。 如:
#Telinit 1
让系统进入单用户模式。
在使用telinit 的时候,不会得到像shutdown 那样友好的警告信息, 所以很少使用,不过对于测试inittab文件的修改来说,还是比较方便。
6.6 poweroff:关闭电源
poweroff 命令等价于halt,不同之处在linux 关闭后poweroff 可以向电源管理系统(在有这项功能系统上)发送一则请求来关闭系统的主电源。 这项功能易于实现远程关机。