内容


学习 Linux, 101

运行级别、关机和重启

让您的系统起死回生

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 学习 Linux, 101

敬请期待该系列的后续内容。

此内容是该系列的一部分:学习 Linux, 101

敬请期待该系列的后续内容。

概述

在本文中,将了解如何关闭和重启您的 Linux 系统,警告用户系统即将关闭,并切换到单用户模式或限制性更大或更小的运行级别。您将学习:

  • 设置默认运行级别
  • 更改运行级别
  • 更改为单用户模式
  • 从命令行关闭或重启系统
  • 就主要的系统事件向用户发出警告,这些事件中包括切换到另一个运行级别
  • 正确终止流程

除非另有说明,否则本文中的示例使用的都是配备了 2.6.26 内核的 Fedora 8 系统。upstart 示例使用的是配备了 2.6.34 内核的 Fedora 13,或配备了 2.6.35 内核的 Ubuntu 10.10。而 systemd 示例使用的是配备了 3.4.4 内核的 Fedora 17。在其他系统上的结果可能不太一样。

本文可帮您准备 Linux Professional Institute 的 Junior Level Administration (LPIC-1) 考试 101 中主题 101 下的目标 101.3。该目标的权重值为 3。

请注意:本文包含适用于 LPI Exam 101: Objective Changes as of July 2, 2012 的资料。

先决条件

要充分地利用本系列文章,您应当对 Linux 以及在其中运行本文介绍的命令的 Linux 系统有一个基本的了解。在某些情况下,程序的不同版本可能使用不同的格式化输出,因此您的结果可能并不总是与本文所示的清单和图形完全一样。 尤其是,这些新的 upstart 和 systemd 系统改变了传统的 System V init 进程的用户所熟悉的很多东西 (有关的详细信息,请参阅 超越 Init)。本文主要侧重于传统的 System V init 进程,并简要介绍了 upstart 和 systemd 之间的不同之处。

运行级别

运行级别 定义了在 Linux 系统的目前状态(或运行级别)下能够完成哪些任务。每个 Linux 系统支持三种基本的运行级别,以及完成正常操作所需的一个或多个运行级别。基本的运行级别如 表 1 中所示。

表 1. Linux 的基本运行级别
级别目的
0关闭(或停止)系统
1单用户模式;通常别称为 sS
6重启系统

除了这些基本的级别之外,运行级别使用还因版本不同而有所不同。一种常见的使用设置如 表 2 所示。

表 2. 其他常见的 Linux 运行级别
级别目的
2没有联网的多用户模式
3联网的多用户模式
5联网并且使用 X Window 系统的多用户模式

Slackware 发布版本对运行了 X Window 系统的整个系统使用了运行级别 4 而非 5。Debian 及其派生物,比如 Ubuntu,对所有的多用户模式使用了单一运行级别,通常为运行级别 2。请务必参考适用于您的发布版本的文档。

默认的运行级别

在启动 Linux 系统时,默认的运行级别是由 /etc/inittab 中的 id: 条目确定的。清单 1 展示了诸如 Fedora 8 或 openSUSE 11.2 这类系统的一个典型条目,这两个系统都对 X Window 系统使用了运行级别 5。

清单 1. /etc/inittab 中默认的运行级别
[root@pinguino ~]# grep "^id:" /etc/inittab
id:5:initdefault:

如果您想在不同的运行级别下启动您的系统,比如说运行级别 3,那么可以编辑这个值。

更改运行级别

有几种更改运行级别的方法。要执行永久性的更改,可以编辑 /etc/inittab 并将默认级别更改为如上所示的级别。

如果您只需要在不同的级别上启动系统,那么可以这样做。例如,假设您刚刚安装了一个新的内核,需要在使用新的内核启动系统之后,但还没有启动 X Window 系统之前构建一些内核模块。为了完成此目标,您可能想在运行级别 3 上启动系统。为此,可以在启动系统时编辑内核行 (GRUB),或者在所选的系统名 (LILO) 之后添加一个参数。可以使用单个数字指定所需的运行级别(在本例中为 3)。我们将用一个 GRUB 示例展示这个过程。假设您的 /boot/grub/menu.lst 文件包含 清单 2 中所示的节文件 (stanza)。

