Red Hat Training

A Red Hat training course is available for RHEL 8

第 15 章 使用 systemd 目标

systemd 目标由目标单元表示。目标单元文件以 .target 文件扩展结尾,它们的唯一的目的是通过依赖关系链将其他 systemd 单元分组到一起。例如,用来启动图形会话的 graphical.target unit 启动系统服务,如 GNOME 显示管理器 (gdm.service) 或 Accounts Service (accounts-daemon.service),并激活 multi-user.target unit。同样, multi-user.target 单元会启动其他基本系统服务,如 NetworkManager (NetworkManager.service) 或 D-Bus (dbus.service),并激活名为 basic.target 的另一个目标单元。

本节包含使用 systemd 目标时要执行的步骤。

15.1. SysV 运行级别和 systemd 目标之间的区别

之前的 Red Hat Enterprise Linux 版本使用 SysV init 或 Upstart 发布,并实施一组代表特定操作模式的预定义的运行级别(runlevel)。这些运行级别从 0 到 6,由系统管理员启用特定运行级别时要运行的系统服务选择定义。从 Red Hat Enterprise Linux 7 开始,运行级别的概念已被 systemd 目标替代。

Red Hat Enterprise Linux 7 是由很多预定义目标发布的,它们与之前版本中的运行级别标准集合类似。出于兼容性的原因,它还为这些直接映射到 SysV 运行级别的别名提供了别名。

下表提供了 SysV 运行级别及其对应的 systemd 目标的完整列表:

表 15.1. SysV 运行级别与 systemd 目标的比较

运行级别目标单元描述

0

runlevel0.target, poweroff.target

关闭系统。

1

runlevel1.target, rescue.target

设置救援 shell。

2

runlevel2.target, multi-user.target

设置一个非图形化的多用户系统。

3

runlevel3.target, multi-user.target

设置一个非图形化的多用户系统。

4

runlevel4.target, multi-user.target

设置一个非图形化的多用户系统。

5

runlevel5.target, graphical.target

设置图形化多用户系统。

6

runlevel6.target, reboot.target

关闭并重启系统。

下表将 SysV init 命令与 systemctl 进行比较。使用 systemctl 实用程序查看、更改或配置 systemd 目标:

重要

在系统中仍可使用 runleveltelinit 命令,并按预期工作,但只出于兼容性的原因包括,应该避免。

表 15.2. SysV init 命令与 systemctl 的比较

旧命令新命令描述

runlevel

systemctl list-units --type target

列出当前载入的目标单元。

telinit runlevel

systemctl isolate name.target

更改当前目标。

其它资源

  • man sysv init
  • man upstart init
  • man systemctl

15.2. 查看默认对象

默认目标单元由 /etc/systemd/system/default.target 文件表示。

流程

  • 要确定默认使用哪个目标单元:

    $ systemctl get-default
    graphical.target
  • 使用符号链接决定默认对象:

    $  ls -l /lib/systemd/system/default.target

15.3. 查看目标单元

默认情况下,systemctl list-units 命令只显示活跃的单元。

流程

  • 列出所有载入的单元,而不考虑它们的状态:

    $ systemctl list-units --type target --all
  • 要列出所有当前载入的目标单元:

    $ systemctl list-units --type target
    
    UNIT                  LOAD   ACTIVE SUB    DESCRIPTION
    basic.target          loaded active active Basic System
    cryptsetup.target     loaded active active Encrypted Volumes
    getty.target          loaded active active Login Prompts
    graphical.target      loaded active active Graphical Interface
    local-fs-pre.target   loaded active active Local File Systems (Pre)
    local-fs.target       loaded active active Local File Systems
    multi-user.target     loaded active active Multi-User System
    network.target        loaded active active Network
    paths.target          loaded active active Paths
    remote-fs.target      loaded active active Remote File Systems
    sockets.target        loaded active active Sockets
    sound.target          loaded active active Sound Card
    spice-vdagentd.target loaded active active Agent daemon for Spice guests
    swap.target           loaded active active Swap
    sysinit.target        loaded active active System Initialization
    time-sync.target      loaded active active System Time Synchronized
    timers.target         loaded active active Timers
    
    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.
    
    17 loaded units listed.

15.4. 更改默认对象

默认目标单元由 /etc/systemd/system/default.target 文件表示。以下流程描述了如何使用 systemctl 命令更改默认目标:

流程

  1. 要确定默认目标单元:

    # systemctl get-default
  2. 将系统配置为默认使用不同的目标单元:

    # systemctl set-default multi-user.target
    rm /etc/systemd/system/default.target
    ln -s /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target

    这个命令将 /etc/systemd/system/default.target 文件替换为到 /usr/lib/systemd/system/name.target 的符号链接,其中 name 是您要使用的目标单元的名称。使用您要默认使用的目标单元的名称替换 multi-user

  3. 重启

    # reboot

15.6. 更改当前目标

此流程解释了如何使用 systemctl 命令更改当前会话中的目标单元。

流程

  • 在当前会话中切换到不同的目标单元:

    # systemctl isolate multi-user.target

    这个命令启动名为 multi-user 以及所有依赖的单元的目标单元,并立即停止所有其他单元。

使用您要默认使用的目标单元的名称替换 multi-user

验证步骤

  • 验证新创建的 default.target:

    $ systemctl get-default
    multi-user.target

15.7. 引导至救援模式

救援模式提供了一个方便的单用户环境,它可让您在无法完成常规引导过程时修复您的系统。在救援模式中,系统会尝试挂载所有本地文件系统并启动一些重要的系统服务,但不激活网络接口或者同时允许更多的用户登录到该系统。

流程

  • 要改变当前目标并在当前会话中进入救援模式:

    # systemctl rescue
    
    Broadcast message from root@localhost on pts/0 (Fri 2013-10-25 18:23:15 CEST):
    
    The system is going down to rescue mode NOW!
    注意

    这个命令和 systemctl isolate rescue.target 类似,但它也会向目前登录到该系统的所有用户发送一个信息信息。

    要防止 systemd 发送信息,使用 --no-wall 命令行选项运行以下命令: # systemctl --no-wall rescue

15.8. 引导至紧急模式

紧急模式 提供最小的环境,并可在系统无法进入救援模式的情况下修复您的系统。在紧急模式中,系统只挂载 root 文件系统进行读取,不会尝试挂载任何其他本地文件系统,不激活网络接口,且只启动几个必要的服务。

流程

  • 要更改当前目标并进入紧急模式:

    # systemctl emergency
    注意

    这个命令和 systemctl isolate emergency.target 类似,但它也会向目前登录到该系统的所有用户发送一个信息信息。

    要防止 systemd 发送这个信息,使用 --no-wall 命令行选项运行以下命令: # systemctl --no-wall emergency