JoeBrockmeier研究了SlackwareLinuxinit进程。他讨论了系统如何初始化服务、各种运行级别是什么,以及如何从缺省安装中添加或除去服务来定制系统。
Linux用户正日益成熟,这意味着他们想要将系统配置成执行他们希望完成的任务。但目前Linux发行版通常都附带了自动配置的设备和启动服务,如Sendmail或Apache。这些发行版没有考虑到的是毫不更改其缺省设置来运行服务,如Apache--用户毫不知情--会让黑客和利用脚本捣乱的人趁虚而入。而且这会用完本可以更好利用的系统资源--比如可以用于Quake或您喜欢的编译器的更多处理器时间。由于缺少控制是件糟糕的事,因此让我们看一下Linux系统引导时在init进程期间,在所涉及的各个运行级别上都发生了什么,以及如何在系统运行时定制系统或在运行级别之间切换。
我们的示例使用x86平台上的SlackwareLinux发行版(请参阅本文后面的参考资料)。大多数信息可用于其它Linux发行版,但在细节处会略有不同。尤其是,与其说Slackware的init结构类似于SystemV结构,还不如说它更类似于BSDUNIX结构,尽管Slackware的最新发行版中的程序做了一些让步,它们要将服务添加到启动,但期望这些服务是SystemV目录结构。(请参阅侧栏,BSD和系统Vinit脚本之间的差异。)
所有进程的父代
当Linux机器引导时,究竟会发生什么?在计算机的BIOS完成其任务后,系统会读取硬盘(或软盘,或CD-ROM,或Zip驱动器Linux是非常灵活的)的第一位,并会遇到引导装入程序。虽然GRUB和其它装入程序也逐渐变得流行,但通常这就是Linux装入程序(LInuxLOader),一般称作LILO。
然后LILO将Linux内核装入内存,并开始展示它的魔力。Linux内核初始化了诸如SCSI卡之类的设备,以及其它内核中内置的硬件设备。然后内核运行init,它是除内核之外在系统运行的第一个进程。如果执行psax|grep1,就会看到init的进程ID(PID)是1。
装入init之后,它会读取inittab以查看下一步做什么。inittab告诉init要进入什么运行级别,以及在哪里可以找到该运行级别的配置文件。
回页首
运行级别
运行级别是由系统上的所有服务在某个给定时间定义的(基本上是操作方式)。Linux可以有几种操作方式:单用户方式、单用户联网方式、多用户方式、始于X窗口的多用户方式,等等。这部分将要说明运行级别的概念、Slackware上有哪些运行级别,已经它们被叫作什么。
运行级别由数字或字母标明。可惜,不是所有的Linux发行版在各个运行级别的称呼问题上都能达成共识。在某些发行版中,运行级别3是使用X窗口登录的多用户方式。而其它的,如Slackware,将运行级别3指定成使用控制台登录的多用户方式。
据我所知,所有Linux发行版都认同运行级别0是停机、运行级别1或"S"是单用户方式(稍后将详细说明),运行级别6是重新引导系统。Slackware的运行级别如下:
运行级别0=系统停机
运行级别1=单用户方式,主要用于维护
运行级别2=从不使用
运行级别3=使用控制台登录的多用户方式
运行级别4=使用X11会话管理器的多用户方式(XDM,GDM,KDM)
运行级别5=从不使用
运行级别6=重新引导
运行级别S或s=单用户方式
这里没有记录运行级别7到9,在理论上,它们适用于在需要时定制运行级别。但我还没有亲自尝试过创建一个。BSD和SystemVinit脚本之间的差异
SlackwareLinux使用BSDinit脚本说说挺容易,但这究竟表示什么?
仿真BSDinit样式的Linux和UNIX系统有一个/etc/rc.d/目录,其中每个运行级别都包含一个init脚本。因此,如果要查看或修改运行级别4的init脚本,应该编辑文件/etc/rc.d/rc.4。
另一方面,其init脚本基于SystemV的系统对于每个运行级别都有独立的目录。因此,如果要编辑运行级别4init脚本,应查找/etc/rc4.d/目录,并查找该目录中对应于要修改的服务的脚本。
这个差异导致了BerkeleySoftwareDistribution(BSD)UNIX和AT&TSystemVUNIX之间的设计差异,这两者都开创了各自的UNIX商业版本。它们连同Vi以及Emacs一起是计算机界的激烈争论之一。
由于许多Linux发行版都喜欢SystemVinit布局,Slackware现在也附带了目录和rc.sysvinitinit脚本,用于保持兼容性。
回页首
运行级别配置
如果您使用的不是SlackwareLinux,那么配置文件的结构与我谈到的结构会大不相同。除了inittab文件,所有Slackware的启动配置文件都在/etc/rc.d/目录中。
缺省情况下,目录中有5个运行级别rc.*脚本,如果将symlink从rc.0加到rc.6,那么可有6个。
运行级别init脚本是:
rc.0=rc.0文件是到rc.6的symlink
rc.M=多用户运行级别2、3和5的init脚本
rc.K=管理运行级别,单用户方式
rc.S=系统初始化脚本
rc.4=运行级别4(自动引导入所选择的X会话管理器)的init脚本
rc.6=重新引导或停止系统时由init执行的脚本
目录中的其余rc.*文件用于启动诸如联网、内核模块、PCMCIA、Samba、Apache、Netatalk和GPM的系统服务。如果想要使某个服务(如Apache)完全不能在任何运行级别上使用,请使用chmod将文件的许可权从可执行更改成不可执行。除去该文件也可以到达相同效果,但我不推荐这种做法。也许在以后某个日子您会发现要重新启用服务,但却不知道怎样做。
rc.inet1脚本负责启动基本联网服务,如设置主机名(IP和DHCP)。rc.inet2脚本负责启动所有其它INET服务,如NFS、包转发、ssh服务器和其它联网守护程序。
所有Slackware/etc/rc.d/rc.*文件都是Bashshell脚本,都可以进行手工编辑。可是对于联网,您可能应该先尝试netconfig实用程序。虽然需要手工编辑/etc/resolv.conf来添加多个名称服务器,但是它也许能处理您想要执行的所有操作,而且它非常易于使用。
如果您是Linux初学者并且要修改系统,那么也许应该确保您有引导软盘,并且应该复制您所有想要编辑的rc.*文件。如果拿不定主意,我通常会将文件保存为rc.*.old,使它们变成不可执行文件。,使它们变成不可执行文件。
回页首
使用运行的系统
好,现在系统已经运行,然而您需要在单用户方式中执行一些操作--该怎么做呢?本文的下一部分将说明如何在系统运行时更改运行级别,而不是通过重新引导来更改运行级别,而且还说明了为什么执行此操作以及何时执行。
回页首
telinit命令:在运行的系统上更改运行级别
telinit命令可以用于更改运行级别。当以root身份执行telinitS(或者想要更改的任意运行级别)时,它会更改运行级别,关闭前一个运行级别,然后启动下一个。
某种程度上您正在重新引导系统的一部分。然而,关闭与重新启动服务的能力正是Linux最可爱的品质之一。想要更改机器的IP地址吗?没问题,只要进行一些更改,然后重新启动联网服务就行了。只要一切配置正确,备份和运行是如此迅速,很难分辩是否做过更改。在其它即使更改了桌面上的墙纸都必须重新引导的操作系统上,尝试一下执行此操作:)
确实需要重新引导或彻底关闭Linux机器的唯一情况是如果正在添加或更改硬件,假设您正在使用不能热插拔的设备,或者已经中断且需要使机器脱机以修复损坏。与其它操作系统不同,对于那些不经过重新引导就无法解决问题的产品系统,我从来没有看到过重新引导解决了这些系统上的问题。我曾设法利用诸如hdparm的命令来挂起非生产性机器,我希望这种情况发生。
假设您想要执行一些系统维护,而这些系统维护要求系统处于单用户方式。例如,使用hdparm调整硬盘。第一步是su(切换)到root用户。
然后执行telinit命令使系统进入单用户方式:
telinitS-t60
自变量"-t"是可选的;它告诉telinit在真正切换到单用户方式之前等待60秒。然而,只要执行了该命令,登录到机器的任何人都会看到在控制台上出现一个警告,指出系统将切换运行级别或将在60秒内停机。
到了60秒时,init会关闭单用户方式中不使用的进程,并使系统进入单用户方式。然后,将提示您输入root用户密码以执行系统维护。
系统进入单用户方式所使用的进程略有不同。缺省情况下,单用户方式要求init在控制台上调用sulogin命令,并要求在单用户方式中使用root登录。
系统进入单用户方式后,应该会看到如下的消息:
Giverootpasswordforsystemmaintenance
(ortypeControl-Dfornormalstartup):
执行了维护之后,可以执行以下命令来使系统回到以前的运行级别:
telinit3
此命令告诉系统重新进入多用户运行级别。在此命令中可以用"2"或"4"来代替"3"。在Slackware系统上,运行级别4将使您进入使用X窗口显示管理器之一的多用户方式,因此您将直接登录到X窗口。
如果在拥有串行电缆的串行上挂了UPS,那么就可以让UPS在断电的情况下向系统发送一个信号。如果您的产品级系统有一个很大的文件系统,那么这是非常有用的。我曾看到过当没有彻底卸载100GBRAIDext2文件系统时(完成fsck需要大约4小时)发生了什么情况。另一方面,正确配置的UPS可以提醒系统断电情况,并向telinit/init发送SIGPWR信号,这会使init根据其配置情况将系统切换到单用户方式或者完全关闭系统。
回页首
关机
好,由于一直使用计算机,您已经觉得疲倦了,并打算到BigBlueRoom去放松一下。幸好,您已经知道了在结束时直接按电源开关是一大禁忌,但也许还不知道关闭系统的所有方法。
在Linux中,可以使用三指礼重新引导系统:Ctrl+Alt+Del键控顺序会向系统发送消息,通知它执行关机进程并重新启动。换句话说,除非告诉它不要那样做。
如果要禁用该键控顺序,需要注释掉inittab中的一行代码:
部分Slackwareinittab
#Scripttorunwhengoingmultiuser.
rc:2345:wait:/etc/rc.d/rc.M
#Whattodoatthe"ThreeFingerSalute".
#ca::ctrl altdel:/sbin/shutdown-t5-rfnow
CommentouttheabovelinetodisableCtrl+Alt+Delhotkey.
关机时会发生什么情况?调用shutdown命令可以逐步关闭系统。然而,shutdown自身并不完成所有工作,它通知init:应该进入运行级别0、1或6。
shutdown命令还通知所有已登录到机器上的用户:机器将关闭。在此之后将锁住login命令,因此没有别的人可以再启动会话。
要使用shutdown命令来关闭Linux系统,使用以下命令:
关机
shutdown-hnow
如果要给用户注销和保存文件的时间,请使用以下命令:
shutdown-h-t60
shutdown命令的"-h"开关告诉系统在停机后彻底关机。如果在内核中启用了APM,那么它会替您关闭电源,否则此时可以放心地按下开关。
"-t"开关是到系统开始关机之前所需要的时间,以秒为单位。如果要放弃关机,那么使用此开关可以实现。要停止暂挂关机,输入:
shutdown-c
此命令将取消以前的所有shutdown命令。如果出于某些原因,您不想关闭系统,但却要向用户发送系统即将关闭的警告,那么应在shutdown中使用"-k"自变量。
知道如何使用telinit和init可以在修改Linux系统派上用处。本文中,我们讨论了更改运行级别和有关SlackwareLinux发行版的init脚本的基础知识。在各个发行版之间,目录结构和文件位置都各不相同,但在阅读了本文之后,您应该能够掌握系统的init脚本,即使您使用的不是SlackwareLinux。
参考资料
您可以参阅本文在developerWorks全球站点上的英文原文.
请访问SlackwareLinux主页。
请订阅安装、配置和定制SlackwareLinux,这是由JoeBrockmeier与其他人合著的Slackware初学者指南。
如需附加背景知识,请阅读"HowYourComputerBoots"。
请深入了解BerkeleySoftwareDistribution(BSD)UNIX和AT&TSystemVUNIX以及Vi和Emacs之间的设计差异,这是计算机界的激烈争论之一。