使用 systemctl 命令管理 systemd 单元

单元是 systemd 中一切的基础。
101 位读者喜欢这篇文章。
woman on laptop sitting at the window

CC BY 3.0 US Mapbox Uncharted ERG

在本系列的头两篇文章中,我探讨了 Linux systemd 启动顺序。在第一篇文章中,我了解了 systemd 的功能和架构,以及围绕其作为旧 SystemV init 程序和启动脚本替代方案的争议。在第二篇文章中,我检查了两个重要的 systemd 工具 systemctl 和 journalctl,并解释了如何从一个 target 切换到另一个 target,以及如何更改默认 target。

在第三篇文章中,我将更详细地了解 systemd 单元,以及如何使用 systemctl 命令来探索和管理单元。我还将解释如何停止和禁用单元,以及如何创建一个新的 systemd 挂载单元来挂载新的文件系统,并使其能够在启动期间启动。

准备工作

本文中的所有实验都应以 root 用户身份完成(除非另有说明)。一些仅列出各种 systemd 单元的命令可以由非 root 用户执行,但进行更改的命令则不能。确保仅在非生产主机或虚拟机 (VM) 上执行所有这些实验。

其中一个实验需要 sysstat 包,因此请在继续之前安装它。对于 Fedora 和其他基于 Red Hat 的发行版,你可以使用以下命令安装 sysstat:

dnf -y install sysstat

sysstat RPM 安装了几个可用于问题确定的统计工具。其中之一是系统活动报告 (SAR),它以固定间隔(默认为每 10 分钟)记录许多系统性能数据点。sysstat 包不是作为后台守护进程运行,而是安装了两个 systemd 定时器。一个定时器每 10 分钟运行一次以收集数据,另一个定时器每天运行一次以聚合每日数据。在本文中,我将简要介绍这些定时器,但将在以后的文章中解释如何创建定时器。

systemd 套件

事实是,systemd 不仅仅是一个程序。它是一个大型程序套件,所有程序都旨在协同工作,以管理正在运行的 Linux 系统的几乎所有方面。对 systemd 的全面阐述本身需要一本书。我们大多数人不需要了解 systemd 的所有组件如何组合在一起的所有细节,因此我将重点关注使你能够管理各种 Linux 服务并处理日志文件和日志的程序和组件。

实际结构

systemd 的结构——除了其可执行文件之外——包含在其许多配置文件中。尽管这些文件具有不同的名称和标识符扩展名,但它们都称为“单元”文件。单元是 systemd 中一切的基础。

单元文件是 ASCII 纯文本文件,系统管理员可以访问、创建或修改这些文件。有许多单元文件类型,每种类型都有自己的 man 页面。图 1 按文件名扩展名和每个文件的简短描述列出了一些单元文件类型。

systemd 单元 描述
.automount .automount 单元用于实现按需(即插即用)并在启动期间并行挂载文件系统单元。
.device .device 单元文件定义了在 /dev/directory 中向系统管理员公开的硬件和虚拟设备。并非所有设备都有单元文件;通常,诸如硬盘驱动器、网络设备和一些其他设备之类的块设备具有单元文件。
.mount .mount 单元定义了 Linux 文件系统目录结构上的一个挂载点。
.scope .scope 单元定义和管理一组系统进程。此单元不是使用单元文件配置的,而是以编程方式创建的。根据 systemd.scope 手册页,“scope 单元的主要目的是对系统服务的工作进程进行分组,以便进行组织和管理资源。”
.service .service 单元文件定义了由 systemd 管理的进程。这些进程包括 crond、cups (通用 Unix 打印系统)、iptables、多个逻辑卷管理 (LVM) 服务、NetworkManager 等服务。
.slice .slice 单元定义了一个“slice”,它是与一组进程相关的系统资源的逻辑划分。你可以将所有系统资源视为一个饼图,并将此资源子集视为该饼图中的一个“slice”。
.socket .socket 单元定义了进程间通信套接字,例如网络套接字。
.swap .swap 单元定义了交换设备或文件。
.target .target 单元定义了单元文件组,这些文件定义了启动同步点、运行级别和服务。Target 单元定义了为了成功启动而必须处于活动状态的服务和其他单元。
.timer .timer 单元定义了可以在指定时间启动程序执行的定时器。

图 1:一些 systemd 单元文件类型

systemctl

