分类: LINUX
2011-03-01 20:47:19
在本文中,学习关闭或重启您的 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 进程用户所熟悉的内容(更多细节见 )。本文是针对传统 System V init 进程的,只对 upstar 的区别进行了粗略的概述。
运行级别 定义了在 Linux 系统的当前状态(或运行级别)可以完成的任务。每个 Linux 系统支持 3 个基本运行级别,外加一个或多个用于正常操作的运行级别。基本运行级别如 表 1 所示。
级别 | 目的 |
---|---|
0 | 关闭(或终止)系统 |
1 | 单用户模式:通常又称为 s 或 S |
6 | 重启系统 |
除了这些基本的运行级别之外,各个发行版之间的运行级别使用也有所不同。一个命令使用集合如 表 2 所示。
级别 | 目的 |
---|---|
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。
[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 所示的片段。
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 这样。
在这个示例中,您现在应该可以看到以 root、kernel、initrd 开始的行出现。将光标移动到以 “kernel” 开始的行,然后输入 ‘e’ 来编辑这一行。Fedora 8 系统上的 GRUB 屏幕现在如 图 2 所示。
最后将光标移动到这一行的末尾,然后添加一个空格和数字 ‘3’。如果需要的话您可以删除 ‘quiet’,或者根据需要修改任何其他参数。Fedora 8 系统上的 GRUB 屏幕现在如 图 3 所示。
最后,按下 Enter 键来保存修改,然后输入 ‘b’ 来引导系统。
注意: 使用 LILO 或 GRUB2 和使用 GRUB 的步骤有所不同,但是编辑内核启动方法的基本原理是一样的,即使其他系统或其他版本上的 GRUB 界面和这里所显示的界面大不相同。提示信息通常会对您有所帮助。
当您在运行级别 3 下完成了您的安装工作时,您可能想要切换到运行级别 5。幸运的是,您不需要重启系统。您可以使用 telinit
命令来切换到另一个运行级别。使用 runlevel
命令可以显示之前和目前的运行级别。如果输出的一个字符是 ‘N’,运行级别还不能改变,因为系统正在被引导。 清单 3 显示了验证和更改运行级别。
[root@pinguino ~]# runlevel N 3 [root@pinguino ~]# telinit 5 |
输入 telinit 5
之后您将看到几个消息一闪而过,您的界面将切换到已配置的图形化登录界面。打开一个终端窗口,然后验证运行级别是否已经修改,如 清单 4 所示。
[root@pinguino ~]# runlevel 3 5 |
如果您使用 ls
命令来显示一个很长的 telinit
命令清单,您将看到它实际上是一个链接到 init
命令的符号链接。我们将在 清单 5 中对此作一说明。
[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
命令的示例,以及撤销这一命令的方法。
[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 秒。
[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
命令暂停系统。poweroff
命令是一个链接到 halt
命令的符号链接,暂停系统然后试图关掉电源。reboot
命令是另一个连接到 halt
命令的符号链接,暂停系统然后重新启动。当系统的运行级别不是 0 或 6 时,如果调用这些命令其中之一,相应的 shutdown
命令将被代替调用。
对于这些命令的其他选项,以及关于其操作的详细信息,请参阅手册页。
到目前为止,您可能想知道,为什么在有些系统上需要按 Ctrl-Alt-Delete 键来重新启动,或者这个运行级别设置是如何配置的。记得 /etc/inittab 中的 id
字段吗?当然,/etc/inittab 中还有其他字段,而且其中的一些目录下(比如 rc1.d 或 rc5.d )还有一系列 init 脚本,其中数字就是在那个目录下脚本所应用的运行级别。 清单 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, |
和往常一样,以 # 开始的是注释,其他行有几个以如下格式表示的字段:id:runlevels:action:process
在 /etc/inittab 中可能指定的一些常见操作,如 表 3 所示。关于 inittab 的其他可能性见手册页。
操作 | 目的 |
---|---|
respawn | 在进程终止时重启进程。通常用于 getty 进程,该进程用于监控登录。 |
wait | 当特定运行级别输入后立即启动进程,等待终止直至 init 开始运行。 |
once | 当特定运行级别输入后立即启动进程。 |
initdefault | 指定系统引导之后要输入的运行级别。 |
ctrlaltdel | 当 init 接收到 SIGINT 信号后执行相关进程,比如,有人在系统控制台上按了 CTRL-ALT-DEL。 |
清单 9 只显示了 清单 8 中针对 Ctrl-Alt-Delete 的条目。现在,您明白了为什么按 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 目录下。rcn.d 目录下的一系列符号链接,每个运行级别 n 有一个目录,控制当输入一个运行级别时脚本是否启动,或当离开时脚本是否停止。这些链接以一个 K 或一个 S 开头,紧接着是一个 2 位数的数字,然后是服务名,如 清单 10 所示。
[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 下有 Snn 个条目。S 表示当输入运行级别时服务已启动,而 K 表示服务应该停止。链接名称的 nn 部分表示服务启动或暂停的优先级别。在该示例中,audit
在 autofs
之前启动,且在其后停止。
参阅手册页,了解关于 init
和 inittab
的更多信息。
正如我们所看到的,传统的引导 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 作业列表。
[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 的信息,见 。
对运行级别、关机和重新启动的介绍到此结束。
学习
chinaunix网友2011-03-06 09:04:18
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com