概述
在本文中,学习关闭或重启您的 Linux 系统,警告用户系统正在关闭,请切换到单用户模式或者一个多少有点限制性的运行级别。学习:
- 设置默认运行级别
- 运行级别间的变化
- 改为单用户模式
- 从命令行关闭或重启系统
- 警告用户主要系统事件,包括切换到另一个运行级别
- 适当地终止进程
除非特殊说明,本文中的示例使用带有 2.6.26 内核的 Fedora 8。upstar 示例使用的是带有 2.6.34 内核的 Fedora 13,或者是带有 2.6.35 内核的 Ubuntu 10.10。您的结果在其他系统上可能有所不同。
本文帮助您准备 Linux Professional Institute's Junior Level Administration(LPIC-1)考试 101 中主题 101 下的目标 101.3。该目标的权值为 3。
先决条件
为了最有效地利用本系列中的文章,您应该具有基本的 Linux 知识,并需要准备一个 Linux 系统,用于练习本文介绍的命令。有时候不同版本的程序输出格式不同,因此您所得到的结果未必总是与这里所示的清单和图相同。特别是,最近出现的系统已经改变了很多传统 System V init 进程用户所熟悉的内容(更多细节见 Init vs. Upstart)。本文是针对传统 System V init 进程的,只对 upstar 的区别进行了粗略的概述。
运行级别
运行级别 定义了在 Linux 系统的当前状态(或运行级别)可以完成的任务。每个 Linux 系统支持 3 个基本运行级别,外加一个或多个用于正常操作的运行级别。基本运行级别如 表 1 所示。
表 1. 表 1. Linux 基本运行级别级别目的 0 关闭(或终止)系统 1 单用户模式:通常又称为
s 或
S 6 重启系统
除了这些基本的运行级别之外,各个发行版之间的运行级别使用也有所不同。一个命令使用集合如 表 2 所示。
表 2. 表 2. 其他命令 linux 运行级别级别目的 2 没有网络的多用户模式 3 有网络的多用户模式 5 有网络和 X Window System 的多用户模式
Slackware 发布版使用运行级别 4 而不是 5,因为整个系统正运行 X Window 系统。Debian 及其衍生产品,比如 Ubuntu,对于任何多用户模式都使用单个运行级别,通常是运行级别 2。务必查阅您版本的文档。
默认运行级别
当一个 Linux 系统启动时,默认运行级别由 /etc/inittab 下的 id: 条目确定。 清单 1 说明了一个系统(比如 Fedora 8
或
openSUSE 11.2)典型条目,这两个系统都是为 X Window System 使用运行级别 5。
清单 1. 清单 1. /etc/inittab 中的默认运行级别
[root@pinguino ~]# grep "^id:" /etc/inittab
id:5:initdefault:
如果您想要您的系统以不同的运行级别启动,比如说运行级别 3,编辑该值。
改变运行级别
有好几种方法可以改变运行级别。为了进行一个永久的改变,您可以编辑 /etc/inittab 并改变默认运行级别,正如您刚才在上面看到的。
如果您只需要在一次引导中将您的系统提升到一个不同的运行级别,您可以这样做。例如,假设您刚刚安装了一个新内核,在使用新内核重启系统后需要建立一些内核模块,但是应该在启动 X Window System 之前。您可能想要将您的运行级别提升为级别 3 来完成这一任务。您可以通过编辑内核线(GRUB)或在选择的系统名后(LILO)添加一个参数来在引导时进行这一操作。使用一个一位数来指出期望的运行级别(在这里是 3)。我们将通过一个 GRUB 实例来介绍具体过程。假设您的 /boot/grub/menu.lst 文件含有 清单 2 所示的片段。
清单 2. 清单 2. 启动 Fedora 8 的典型 GRUB 片段
title Fedora (2.6.26.8-57.fc8)
root (hd0,5)
kernel /boot/vmlinuz-2.6.26.8-57.fc8 ro root=LABEL=FEDORA8 rhgb quiet
initrd /boot/initrd-2.6.26.8-57.fc8.img
要想让系统升级到运行级别 3,等待直至引导项出现,选择这个条目然后输入 ‘e’ 来编辑这个条目。根据您的 GRUB 选项,您可能需要按下一个键来显示引导项,然后也输入一个 ‘p’ 和一个密码来解锁编辑。Fedora 8 系统上 GRUB 屏幕看起来像 图 1 这样。
图 1. 图 1. 在 GRUB 中选择一个引导选项在这个示例中,您现在应该可以看到以 root、kernel、initrd 开始的行出现。将光标移动到以 “kernel” 开始的行,然后输入 ‘e’ 来编辑这一行。Fedora 8 系统上的 GRUB 屏幕现在如 图 2 所示。
图 2. 图 2. 选择内核项进行编辑最后将光标移动到这一行的末尾,然后添加一个空格和数字 ‘3’。如果需要的话您可以删除 ‘quiet’,或者根据需要修改任何其他参数。Fedora 8 系统上的 GRUB 屏幕现在如 图 3 所示。
图 3. 图 3. 设置启动运行级别为 3最后,按下 Enter 键来保存修改,然后输入 ‘b’ 来引导系统。
注意: 使用 LILO
或
GRUB2 和使用 GRUB 的步骤有所不同,但是编辑内核启动方法的基本原理是一样的,即使其他系统或其他版本上的 GRUB 界面和这里所显示的界面大不相同。提示信息通常会对您有所帮助。
当您在运行级别 3 下完成了您的安装工作时,您可能想要切换到运行级别 5。幸运的是,您不需要重启系统。您可以使用 telinit 命令来切换到另一个运行级别。使用 runlevel 命令可以显示之前和目前的运行级别。如果输出的一个字符是 ‘N’,运行级别还不能改变,因为系统正在被引导。 清单 3 显示了验证和更改运行级别。
清单 3. 清单 3. 验证和更改运行级别
[root@pinguino ~]# runlevel
N 3
[root@pinguino ~]# telinit 5
输入 telinit 5 之后您将看到几个消息一闪而过,您的界面将切换到已配置的图形化登录界面。打开一个终端窗口,然后验证运行级别是否已经修改,如 清单 4 所示。
清单 4. 清单 4. 确认新的运行级别
[root@pinguino ~]# runlevel
3 5
如果您使用 ls 命令来显示一个很长的 telinit 命令清单,您将看到它实际上是一个链接到 init 命令的符号链接。我们将在 清单 5 中对此作一说明。
清单 5. 清单 5. telinit 只是一个链接到 init 的符号链接
[root@pinguino ~]# ls -l $(which telinit)
lrwxrwxrwx 1 root root 4 2008-04-01 07:50 /sbin/telinit -> init
可执行文件 init 知道它是否称为 init
或
telinit,然后进行相应调整。因为 init 作为 PID 1 在引导时运行,它也非常智能,知道您随后什么时候会使用 init 调用它,而不是使用 telinit。如果您这样做了,它就会假设您希望它表现得像已经调用了 telinit。例如,您可能会使用 init 5 而不是 telinit 5 来切换到运行级别 5。
单用户模式
相比个人电脑操作系统,比如 DOS
或
Windows,Linux 本身是一个多用户系统。然而,有时候这可能会成为一个问题,比如,当您需要恢复一个重要文件系统或者数据库时,或者安装和测试某个新软件时。运行级别 1,
单用户模式 是您在这些情况下的最佳答案。实际实现根据不同版本有所变化,但是您通常只使用一个很小的系统简单地启动。通常这里没有联网,没有(或者非常少)守护进程运行。在一些系统上,您必须通过登录来进行认证,但在其他系统上您可以直接以根用户开始操作 shell 提示符。单用户模式可能是一个救生圈,也可能是毁坏您的系统,因此,不管任何时候,当您使用根用户权限时都应该小心注意。完成后立即重新启动到一个正常多用户模式。
和切换到正常多用户运行级别一样,您也可以使用 telinit 1 切换到单用户模式。正如 表 1 所述,‘s’ 和 ‘S’ 是运行级别 1 的别名,因此您可以使用 telinit s 来代替。
干净关闭
您可以使用 telinit
或
init 来停止多用户活动,然后切换到单用户模式,这可能有点突然,可能会导致用户丢失作业和进程异常终止。关闭或重启系统首选方法是使用 shutdown 命令,这首先会向所有登录的用户发送一个警告,并限制进一步登录,然后发送 init 信号来切换运行级别。init 进程然后发送给所有正在运行的进程一个 SIGTERM 信号,给它们保存数据的时间或让他们自己结束进程。5 秒(如果指定了延迟时间的话,可能是其他延迟时间)后,init 发送一个 SIGKILL 信号来强制结束还在运行的进程。
默认情况下,shutdown 切换到运行级别 1(单用户模式)。您可以指定 -h 来暂停系统,或者 -r 选项重新启动。除了您指定的消息外标准消息也被公布。时间可能是指定为绝对时间,以 hh:mm
格式,或者也可能是相对时间,以
n 格式,其中 n 是距关机的分钟数。对于即刻关机,使用
now,这等价于
+0。
如果您发布了一个延迟关机,而时间还没有到,如果您想取消关机,如果命令行正在前端运行按 Ctrl-c 键,或者通过发布一个带有 -c 选项的 shutdown 命令来取消即将进行的关机。 清单 6 显示了几个使用 shutdown 命令的示例,以及撤销这一命令的方法。
清单 6. 清单 6. 关机示例
[root@pinguino ~]# shutdown 5 File system recovery needed
Broadcast message from root (pts/1) (Tue Jan 4 08:05:24 2011):
File system recovery needed
The system is going DOWN to maintenance mode in 5 minutes!
^C
Shutdown cancelled.
[root@pinguino ~]# shutdown -r 10 Reloading updated kernel&
[1] 18784
[root@pinguino ~]#
Broadcast message from root (pts/1) (Tue Jan 4 08:05:53 2011):
Reloading updated kernel
The system is going DOWN for reboot in 10 minutes!
[root@pinguino ~]# fg
shutdown -r 10 Reloading updated kernel
^C
Shutdown cancelled.
[root@pinguino ~]# shutdown -h 23:59&
[1] 18788
[root@pinguino ~]# shutdown -c
Shutdown cancelled.
[1]+ Done shutdown -h 23:59
您可以已经注意到了,我们最后一个例子没有发送一个警告消息。如果关机时间超过了 15 分钟,这个消息将不被发送,直到 清单 7 所示活动前 15 分钟。 清单 7 也显示了 -t 选项的使用,将 SIGTERM 和 SIGKILL 信号间的默认延迟增加 5 秒到 60 秒。
清单 7. 清单 7. 另一个关机示例
[root@pinguino ~]# date;shutdown -t60 17 Time to do backups&
Tue Jan 4 08:12:55 EST 2011
[1] 18825
[root@pinguino ~]# date
Tue Jan 4 08:14:13 EST 2011
[root@pinguino ~]#
Broadcast message from root (pts/1) (Tue Jan 4 08:14:55 2011):
Time to do backups
The system is going DOWN to maintenance mode in 15 minutes!
如果您取消了一次关机,您可以使用 wall 命令来向所有用户发送一个警告,通知他们实际上系统不会即将关闭。
正如我们之前所介绍的,也可以使用 telinit(或 init)来关闭或重启系统。和 telinit 的其他用法一样,不向用户发送警告消息,命令立即生效,尽管在 SIGTERM 和 SIGKILL 信号之间仍然有延迟。对于 telinit、init 和 shutdown 的其他选项,请查阅手册页。
Halt、reboot 和 poweroff 命令
您已经知道了一些关于关机和重新启动的命令。
- halt 命令暂停系统。
- poweroff 命令是一个链接到 halt 命令的符号链接,暂停系统然后试图关掉电源。
- reboot 命令是另一个连接到 halt 命令的符号链接,暂停系统然后重新启动。
当系统的运行级别不是 0
或
6 时,如果调用这些命令其中之一,相应的 shutdown 命令将被代替调用。
对于这些命令的其他选项,以及关于其操作的详细信息,请参阅手册页。
/etc/inittab
到目前为止,您可能想知道,为什么在有些系统上需要按 Ctrl-Alt-Delete 键来重新启动,或者这个运行级别设置是如何配置的。记得 /etc/inittab 中的 id 字段吗?当然,/etc/inittab 中还有其他字段,而且其中的一些目录下(比如 rc1.d
或
rc5.d )还有一系列 init 脚本,其中数字就是在那个目录下脚本所应用的运行级别。 清单 8 显示了我们的 Fedora 8 系统上一个完整的 inittab。
清单 8. 清单 8. Fedora 8 上的完整 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
和往常一样,以 # 开始的是注释,其他行有几个以如下格式表示的字段:
id:runlevels:action:process
- id
- 是一个惟一标识符,由 1~4 个字符构成。旧版本限制为 2 个字符,因为您通常会看到只使用 2 个字符。
- runlevels
- 列出针对该 id 的活动应该操作的运行级别。如果没有列出任何运行级别,在所有运行级别下执行这一操作。
- action
- 描述几个可能执行的操作
- process
- 当操作在这个线路上被执行时,告知哪个进程应该运行,如果有的话。
在 /etc/inittab 中可能指定的一些常见操作,如 表 3 所示。关于 inittab 的其他可能性见手册页。
表 3. 表 3. 一些常见的 inittab 操作 操作目的 respawn 在进程终止时重启进程。通常用于 getty 进程,该进程用于监控登录。 wait 当特定运行级别输入后立即启动进程,等待终止直至 init 开始运行。 once 当特定运行级别输入后立即启动进程。 initdefault 指定系统引导之后要输入的运行级别。 ctrlaltdel 当 init 接收到 SIGINT 信号后执行相关进程,比如,有人在系统控制台上按了 CTRL-ALT-DEL。
清单 9 只显示了 清单 8 中针对 Ctrl-Alt-Delete 的条目。现在,您明白了为什么按 Ctrl-Alt-Delete 键会导致系统重新启动。
清单 9. 清单 9. 捕获 Ctrl-Alt-Delete
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
初始化脚本
您可能会注意到 清单 8 中的这几行,比如
l5:5:wait:/etc/rc.d/rc 5
在本例中,不管输入的运行级别是不是 5,init 将使用参数 5 运行 /etc/rc.d/rc 脚本(或命令)。init 将等待直至该命令完成,然后再执行其他操作。
启动系统、修改运行级别或关机时 init 使用的那些脚本通常存储在 /etc/init.d
或
/etc/rc.d 目录下。rc
n.d 目录下的一系列符号链接,每个运行级别
n 有一个目录,控制当输入一个运行级别时脚本是否启动,或当离开时脚本是否停止。这些链接以一个 K
或
一个 S 开头,紧接着是一个 2 位数的数字,然后是服务名,如 清单 10 所示。
清单 10. 清单 10. Init 脚本
[root@pinguino ~]# find /etc -path "*rc[0-9]*.d/???au*"
/etc/rc.d/rc2.d/S27auditd
/etc/rc.d/rc2.d/K72autofs
/etc/rc.d/rc4.d/S27auditd
/etc/rc.d/rc4.d/S28autofs
/etc/rc.d/rc5.d/S27auditd
/etc/rc.d/rc5.d/S28autofs
/etc/rc.d/rc0.d/K72autofs
/etc/rc.d/rc0.d/K73auditd
/etc/rc.d/rc6.d/K72autofs
/etc/rc.d/rc6.d/K73auditd
/etc/rc.d/rc1.d/K72autofs
/etc/rc.d/rc1.d/K73auditd
/etc/rc.d/rc3.d/S27auditd
/etc/rc.d/rc3.d/S28autofs
[root@pinguino ~]# cd /etc/rc.d/rc5.d
[root@pinguino rc5.d]# ls -l ???a*
lrwxrwxrwx 1 root root 16 2008-04-07 11:29 S27auditd -> ../init.d/auditd
lrwxrwxrwx 1 root root 16 2008-04-01 07:51 S28autofs -> ../init.d/autofs
lrwxrwxrwx 1 root root 15 2008-04-01 14:03 S44acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 13 2008-04-01 07:50 S95atd -> ../init.d/atd
lrwxrwxrwx 1 root root 22 2008-04-01 07:54 S96avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 17 2008-11-17 13:40 S99anacron -> ../init.d/anacron
您可以看到在所有运行级别下 audit 和 autofs 服务有 Knn
个条目,运行级别 3 和 5 下有 S
nn 个条目。S 表示当输入运行级别时服务已启动,而 K 表示服务应该停止。链接名称的
nn 部分表示服务启动或暂停的优先级别。在该示例中,audit 在 autofs 之前启动,且在其后停止。
参阅手册页,了解关于 init 和 inittab 的更多信息。
Init vs. Upstart
正如我们所看到的,传统的引导 Linux 系统方法是基于 UNIX System V init 进程的。它涉及到加载一个初始 RAM 磁盘(initrd),然后将控件传给一个名为 init 的程序,通常作为 sysvinit 包的一部分安装的一个程序。init 程序然后以预先定义的顺序运行一系列脚本来启动系统。如果预期的一些信息不可用,init 进程会等待直至可用。而这对于在系统启动时一切都是已知且连接的系统来说很适合,带热插拔设备的系统、网络文件系统、甚至在启动时不能使用的网络接口都面临着新的挑战。的确,等待可能很长时间内都不可用的硬件,或者就算是相对较长的时间,都不是很理想。
另一个初始化进程 upstart
是在 2006 年 Ubuntu 6.10 ("Edgy Eft") 中第一次引入。目前在 Ubuntu 和 Fedora,还有其他系统中已经取代了 init 进程,尽管依然有 init 的痕迹,upstart 的强大功能在一段时间内可能还没有被意识到。
相比早期系统中所用的 init 脚本的静态集合,upstart 系统是事件
驱动的,事件可能被硬件改动触发,也可被启动或关机或任务所触发,或者也可能被系统上的任何其他进程所触发。事件用于触发
任务 或
服务,统称为
作业。因此,比如连接到一个 USB 驱动器可能导致 udev 服务发送一个
block-device-added 事件,这可能引起一个预定任务检查 /etc/fstab 和挂载驱动器(如果需要的话)。再如,一个 Apache web 服务器可能只有当网络和所需的文件系统都可用时才能启动。
upstart 初始化程序代替了 /sbin/init。Upstart 作业在 /etc/init 目录及其子目录下被定义。upstart 系统目前将处理 /etc/inittab 和 System V init 脚本。在诸如近来的 Fedora 版本的系统上,/etc/inittab 可能只含有 initdefault 操作的 id 项。目前 Ubuntu 系统默认没有 /etc/inittab,如果您想要指定一个默认运行级别的话,您可以创建一个。
Upstart 也使用 initctl 命令来支持与 upstart init 守护进程的交互。这时您可以启动或终止作业、列表作业、以及获取作业的状态、发出事件、重启 init 进程,等等。 清单 11 显示了如何使用 initctl 来获取 Fedora 13 系统上的一个 upstart 作业列表。
清单 11. 清单 11. 使用 initctl 与 upstart init 守护进程交互
[ian@echidna ~]$ initctl list
rc stop/waiting
tty (/dev/tty3) start/running, process 1486
tty (/dev/tty2) start/running, process 1484
tty (/dev/tty6) start/running, process 1492
tty (/dev/tty5) start/running, process 1490
tty (/dev/tty4) start/running, process 1488
plymouth-shutdown stop/waiting
control-alt-delete stop/waiting
system-setup-keyboard start/running, process 1000
readahead-collector stop/waiting
vpnc-cleanup stop/waiting
quit-plymouth stop/waiting
rcS stop/waiting
prefdm start/running, process 1479
init-system-dbus stop/waiting
ck-log-system-restart stop/waiting
readahead stop/waiting
ck-log-system-start stop/waiting
start-ttys stop/waiting
readahead-disable-services stop/waiting
ck-log-system-stop stop/waiting
rcS-sulogin stop/waiting
serial stop/waiting
想要了解更多关于 upstart 的信息,见 参考资料。
对运行级别、关机和重新启动的介绍到此结束。
该贴被cc编辑于2011-8-8 13:25:26