我在第二篇文章中介绍了 systemd 的启动功能,在这里我将进一步探讨它的服务管理功能。systemd 提供了 systemctl 命令,该命令用于启动和停止服务、配置它们在系统启动时启动(或不启动)以及监视正在运行的服务的当前状态。

在作为 root 用户的终端会话中,确保 root 的主目录 (~) 是 PWD。要开始以各种方式查看单元,请列出所有已加载和处于活动状态的 systemd 单元。systemctl 会自动通过 less 分页器管道传输其 stdout 数据流,因此你无需这样做

[root@testvm1 ~]# systemctl
UNIT                                       LOAD   ACTIVE SUB       DESCRIPTION              
proc-sys-fs-binfmt_misc.automount          loaded active running   Arbitrary Executable File>
sys-devices-pci0000:00-0000:00:01.1-ata7-host6-target6:0:0-6:0:0:0-block-sr0.device loaded a>
sys-devices-pci0000:00-0000:00:03.0-net-enp0s3.device loaded active plugged   82540EM Gigabi>
sys-devices-pci0000:00-0000:00:05.0-sound-card0.device loaded active plugged   82801AA AC'97>
sys-devices-pci0000:00-0000:00:08.0-net-enp0s8.device loaded active plugged   82540EM Gigabi>
sys-devices-pci0000:00-0000:00:0d.0-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda1.device loa>
sys-devices-pci0000:00-0000:00:0d.0-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda2.device loa>
<snip – removed lots of lines of data from here>

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.

206 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

当你在终端会话中滚动浏览数据时,请查找一些特定的内容。第一部分列出了诸如硬盘驱动器、声卡、网卡和 TTY 设备之类的设备。另一部分显示了文件系统挂载点。其他部分包括各种服务和所有已加载和处于活动状态的 target 的列表。

输出底部的 sysstat 定时器用于收集和生成 SAR 的每日系统活动摘要。SAR 是一个非常有用的解决问题的工具。(你可以在我的书使用和管理 Linux:第 1 卷,从零到系统管理员:入门的第 13 章中了解更多信息。)

在最底部附近,三行描述了状态(已加载、活动和子状态)的含义。按 q 退出分页器。

使用以下命令(如上面输出的最后一行所示)查看所有已安装的单元,无论它们是否已加载。我不会在此处重现输出,因为你可以自己滚动浏览它。systemctl 程序具有出色的选项卡补全功能,使你可以轻松输入复杂的命令,而无需记住所有选项

[root@testvm1 ~]# systemctl list-unit-files

你可以看到某些单元已被禁用。systemctl 的手册页中的表 1 列出了你可能在此列表中看到的条目,并提供了简短的描述。使用 -t(类型)选项仅查看定时器单元

[root@testvm1 ~]# systemctl list-unit-files -t timer
UNIT FILE                    STATE   
chrony-dnssrv@.timer         disabled
dnf-makecache.timer          enabled 
fstrim.timer                 disabled
logrotate.timer              disabled
logwatch.timer               disabled
mdadm-last-resort@.timer     static  
mlocate-updatedb.timer       enabled 
sysstat-collect.timer        enabled 
sysstat-summary.timer        enabled 
systemd-tmpfiles-clean.timer static  
unbound-anchor.timer         enabled

你可以使用以下替代方法执行相同的操作,该方法提供了更多详细信息

[root@testvm1 ~]# systemctl list-timers
Thu 2020-04-16 09:06:20 EDT  3min 59s left n/a                          n/a           systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Thu 2020-04-16 10:02:01 EDT  59min left    Thu 2020-04-16 09:01:32 EDT  49s ago       dnf-makecache.timer          dnf-makecache.service
Thu 2020-04-16 13:00:00 EDT  3h 57min left n/a                          n/a           sysstat-collect.timer        sysstat-collect.service
Fri 2020-04-17 00:00:00 EDT  14h left      Thu 2020-04-16 12:51:37 EDT  3h 49min left mlocate-updatedb.timer       mlocate-updatedb.service
Fri 2020-04-17 00:00:00 EDT  14h left      Thu 2020-04-16 12:51:37 EDT  3h 49min left unbound-anchor.timer         unbound-anchor.service
Fri 2020-04-17 00:07:00 EDT  15h left      n/a                          n/a           sysstat-summary.timer        sysstat-summary.service