清单 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. 在 GRUB 中选择一个启动选项
在 GRUB 中选择一个启动选项
在 GRUB 中选择一个启动选项

在本例中,现在应该可以看到已显示的 root、kernel 和 initrd 行。将光标移动到以 "kernel" 开头的行并按下 'e' 来编辑此行。Fedora 8 系统上的 GRUB 屏幕现在如 图 2 中所示。

图 2. 选择要编辑的内核条目
选择要编辑的内核条目
选择要编辑的内核条目

最后,将光标移动到此行的末尾,添加一个空格和数字 '3'。如果愿意的话,可以删除 'quiet',或者根据需要修改其他任何参数。Fedora 8 系统上的 GRUB 屏幕现在如 图 3 中所示。

图 3. 将开始的运行级别设置为 3
将开始的运行级别设置为 3
将开始的运行级别设置为 3

最后,按下 Enter 键来保存更改,然后键入 'b' 来启动系统。

请注意:使用 LILO 或 GRUB2 完成此任务的步骤与 GRUB 的有所不同,但编辑内核启动方式的基本原理是相同的。其他系统或其他发布上的 GRUB 屏幕也会与这里显示的屏幕大相径庭。通常会有一些提示为您提供帮助。

在完成了运行级别 3 上的设置工作后,您可能想要转至运行级别 5。幸运的是,您无需重启系统,可以使用 telinit 命令转到另一个运行级别,使用 runlevel 命令来显示之前的运行级别和现在的运行级别。如果第一个输出参数是 'N',那么在启动系统之后,运行级别就不会发生改变。清单 3 显示了运行级别的验证和更改。

清单 3. 验证和更改运行级别
[root@pinguino ~]# runlevel
N 3
[root@pinguino ~]# telinit 5

在输入 telinit 5 后,会看到几个消息闪过,随后显示器会转到已配置好了的图形登录屏幕。打开一个终端窗口,并验证 运行级别已经发生更改,如 清单 4 中所示。

清单 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 中启动。通常,不会进行联网,也不会运行守护程序(或只有极少的守护进程在运行),您必须通过登录进行身份验证,但是因为没有其他人,所以您可以直接以 root 用户的身份进入 shell 提示。单用户模式虽然是一个救急的解决方案,但也有可能毁灭您的系统,所以在以 root 身份运行时务必小心。一旦解决了这些问题,应该尽快重启到正常的多用户模式。

正如可以转换到常规的多用户运行级别一样,您也可以使用 telinit 1 转至单用户模式。正如在 表 1 中标注的那样,'s' 和 'S' 是运行级别 1 的别名,所以您也可以使用 telinit s

干净关闭

虽然可以使用 telinitinit 停止多用户活动并转至单用户模式,但这一做法很突兀,可能导致用户的工作丢失和进程异常终止。关闭或重启系统的首选方法是使用 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 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 分钟,那么在到了 15 分钟之后才会发送消息,如 清单 7 所示。清单 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 ~]# 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 信号之间存在延时。对于 telinitinitshutdown 的其他选项,请参考相应的手册页。

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, <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
是一到四个字符组成的惟一标识符。旧的版本将其限制为只允许使用两个字符,所以您经常会看到只使用两个字符的情况。
runlevels
列出了运行级别,执行适用于这个 id 的操作。如果没有列出运行级别,则执行适用于所有运行级别的操作。
action
描述了应该执行几个可能操作中的哪一个操作
process
告知当在这个行上执行操作时应该运行哪个进程(如果有的话)。

在 /etc/inittab 中可以指定的一些常见操作如 表 3 中所示。其他的可能操作可以参阅 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-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 开头,后跟一个二位数字,然后是服务的名称,如 清单 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

