Linux中运行级别与重新启动的示例分析
这篇文章将为大家详细讲解有关Linux中运行级别与重新启动的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
概述
在本文中,学习关闭或重启您的 Linux 系统,警告用户系统正在关闭,请切换到单用户模式或者一个多少有点限制性的运行级别。学习:
设置默认运行级别
运行级别间的变化
改为单用户模式
从命令行关闭或重启系统
警告用户主要系统事件,包括切换到另一个运行级别
适当地终止进程
除非特殊说明,本文中的示例使用带有 2.6.26 内核的 Fedora 8。upstar 示例使用的是带有 2.6.34 内核的 Fedora 13,或者是带有 2.6.35 内核的 Ubuntu 10.10。您的结果在其他系统上可能有所不同。
先决条件
为了最有效地利用本系列中的文章,您应该具有基本的 Linux 知识,并需要准备一个 Linux 系统,用于练习本文介绍的命令。有时候不同版本的程序输出格式不同,因此您所得到的结果未必总是与这里所示的清单和图相同。特别是,最近出现的系统已经改变了很多传统 System V init 进程用户所熟悉的内容(更多细节见 Init vs. Upstart)。本文是针对传统 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。
清单 1. /etc/inittab 中的默认运行级别
[root@pinguino ~]# grep "^id:" /etc/inittabid:5:initdefault:
如果您想要您的系统以不同的运行级别启动,比如说运行级别 3,编辑该值。
改变运行级别
有好几种方法可以改变运行级别。为了进行一个永久的改变,您可以编辑 /etc/inittab 并改变默认运行级别,正如您刚才在上面看到的。
如果您只需要在一次引导中将您的系统提升到一个不同的运行级别,您可以这样做。例如,假设您刚刚安装了一个新内核,在使用新内核重启系统后需要建立一些内核模块,但是应该在启动 X Window System 之前。您可能想要将您的运行级别提升为级别 3 来完成这一任务。您可以通过编辑内核线(GRUB)或在选择的系统名后(LILO)添加一个参数来在引导时进行这一操作。使用一个一位数来指出期望的运行级别(在这里是 3)。我们将通过一个 GRUB 实例来介绍具体过程。假设您的 /boot/grub/menu.lst 文件含有 清单 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 quietinitrd /boot/initrd-2.6.26.8-57.fc8.img
要想让系统升级到运行级别 3,等待直至引导项出现,选择这个条目然后输入 ‘e’ 来编辑这个条目。根据您的 GRUB 选项,您可能需要按下一个键来显示引导项,然后也输入一个 ‘p’ 和一个密码来解锁编辑。Fedora 8 系统上 GRUB 屏幕看起来像 图 1 这样。
图 1. 在 GRUB 中选择一个引导选项
在这个示例中,您现在应该可以看到以 root、kernel、initrd 开始的行出现。将光标移动到以 "kernel" 开始的行,然后输入 ‘e’ 来编辑这一行。Fedora 8 系统上的 GRUB 屏幕现在如 图 2 所示。
图 2. 选择内核项进行编辑
最后将光标移动到这一行的末尾,然后添加一个空格和数字 ‘3’。如果需要的话您可以删除 ‘quiet’,或者根据需要修改任何其他参数。Fedora 8 系统上的 GRUB 屏幕现在如 图 3 所示。
图 3. 设置启动运行级别为 3
最后,按下 Enter 键来保存修改,然后输入 ‘b’ 来引导系统。
注意: 使用 LILO 或 GRUB2 和使用 GRUB 的步骤有所不同,但是编辑内核启动方法的基本原理是一样的,即使其他系统或其他版本上的 GRUB 界面和这里所显示的界面大不相同。提示信息通常会对您有所帮助。
当您在运行级别 3 下完成了您的安装工作时,您可能想要切换到运行级别 5。幸运的是,您不需要重启系统。您可以使用 telinit 命令来切换到另一个运行级别。使用 runlevel 命令可以显示之前和目前的运行级别。如果输出的一个字符是 ‘N’,运行级别还不能改变,因为系统正在被引导。 清单 3 显示了验证和更改运行级别。
清单 3. 验证和更改运行级别
[root@pinguino ~]# runlevelN 3[root@pinguino ~]# telinit 5
输入 telinit 5 之后您将看到几个消息一闪而过,您的界面将切换到已配置的图形化登录界面。打开一个终端窗口,然后验证运行级别是否已经修改,如 清单 4 所示。
清单 4.确认新的运行级别
[root@pinguino ~]# runlevel3 5
如果您使用 ls 命令来显示一个很长的 telinit 命令清单,您将看到它实际上是一个链接到 init 命令的符号链接。我们将在 清单 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. 关机示例
[root@pinguino ~]# shutdown 5 File system recovery neededBroadcast message from root (pts/1) (Tue Jan 4 08:05:24 2011):File system recovery neededThe system is going DOWN to maintenance mode in 5 minutes!^CShutdown 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 kernelThe system is going DOWN for reboot in 10 minutes![root@pinguino ~]# fgshutdown -r 10 Reloading updated kernel^CShutdown cancelled.[root@pinguino ~]# shutdown -h 23:59&[1] 18788[root@pinguino ~]# shutdown -cShutdown cancelled.[1]+ Done shutdown -h 23:59
您可以已经注意到了,我们最后一个例子没有发送一个警告消息。如果关机时间超过了 15 分钟,这个消息将不被发送,直到 清单 7 所示活动前 15 分钟。 清单 7 也显示了 -t 选项的使用,将 SIGTERM 和 SIGKILL 信号间的默认延迟增加 5 秒到 60 秒。
清单 7. 另一个关机示例
[root@pinguino ~]# date;shutdown -t60 17 Time to do backups&Tue Jan 4 08:12:55 EST 2011[1] 18825[root@pinguino ~]# dateTue 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 backupsThe 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. 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,# 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.sysinitl0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6# Trap CTRL-ALT-DELETEca::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 runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm -nodaemon
和往常一样,以 # 开始的是注释,其他行有几个以如下格式表示的字段:
id:runlevels:action:process
id
是一个惟一标识符,由 1~4 个字符构成。旧版本限制为 2 个字符,因为您通常会看到只使用 2 个字符。
runlevels
列出针对该 id 的活动应该操作的运行级别。如果没有列出任何运行级别,在所有运行级别下执行这一操作。
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 键会导致系统重新启动。
清单 9.捕获 Ctrl-Alt-Delete
# Trap CTRL-ALT-DELETEca::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 所示。
清单 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/auditdlrwxrwxrwx 1 root root 16 2008-04-01 07:51 S28autofs -> ../init.d/autofslrwxrwxrwx 1 root root 15 2008-04-01 14:03 S44acpid -> ../init.d/acpidlrwxrwxrwx 1 root root 13 2008-04-01 07:50 S95atd -> ../init.d/atdlrwxrwxrwx 1 root root 22 2008-04-01 07:54 S96avahi-daemon -> ../init.d/avahi-daemonlrwxrwxrwx 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 的更多信息。
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.使用 initctl 与 upstart init 守护进程交互
[ian@echidna ~]$ initctl listrc stop/waitingtty (/dev/tty3) start/running, process 1486tty (/dev/tty2) start/running, process 1484tty (/dev/tty6) start/running, process 1492tty (/dev/tty5) start/running, process 1490tty (/dev/tty4) start/running, process 1488plymouth-shutdown stop/waitingcontrol-alt-delete stop/waitingsystem-setup-keyboard start/running, process 1000readahead-collector stop/waitingvpnc-cleanup stop/waitingquit-plymouth stop/waitingrcS stop/waitingprefdm start/running, process 1479init-system-dbus stop/waitingck-log-system-restart stop/waitingreadahead stop/waitingck-log-system-start stop/waitingstart-ttys stop/waitingreadahead-disable-services stop/waitingck-log-system-stop stop/waitingrcS-sulogin stop/waitingserial stop/waiting
关于"Linux中运行级别与重新启动的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。