6 timers listed.
Pass --all to see loaded but inactive timers, too.
[root@testvm1 ~]#

虽然没有执行 systemctl list-mounts 的选项,但你可以列出挂载点单元文件

[root@testvm1 ~]# systemctl list-unit-files -t mount
UNIT FILE                     STATE    
-.mount                       generated
boot.mount                    generated
dev-hugepages.mount           static   
dev-mqueue.mount              static   
home.mount                    generated
proc-fs-nfsd.mount            static   
proc-sys-fs-binfmt_misc.mount disabled 
run-vmblock\x2dfuse.mount     disabled 
sys-fs-fuse-connections.mount static   
sys-kernel-config.mount       static   
sys-kernel-debug.mount        static   
tmp.mount                     generated
usr.mount                     generated
var-lib-nfs-rpc_pipefs.mount  static   
var.mount                     generated

15 unit files listed.
[root@testvm1 ~]#

此数据流中的 STATE 列很有趣,需要一些解释。“generated”状态表明挂载单元是在启动期间使用 /etc/fstab 中的信息动态生成的。生成这些挂载单元的程序是 /lib/systemd/system-generators/systemd-fstab-generator,以及生成许多其他单元类型的其他工具。“static”挂载单元用于诸如 /proc/sys 之类的文件系统,这些文件位于 /usr/lib/systemd/system 目录中。

现在,看一下服务单元。此命令将显示主机上安装的所有服务,无论它们是否处于活动状态

[root@testvm1 ~]# systemctl --all -t service

此服务单元列表的底部显示我的主机上已加载单元的总数为 166。你的数量可能不同。

单元文件没有文件名扩展名(例如 .unit)来帮助识别它们,因此你可以概括地说,属于 systemd 的大多数配置文件都是一种或另一种类型的单元文件。剩余的少数文件主要是位于 /etc/systemd 中的 .conf 文件。

单元文件存储在 /usr/lib/systemd 目录及其子目录中,而 /etc/systemd/ 目录及其子目录包含指向此主机本地配置所需的单元文件的符号链接。

要探索这一点,请将 /etc/systemd 设置为 PWD 并列出其内容。然后将 /etc/systemd/system 设置为 PWD 并列出其内容,并列出至少几个当前 PWD 子目录的内容。

查看 default.target 文件,它决定了系统启动时进入哪个运行级别目标。在本系列文章的第二篇中,我解释了如何将默认目标从 GUI (graphical.target) 更改为仅命令行 (multi-user.target) 目标。在我测试 VM 上的 default.target 文件只是 /usr/lib/systemd/system/graphical.target 的一个符号链接。

花几分钟时间检查 /etc/systemd/system/default.target 文件的内容。

[root@testvm1 system]# cat default.target 
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes

请注意,这需要 multi-user.target;如果 multi-user.target 尚未启动并运行,则 graphical.target 无法启动。它还表明它“想要” display-manager.service 单元。为了单元成功启动,“想要”并不需要被满足。如果“想要”无法被满足,systemd 将忽略它,并且目标的其余部分将照常启动。

/etc/systemd/system 中的子目录是各种目标的“想要”列表。花几分钟时间浏览 /etc/systemd/system/graphical.target.wants 目录中的文件及其内容。

systemd.unit 手册页包含大量关于单元文件、它们的结构、它们可以被划分成的部分以及可以使用的选项的有用信息。它还列出了许多单元类型,所有这些类型都有自己的手册页。如果您想解释一个单元文件,这将是一个不错的起点。

服务单元

Fedora 安装通常会安装和启用某些主机正常运行不需要的服务。相反,有时它不包含需要安装、启用和启动的服务。对于 Linux 主机而言,这些功能不是必需的,但是已被安装并可能正在运行的服务,代表了一种安全风险,应该至少停止和禁用它们,最好应该卸载它们。

systemctl 命令用于管理 systemd 单元,包括服务、目标、挂载等等。仔细查看服务列表,以识别永远不会使用的服务。