在这里,您会看到 auditautofs 服务在所有的运行级别中都具有 Knn 条目,在运行级别 3 和运行级别 5 中都具有 Snn 条目。S 表示在进入该运行级别时启动服务。而 K 则表示应该停止服务。链接名称中的 nn 组件指示了应该启动或停止的服务的优先顺序。在本例中,audit 先于 autofs 启动,并晚于后者停止。

有关的更多信息,请参考 initinittab 的手册页。

超越 Init

正如我们在这里所见,启动 Linux 系统的传统方法是以 UNIX System V init 进程为基础的。这涉及到加载一个初始的 RAM 磁盘 (initrd),然后将控制权传递给一个称为 init 的程序,该程序通常会作为 sysvinit 包的一部分进行安装。 init 程序是系统中的第一个进程,具有 PID(进程 ID)1。它按照预先定义的顺序运行一系列脚本来启动系统。 如果预期的东西现在不可用,那么 init 进程通常会一直等到其可用为止。虽然对于在启动时一切内容都是已知的系统和连接好的系统,这非常地有效,但对于具有在启动时可能不可用的热插拔设备、网络文件系统和网络接口的现代系统,这可能带来一些新的挑战。当然,用户可以等待硬件过很长一段时间或只是相对较长的一段时间变得可用,但这种做法可能是令人感到不满的。

在本文的后续小节中,我们将展示 System V init 的两种替代方法:upstartsystemd

Upstart

一个名为 upstart 的新的初始化进程于 2006 年在 Ubuntu 6.10 ("Edgy Eft") 中首次引入。Fedora 9 -14 以及 Red Hat Enterprise Linux (RHEL) 6 及其衍生发布版本均使用了 upstart。在 Ubuntu 等一些系统中,Upstart 已替代了 init 进程,但仍然残留了 init 的一些痕迹,upstart 可能还需要一些时间才能发挥其全部的功能。

与之前系统中使用的静态 init 脚本集不同,upstart 系统是由事件驱动的。硬件更改、开始执行任务、停止执行任务或者系统上的其他任何进程都可能触发事件。事件被用来触发任务服务(统称为 作业)。比如,连接一个 USB 驱动器有可能会导致 udev 服务发出一个 block-device-added 事件,而该事件又会导致一个已定义的任务检查 check /etc/fstab 并在适当的时候装载该驱动器。又比如,仅当某个网络以及所需文件系统资源均可用时,才可以启动 Apache web 服务器。

upstart 初始化程序替代了 /sbin/init。Upstart 作业是在 /etc/init 目录及其子目录中定义的。upstart 系统目前处理 /etc/inittab 和 System V init 脚本。在诸如最新的 Fedora 之类的系统上,/etc/inittab 有可能进包含 init 默认操作的 id 条目。最新的 Ubuntu 系统默认情况下没有提供 /etc/inittab,尽管您可以在想要指定默认运行级别的时候创建它。

Upstart 还具有允许与 upstart init 守护程序进行交互的 initctl 命令。这允许您启动或停止作业、列出作业、获取作业状态、发出事件、重启 init 进程等。清单 11 显示了如何使用 initctl 获取 Fedora 13 系统上的 upstart 作业的列表。

清单 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 的更多信息,请参阅 参考资料

Systemd

systemd 是另一个新兴的初始化系统。Systemd 由 Lennart Poettering 于 2010 年初开发出来。他在一篇博文(请参阅 参考资料)中阐释了其基本原理和设计。Fedora 15、openSUSE 12.1 和 Mandriva 2011 等均采用了它。

很多守护程序进程都使用套接字进行通信。为了加速和提高系统启动的并行性,systemd 在启动时就创建了这些套接字,但是只有收到套接字的服务连接请求时才会启动相关的任务。这样一来,不必在系统初始化时启动服务,仅在第一次请求时启动服务即可。需要使用其他设施的服务可能会受到阻塞,直至这些设施可用,所以启动进程时,只需阻塞等待其他进程的那些服务。

将等待服务的理念加以扩展,systemd 使用了 autofs 来定义装载点,因而一个文件系统的装载点虽然可用,但实际的装载可能被延时,直到有些进程试图打开该文件系统上的文件或使用某个文件。

