全新的 developerWorks Premium 会员计划提供了强大的开发工具和资源,包括 500 篇通过 Safari Books Online 提供的顶级技术文章(其中数十篇文章专门针对 Java 开发人员),最重要开发人员活动的大幅折扣,最新的 O'Reilly 大会的视频录像,等等。立即注册。
概述在本文中,学习关闭或重新引导 linux 系统,警告用户系统即将关闭,切换到单用户模式,或者切换到限制更多或更少的运行级别或引导目标。学习:
设置默认运行级别或引导目标 更改运行级别或引导目标 更改为单用户模式 从命令行关闭或重新引导系统 向用户提醒主要的系统事件,包括切换到另一个运行级别或引导目标 正确终止进程除非另行说明,本文中的示例使用的是 Slackware 13.37 系统和 2.6.37 内核。upstart 示例使用了 Ubuntu 14.04 LTS 和 3.16.0 内核。systemd 示例使用了 Fedora 22 和 4.0.4 内核。您在其他系统上的结果可能有所不同。
运行 Linux大多数时候,Linux 系统都作为多用户系统而运行,通常用作服务器,在多个不同用户 id 下运行着许多不同进程。有时,它有一个图形用户界面并主要为单一用户服务,而其他时候它是一个为许多用户服务的无头服务器。当您需要执行某些系统维护时,您不希望所有这些用户都尝试完成操作,所以您需要能够使用单用户模式运行该系统,而不是许多用户。您还需要干净地切换到此模式,向登录用户提供合适的警告。此外,您还需要尽快恢复常规操作。本文将展示如何做到这些。
关于本系列本教程系列可以帮助您学习 Linux 系统管理任务。您还可以使用这些教程中的资料来对 Linux Professional Institute 的 LPIC-1:Linux 服务器专业认证考试 进行应考准备。
请参阅 “ 学习 Linux,101 :LPIC-1 学习路线图 ”,查看本系列中每部教程的描述和链接。这个路线图正在开发之中,它反映了 2015 年 4 月 15 日更新的 4.0 版 LPIC-1 考试目标。在完成这些教程后,我们会将它们添加到路线图中。
本文帮助您针对 Linux Server Professional (LPIC-1) 考试 101 的主题 101 中的目标 101.3 进行应考准备。该目标的权重为 3。
前提条件要从本系列文章中获得最大收获,您应该拥有 Linux 的基本知识和一个正常工作的 Linux 系统,以便实践本文中涵盖的命令。有时程序的不同版本会得到不同的输出格式,所以您的结果可能并不总是与这里给出的清单和图完全相同。具体地讲,新的 upstart 和 systemd 系统改变了传统 System V init 进程的用户熟悉的许多方面(参阅了解详细信息)。本文首先讨论传统的 System V init 进程和它的运行级别。然后,我们将讨论更新的初始化进程 upstart 和 systemd。
System V 运行级别传统的 System V 运行级别 定义哪些任务可在 Linux 系统的当前状态(或运行级别)下完成。传统 Linux 系统支持 3 种基本运行级别,以及一种或多种针对正常操作的运行级别。基本运行级别如 表 1所示。
表 1. Linux 基本运行级别 级别 用途 0 关闭(或停止)系统 1 单用户模式,通常使用别名 s 或 S 6 重新引导系统除了基本级别之外,运行级别的用法在不同发行版中会有所不同。常见的用法集合如 表 2所示。
表 2. 其他常见 Linux 运行级别 级别 用途 2 无网络连接的多用户模式 3 带网络连接的多用户模式 5 带网络连接和 X 视窗系统的多用户模式Slackware 发行版为运行 X 视窗系统的完整系统使用运行级别 4,而不是 5。Debian 及其衍生版本(比如 Ubuntu)对任何多用户模式都会使用单一运行级别,通常为运行级别 2。请务必参阅您的发行版的文档。
System V 默认运行级别当 Linux 系统启动时,从 in /etc/inittab 中的 id: 条目确定默认运行级别。清单 1演示了来自一个 Slackware 系统的文件 /etc/inittab 的一部分,该系统被设置为在非图形多用户模式下运行。
清单 1. /etc/inittab 中的默认运行级别 # These are the default runlevels in Slackware: # 0 = halt # 1 = single user mode # 2 = unused (but configured the same as runlevel 3) # 3 = multiuser mode (default Slackware runlevel) # 4 = X11 with KDM/GDM/XDM (session managers) # 5 = unused (but configured the same as runlevel 3) # 6 = reboot # Default runlevel. (Do not set to 0 or 6) id:3:initdefault:如果您希望系统在一种不同的运行级别(假设运行级别 4)上启动,可以编辑此值。
更改运行级别可通过多种方式更改运行级别。要执行永久更改,可以编辑 /etc/inittab 并更改您在上面看到的默认级别。
如果仅需要为一次引导在不同的运行级别上启动系统,此目的也可以实现。例如,假设您刚安装了一个新内核,需要在使用新内核引导系统后,但在启动 X 视窗系统之前构建一些内核模块。您可能希望在运行级别 3 中启动系统来完成此任务。可在引导时编辑内核行(GRUB 或 GRUB 2),或者在选定的系统名称后添加一个参数 (LILO) 来实现此目的。使用一位数来指定想要的运行级别(在本例中为 3)。我们将使用一个 GRUB 示例演示该过程。假设您的 /boot/grub/menu.lst 文件包含 清单 2中所示的代码段来引导 CentOS。我们已使用反斜杠 (\) 字符将长内核行分解,以便获得美观的版面。
清单 2. 引导 CentOS 8 的典型的 GRUB 代码段 title CentOS (2.6.32-504.23.4.el6.x86_64) root (hd0,10) kernel /boot/vmlinuz-2.6.32-504.23.4.el6.x86_64 ro \ root=UUID=2f60a3b4-ef6c-4d4c-9ef4-50d7f75124a2 rd_NO_LUKS \ rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 \ crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet要在运行级别 3 中启动此系统,可等到引导条目显示后,选择此条目并输入 ‘ e ’ 来编辑它。取决于您的 GRUB 选项,您可能需要按一个键来显示引导条目,另外输入 ‘ p ’ 和一个密码来解锁编辑。我们的 CentOS 6 系统上的 GRUB 屏幕类似于 图 1。
图 1. 在 GRUB 中选择一个引导选项
在本示例中,您现在应看到显示了 root、kernel 和 initrd 行。将光标移到以 “kernel” 开头的行并按 ‘ e ’ 编辑该行。我们的 CentOS 6 系统上的 GRUB 屏幕现在类似于 图 2。
图 2. 选择内核条目进行编辑
最后,将光标移到行末,添加一个空格和数字 ‘ 3 ’。如果愿意的话,可以删除 ‘ quiet ’,或者根据需要修改其他任何参数。我们的 CentOS 6 系统上的 GRUB 屏幕现在类似于 图 3。
图 3. 将启动运行级别设置为 3
最后,按 Enter 保存更改,然后键入 ‘ b ’ 引导系统。
备注: 使用 LILO 或 GRUB 2 完成此任务的步骤与 GRUB 不同,但编辑内核启动方式的基本原理是相同的。甚至其他系统或发行版上的 GRUB 屏幕可能看起来与这里显示的也有很大区别。通常会有提示可以帮助您。 在使用 upstart 或 systemd 的系统上,运行级别是模拟的,某些地方的运作方式可能与您期望的并不完全一样。如果尝试使用 telinit 更改运行级别,这种情形尤为明显。在运行级别 3 下完成设置工作后,您可能希望切换到运行级别 5。在传统的 System V init 系统上,不需要重新引导系统。可以使用 telinit 命令切换到另一个运行级别。可使用 runlevel 命令显示前一个和当前运行级别。如果第一个输出字符是 ‘ N ’,那么运行级别自系统引导以来从未更改。清单 3演示了如何验证和更改运行级别。
清单 3. 验证和更改运行级别 [root@attic4-cent ~]# runlevel N 3 [root@attic4-cent ~]# telinit 5输入 telinit5 后,您会看到多条消息一闪而过,您的显示屏幕将切换到配置的图形登录屏幕。打开一个终端窗口并确认运行级别已更改,如 清单 4所示。
清单 4. 确认新运行级别 [ian@attic4-cent ~]$ runlevel 3 5如果使用 ls 命令显示使用 System V init 的系统(比如 Slackware 37)上的 telinit 命令的长清单,您会看到它实际上是 init 命令的符号链接。我们在 清单 5中演示了这一点。如果您的系统使用 upstart 或 systemd,可能不会出现这种情况。
清单 5. telinit - System V 风格系统上的 init 的符号链接 root@attic4:~# # Slackware 37 root@attic4:~# ls -l $(which telinit) lrwxrwxrwx 1 root root 4 Aug 28 2011 /sbin/telinit -> init*init 可执行程序知道它被调用为 init 还是 telinit , 并采取相应的行为。因为 init 在引导时被作为 PID 1 运行,所以它能够很聪明地知道您随后会使用 init 而不是 telinit 调用它。如果您这么做了,它会假设您希望它的行为与您调用 telinit 时一样。例如,您可使用 init5 代替 telinit 5 来切换到运行级别 5。
单用户模式与个人计算机操作系统(比如 DOS 或 windows)相比,Linux 天生就是一个多用户系统。但是,这在许多时候可能带来问题,比如在您需要恢复某个主要文件系统或数据库,或者安装和测试某个新硬件时。运行级别 1 或 单用户模式 是这些情形的解决办法。实际实现可能因版本不同而不同,但您通常会从一个仅包含最精简的系统的 shell 中开始。该 shell 中通常没有网络连接,没有(或仅有很少的)守护进程在运行。在一些系统上,您必须通过登录来验证身份,但在其他系统上,可以以根用户身份直接进入 shell 提示符。单用户模式可能是您的救星,但它也可能会毁坏您的系统,所以以根用户权限运行时始终要小心。在完成后,立即重新引导到正常的多用户模式。
与切换到常规多用户运行级别一样,也可以使用 telinit1 切换到单用户模式。正如 表 1中提到的,‘ s ’ 和 ‘ S ’ 是运行级别 1 的别名,所以您可以使用 telinits 代替。
干净地关闭尽管可以使用 telinit 或 init 停止多用户活动并切换到单用户模式,但这可能很冒失,会导致用户丢失工作和进程被异常终止。关闭或重新引导系统的首选方法是使用 shutdown 命令,该命令首先向所有登录用户发送一条警告消息,并阻止任何进一步登录。然后,它会告诉 init 切换运行级别。 init 进程随后向所有运行的进程发送一个 SIGTERM 信号,为它们提供机会来保存数据或适当地终止。5 秒或指定的另一个延迟时间过后, init 会发送一个 SIGKILL 信号来强制结束所有剩余的进程。
默认情况下, shutdown 会切换到运行级别 1(单用户模式)。您可以指定 -h 选项来停止系统,或者指定 -r 选项来重新引导。除了您指定的任何消息之外,还会发出一条标准消息。时间可指定为 hh:mm 格式的绝对时间,或者 n 格式的相对时间,其中 n 是距离关闭时间剩余的分钟数。对于立