[root@testvm1 ~]# systemctl --all -t service
UNIT                           LOAD      ACTIVE SUB        DESCRIPTION                             
<snip>
chronyd.service                loaded    active running    NTP client/server                       
crond.service                  loaded    active running    Command Scheduler                       
cups.service                   loaded    active running    CUPS Scheduler                          
dbus-daemon.service            loaded    active running    D-Bus System Message Bus                
<snip>
● ip6tables.service           not-found inactive dead     ip6tables.service                   
● ipset.service               not-found inactive dead     ipset.service                       
● iptables.service            not-found inactive dead     iptables.service                    
<snip>
firewalld.service              loaded    active   running  firewalld - dynamic firewall daemon
<snip>
● ntpd.service                not-found inactive dead     ntpd.service                        
● ntpdate.service             not-found inactive dead     ntpdate.service                     
pcscd.service                  loaded    active   running  PC/SC Smart Card Daemon

我已经从命令的输出中删除了大部分内容以节省空间。显示“loaded active running”的服务很明显。“not-found”服务是 systemd 知道但未安装在 Linux 主机上的服务。如果您想运行这些服务,则必须安装包含它们的软件包。

请注意 pcscd.service 单元。这是 PC/SC 智能卡守护程序。它的功能是与智能卡读卡器通信。许多 Linux 主机(包括 VM)都不需要此读卡器,也不需要加载并占用内存和 CPU 资源的服务。您可以停止此服务并禁用它,以便它不会在下次启动时重新启动。首先,检查其状态。

[root@testvm1 ~]# systemctl status pcscd.service
● pcscd.service - PC/SC Smart Card Daemon
   Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; vendor preset: disabled)
   Active: active (running) since Fri 2019-05-10 11:28:42 EDT; 3 days ago
     Docs: man:pcscd(8)
 Main PID: 24706 (pcscd)
    Tasks: 6 (limit: 4694)
   Memory: 1.6M
   CGroup: /system.slice/pcscd.service
           └─24706 /usr/sbin/pcscd --foreground --auto-exit

May 10 11:28:42 testvm1 systemd[1]: Started PC/SC Smart Card Daemon.

此数据说明了 systemd 提供的额外信息与 SystemV 相比,后者仅报告服务是否正在运行。请注意,指定 .service 单元类型是可选的。现在停止并禁用该服务,然后重新检查其状态。

[root@testvm1 ~]# systemctl stop pcscd ; systemctl disable pcscd
Warning: Stopping pcscd.service, but it can still be activated by:
  pcscd.socket
Removed /etc/systemd/system/sockets.target.wants/pcscd.socket.
[root@testvm1 ~]# systemctl status pcscd
● pcscd.service - PC/SC Smart Card Daemon
   Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2019-05-13 15:23:15 EDT; 48s ago
     Docs: man:pcscd(8)
 Main PID: 24706 (code=exited, status=1/FAILURE)

May 10 11:28:42 testvm1 systemd[1]: Started PC/SC Smart Card Daemon.
May 13 15:23:15 testvm1 systemd[1]: Stopping PC/SC Smart Card Daemon...
May 13 15:23:15 testvm1 systemd[1]: pcscd.service: Main process exited, code=exited, status=1/FAIL>
May 13 15:23:15 testvm1 systemd[1]: pcscd.service: Failed with result 'exit-code'.
May 13 15:23:15 testvm1 systemd[1]: Stopped PC/SC Smart Card Daemon.

大多数服务的简短日志条目显示,避免了必须搜索各种日志文件来查找此类信息。检查系统运行级别目标的状态——需要指定“target”单元类型。

[root@testvm1 ~]# systemctl status multi-user.target
● multi-user.target - Multi-User System
   Loaded: loaded (/usr/lib/systemd/system/multi-user.target; static; vendor preset: disabled)
   Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago
     Docs: man:systemd.special(7)

May 09 13:27:22 testvm1 systemd[1]: Reached target Multi-User System.
[root@testvm1 ~]# systemctl status graphical.target
● graphical.target - Graphical Interface
   Loaded: loaded (/usr/lib/systemd/system/graphical.target; indirect; vendor preset: disabled)
   Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago
     Docs: man:systemd.special(7)

May 09 13:27:22 testvm1 systemd[1]: Reached target Graphical Interface.
[root@testvm1 ~]# systemctl status default.target
● graphical.target - Graphical Interface
   Loaded: loaded (/usr/lib/systemd/system/graphical.target; indirect; vendor preset: disabled)
   Active: active since Thu 2019-05-09 13:27:22 EDT; 4 days ago
     Docs: man:systemd.special(7)

May 09 13:27:22 testvm1 systemd[1]: Reached target Graphical Interface.

默认目标是图形目标。可以使用此方法检查任何单元的状态。

旧的挂载方式