这些理念不仅将服务的启动延迟到了需要的时候,而且还减少了检查服务之间的依赖关系的需要,因为在服务本身可用的很长一段时间之前,服务接口就已经准备就绪。

类似于 upstart,systemd 可以从 /etc/inittab 处理现有的初始化。它还可以处理 /etc/fstab 来控制文件系统的装载。本地 systemd 初始化涉及到单元的概念,而单元又可以分组为 control groupcgroup

  • Service 单元是一些能够启动、停止、重启、重加载的守护程序。
  • Socket 单元封装了文件系统中或 Internet 上的一个套接字。
  • Device 单元封装了 Linux 设备树中的一个设备。
  • Mount 单元封装了文件系统层次结构中的一个装载点。
  • Automount 单元封装了文件系统层次结构中的一个自动装载点。
  • Target 单元将其他单元组合在一起,为其他多个单元提供了单个控制单元。
  • Snapshot 单元引用了其他单元,并且可用来保存和回滚 init 系统的所有服务和单元的状态,比如在挂起期间。

使用一个配置文件对单元进行配置,这个配置文件包含了用后缀来表示的单元类型。比如,cups.service、rpcbind.socket 后 getty.target。系统配置文件的位置,比如 /etc/systemd/system,可以通过 pkg-config 命令来确定,如 清单 11 所示,它显示了 Fedora 17 系统上的一个位置。Systemd 还可检查 /usr/local/lib/systemd/system 和 /usr/lib/systemd/system 来获得配置信息。

清单 12. 定位 systemd 的系统配置目录
[ian@attic4 ~]$ pkg-config systemd --variable=systemdsystemconfdir
/etc/systemd/system

systemctl 命令允许您询问和控制 systemd 守护程序,包括启动和停止单元,或者列出其状态。清单 13 展示了如何使用 systemctl 来显示 systemd 单元的状态。

清单 13. 来自 systemctl 的部分输出
[ian@attic4 ~]$ systemctl --no-pager
UNIT                      LOAD   ACTIVE SUB       JOB DESCRIPTION
proc-sys...misc.automount loaded active running       Arbitrary Executable File
sys-devi...et-eth0.device loaded active plugged       RTL8111/8168B PCI Express
sys-devi...da-sda1.device loaded active plugged       WDC_WD6401AALS-00L3B2
sys-devi...a-sda10.device loaded active plugged       WDC_WD6401AALS-00L3B2
sys-devi...a-sda11.device loaded active plugged       WDC_WD6401AALS-00L3B2
sys-devi...a-sda12.device loaded active plugged       WDC_WD6401AALS-00L3B2
sys-devi...da-sda2.device loaded active plugged       WDC_WD6401AALS-00L3B2
...
systemd-...ssions.service loaded active exited        Permit User Sessions
systemd-...-setup.service loaded active exited        Setup Virtual Console
tcsd.service              loaded failed failed        LSB: Init script for TCSD
udev-settle.service       loaded active exited        udev Wait for Complete Dev
udev-trigger.service      loaded active exited        udev Coldplug all Devices
udev.service              loaded active running       udev Kernel Device Manager
udisks2.service           loaded active running       Storage Daemon
upower.service            loaded active running       Daemon for power managemen
avahi-daemon.socket       loaded active listening     Avahi mDNS/DNS-SD Stack Ac
cups.socket               loaded active running       CUPS Printing Service Sock
...
syslog.target             loaded active active        Syslog
systemd-...ted-ntp.target loaded active active        Network Time Protocol
systemd-...ead-done.timer loaded active elapsed       Stop Read-Ahead Data Colle
systemd-...es-clean.timer loaded active waiting       Daily Cleanup of Temporary

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
JOB    = Pending job for the unit.

132 units listed. Pass --all to see inactive units, too.

要了解有关 systemd 的更多信息,请参阅 参考资料

至此,就完成了对 Linux 运行级别、关机和重启的简介。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=620280
ArticleTitle=学习 Linux, 101: 运行级别、关机和重启
publish-date=11052012