挂载单元定义了在指定挂载点上挂载文件系统所需的所有参数。与使用 /etc/fstab 文件系统配置文件相比,systemd 可以更灵活地管理挂载单元。尽管如此,systemd 仍然使用 /etc/fstab 文件进行文件系统配置和挂载。systemd 使用 systemd-fstab-generator 工具从 fstab 文件中的数据创建瞬态挂载单元。

我将创建一个新的文件系统和一个 systemd 挂载单元来挂载它。如果您的测试系统上有可用磁盘空间,您可以和我一起做。

请注意,您的测试系统上的卷组和逻辑卷名称可能不同。请务必使用与您的系统相关的名称。

您需要创建一个分区或逻辑卷,然后在上面创建一个 EXT4 文件系统。向文件系统添加标签 TestFS,并为挂载点 /TestFS 创建一个目录。

要在您自己的系统上尝试此操作,首先,验证您在卷组上是否有可用空间。这是我的 VM 上的样子,我在卷组上有可用空间来创建一个新的逻辑卷。

[root@testvm1 ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0  120G  0 disk 
├─sda1          8:1    0    4G  0 part /boot
└─sda2          8:2    0  116G  0 part 
  ├─VG01-root 253:0    0    5G  0 lvm  /
  ├─VG01-swap 253:1    0    8G  0 lvm  [SWAP]
  ├─VG01-usr  253:2    0   30G  0 lvm  /usr
  ├─VG01-home 253:3    0   20G  0 lvm  /home
  ├─VG01-var  253:4    0   20G  0 lvm  /var
  └─VG01-tmp  253:5    0   10G  0 lvm  /tmp
sr0            11:0    1 1024M  0 rom  
[root@testvm1 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree  
  VG01   1   6   0 wz--n- <116.00g <23.00g

然后在 VG01 上创建一个名为 TestFS 的新卷。它不需要很大;1GB 就可以了。然后创建一个文件系统,添加文件系统标签,并创建挂载点。

[root@testvm1 ~]# lvcreate -L 1G -n TestFS VG01
  Logical volume "TestFS" created.
[root@testvm1 ~]# mkfs -t ext4 /dev/mapper/VG01-TestFS
mke2fs 1.45.3 (14-Jul-2019)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 8718fba9-419f-4915-ab2d-8edf811b5d23
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

[root@testvm1 ~]# e2label /dev/mapper/VG01-TestFS TestFS
[root@testvm1 ~]# mkdir /TestFS

现在,挂载新的文件系统。

[root@testvm1 ~]# mount /TestFS/
mount: /TestFS/: can't find in /etc/fstab.

这将不起作用,因为您的 /etc/fstab 中没有条目。即使没有 /etc/fstab 中的条目,您也可以使用设备名称(因为它出现在 /dev 中)和挂载点来挂载新的文件系统。以这种方式挂载比过去更简单——过去需要将文件系统类型作为参数。现在 mount 命令足够智能,可以检测文件系统类型并相应地挂载它。

再试一次。

[root@testvm1 ~]# mount /dev/mapper/VG01-TestFS /TestFS/
[root@testvm1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  120G  0 disk 
├─sda1            8:1    0    4G  0 part /boot
└─sda2            8:2    0  116G  0 part 
  ├─VG01-root   253:0    0    5G  0 lvm  /
  ├─VG01-swap   253:1    0    8G  0 lvm  [SWAP]
  ├─VG01-usr    253:2    0   30G  0 lvm  /usr
  ├─VG01-home   253:3    0   20G  0 lvm  /home
  ├─VG01-var    253:4    0   20G  0 lvm  /var
  ├─VG01-tmp    253:5    0   10G  0 lvm  /tmp
  └─VG01-TestFS 253:6    0    1G  0 lvm  /TestFS
sr0              11:0    1 1024M  0 rom  
[root@testvm1 ~]#

现在,新的文件系统已挂载在正确的位置。列出挂载单元文件。

[root@testvm1 ~]# systemctl list-unit-files -t mount

此命令不显示 /TestFS 文件系统的文件,因为它不存在该文件。命令 systemctl status TestFS.mount 也不显示有关新文件系统的任何信息。您可以尝试将通配符与 systemctl status 命令一起使用。

[root@testvm1 ~]# systemctl status *mount
● usr.mount - /usr
   Loaded: loaded (/etc/fstab; generated)
   Active: active (mounted)
    Where: /usr
     What: /dev/mapper/VG01-usr
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)

<SNIP>
● TestFS.mount - /TestFS
   Loaded: loaded (/proc/self/mountinfo)
   Active: active (mounted) since Fri 2020-04-17 16:02:26 EDT; 1min 18s ago
    Where: /TestFS
     What: /dev/mapper/VG01-TestFS

● run-user-0.mount - /run/user/0
   Loaded: loaded (/proc/self/mountinfo)
   Active: active (mounted) since Thu 2020-04-16 08:52:29 EDT; 1 day 5h ago
    Where: /run/user/0
     What: tmpfs

● var.mount - /var
   Loaded: loaded (/etc/fstab; generated)
   Active: active (mounted) since Thu 2020-04-16 12:51:34 EDT; 1 day 1h ago
    Where: /var
     What: /dev/mapper/VG01-var
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
    Tasks: 0 (limit: 19166)
   Memory: 212.0K
      CPU: 5ms
   CGroup: /system.slice/var.mount

此命令提供了有关系统挂载的一些非常有趣的信息,并且您的新文件系统会显示出来。/var/usr 文件系统被标识为从 /etc/fstab 生成的,而您的新文件系统只是显示它已加载并提供 /proc/self/mountinfo 文件中 info 文件的位置。

接下来,自动化此挂载。首先,以传统方式通过在 /etc/fstab 中添加条目来完成。稍后,我将向您展示如何以新的方式完成它,这将教您如何创建单元并将它们集成到启动序列中。

卸载 /TestFS 并在 /etc/fstab 文件中添加以下行。

/dev/mapper/VG01-TestFS  /TestFS       ext4    defaults        1 2

现在,使用更简单的 mount 命令挂载文件系统并再次列出挂载单元。

[root@testvm1 ~]# mount /TestFS
[root@testvm1 ~]# systemctl status *mount
<SNIP>
● TestFS.mount - /TestFS
   Loaded: loaded (/proc/self/mountinfo)
   Active: active (mounted) since Fri 2020-04-17 16:26:44 EDT; 1min 14s ago
    Where: /TestFS
     What: /dev/mapper/VG01-TestFS
<SNIP>

这没有更改此挂载的信息,因为文件系统是手动挂载的。重新启动并再次运行该命令,这次指定 TestFS.mount 而不是使用通配符。此挂载的结果现在与其在启动时挂载的情况一致。

[root@testvm1 ~]# systemctl status TestFS.mount
● TestFS.mount - /TestFS
   Loaded: loaded (/etc/fstab; generated)
   Active: active (mounted) since Fri 2020-04-17 16:30:21 EDT; 1min 38s ago
    Where: /TestFS
     What: /dev/mapper/VG01-TestFS
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
    Tasks: 0 (limit: 19166)
   Memory: 72.0K
      CPU: 6ms
   CGroup: /system.slice/TestFS.mount

Apr 17 16:30:21 testvm1 systemd[1]: Mounting /TestFS...
Apr 17 16:30:21 testvm1 systemd[1]: Mounted /TestFS.

创建挂载单元

可以使用传统的 /etc/fstab 文件或 systemd 单元配置挂载单元。Fedora 使用在安装期间创建的 fstab 文件。但是,systemd 使用 systemd-fstab-generator 程序将 fstab 文件转换为 fstab 文件中每个条目的 systemd 单元。既然您知道可以使用 systemd .mount 单元文件进行文件系统挂载,请通过为此文件系统创建一个挂载单元来尝试一下。

首先,卸载 /TestFS。编辑 /etc/fstab 文件并删除或注释掉 TestFS 行。现在,在 /etc/systemd/system 目录中创建一个名为 TestFS.mount 的新文件。对其进行编辑以包含以下配置数据。单元文件名和挂载点的名称必须相同,否则挂载将失败。

# This mount unit is for the TestFS filesystem
# By David Both
# Licensed under GPL V2
# This file should be located in the /etc/systemd/system directory

[Unit]
Description=TestFS Mount

[Mount]
What=/dev/mapper/VG01-TestFS
Where=/TestFS
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target

[Unit] 部分中的 Description 行是供我们人类使用的,它提供了当您使用 systemctl -t mount 列出挂载单元时显示的名称。此文件的 [Mount] 部分中的数据基本上包含与 fstab 文件中找到的数据相同的数据。

现在启用挂载单元。

[root@testvm1 etc]# systemctl enable TestFS.mount
Created symlink /etc/systemd/system/multi-user.target.wants/TestFS.mount → /etc/systemd/system/TestFS.mount.

这将在 /etc/systemd/system 目录中创建符号链接,这将导致此挂载单元在所有后续启动时被挂载。文件系统尚未挂载,因此您必须“启动”它。

[root@testvm1 ~]# systemctl start TestFS.mount

验证文件系统是否已挂载。

[root@testvm1 ~]# systemctl status TestFS.mount
● TestFS.mount - TestFS Mount
   Loaded: loaded (/etc/systemd/system/TestFS.mount; enabled; vendor preset: disabled)
   Active: active (mounted) since Sat 2020-04-18 09:59:53 EDT; 14s ago
    Where: /TestFS
     What: /dev/mapper/VG01-TestFS
    Tasks: 0 (limit: 19166)
   Memory: 76.0K
      CPU: 3ms
   CGroup: /system.slice/TestFS.mount

Apr 18 09:59:53 testvm1 systemd[1]: Mounting TestFS Mount...
Apr 18 09:59:53 testvm1 systemd[1]: Mounted TestFS Mount.

此实验专门关于为挂载创建单元文件,但它也可以应用于其他类型的单元文件。细节会有所不同,但概念是相同的。是的,我知道将一行添加到 /etc/fstab 文件仍然比创建挂载单元更容易。但这是如何创建单元文件的一个很好的例子,因为 systemd 没有每种单元类型的生成器。

总结

本文更详细地介绍了 systemd 单元,以及如何使用 systemctl 命令来探索和管理单元。它还展示了如何停止和禁用单元,以及如何创建一个新的 systemd 挂载单元来挂载一个新的文件系统并使其能够在启动期间启动。

在本系列的下一篇文章中,我将带您了解我最近在启动期间遇到的问题,并向您展示我如何使用 systemd 绕过它。

资源

互联网上有很多关于 systemd 的信息,但很多信息都很简洁、晦涩甚至具有误导性。除了本文中提到的资源外,以下网页还提供了关于 systemd 启动的更详细和可靠的信息。

  • Fedora 项目有一个很好的、实用的 指南 到 systemd。它几乎拥有您需要知道的所有内容,以便使用 systemd 配置、管理和维护 Fedora 计算机。
  • Fedora 项目还有一个很好的 速查表,它将旧的 SystemV 命令与可比较的 systemd 命令进行交叉引用。
  • 有关 systemd 的详细技术信息以及创建它的原因,请查看 Freedesktop.orgsystemd 描述
  • Linux.com 的“更多 systemd 乐趣”提供了更高级的 systemd 信息和技巧

Lennart Poettering,systemd的设计者和主要开发者,也为 Linux 系统管理员撰写了一系列深入的技术文章。这些文章写于 2010 年 4 月至 2011 年 9 月期间,但它们现在仍然和当时一样具有参考价值。关于 systemd 及其生态系统的许多其他优秀文章都基于这些论文。

接下来阅读什么

学会喜爱 systemd

systemd 是所有进程之母,负责将 Linux 主机启动到可以进行生产性工作的状态。

David Both
David Both 是一个开源软件和 GNU/Linux 的倡导者、培训师、作家和演讲者。他自 1996 年以来一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员 Linux 哲学”的坚定支持者和传播者。

2 条评论

非常有信息量和详细的帖子!
继续写作

我是一个非技术 Fedora 用户,在生物医学领域从事学术工作。我的笔记本电脑和台式电脑上都安装了 Fedora 32 工作站,我最常用的程序是 LibreOffice、Firefox、Gimp、R 统计软件包和 ImageJ。

我知道在特定的 Fedora 安装中,有一些服务是不必要的,在这篇综合性的文章中,您提出了一些非常重要的观点,例如

“Fedora 安装通常会安装并启用特定主机正常运行不需要的服务。”

“不需要 Linux 主机按预期运行的服务,如果已安装并可能正在运行,则代表着安全风险”

“许多 Linux 主机(包括虚拟机)不需要此阅读器,也不需要加载并占用内存和 CPU 资源的服务。”

所以我想知道在运行 Fedora 32 工作站的电脑上,我可以安全地禁用哪些服务。

祝好

© . All rights reserved.