如何使用systemd在没有fstab的情况下挂载文件系统(CentOS/RHEL 7/8)

时间:2020-01-09 10:42:38  来源:igfitidea点击:

我们使用/etc/fstab挂载文件系统,以使更改在重新引导后永久存在。
现在,有另一种方法可以使用systemd在不使用fstab的情况下挂载文件系统。

在CentOS/RHEL 7和8中,我们可以创建systemd单元文件来挂载文件系统,而没有用于相应分区和/或者文件系统的fstab。
可以针对当前会话进行这些更改,也可以永久重新启动。

如果在RHEL/CentOS 7和8中检查/etc/fstab,我们会发现它包含的条目很少,因为大多数分区(特别是tmpfs)分区现在是使用systemd单元文件而不是/etc/fstab挂载的。

以下是我的/etc/fstab文件。
这是一个非常基本的设置,所以我只有3个条目

[root@rhel-8 system]# cat /etc/fstab
/dev/mapper/rhel-root  /                     ext4    defaults        1 1
UUID=abf4aa90-0b58-499a-b601-bc5f208fd2cd /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

虽然我有更多可用的分区安装在我的RHEL系统上,但大多数是tmpfs分区

[root@rhel-8 system]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               900M     0  900M   0% /dev
tmpfs                  915M     0  915M   0% /dev/shm
tmpfs                  915M  8.5M  907M   1% /run
tmpfs                  915M     0  915M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   15G  2.1G   12G  16% /
/dev/sda1              483M  258M  225M  54% /boot
tmpfs                  183M     0  183M   0% /run/user/0

如果我们碰巧在/etc/fstab文件中配置文件系统,则系统将在运行环境中将这些条目简单地转换为动态安装单元类型。
我们可以在/run/systemd/generator下看到这些动态创建的系统安装单元类型。

[root@rhel-8 system]# ls -l /run/systemd/generator/
total 12
-rw-r--r--. 1 root root 254 Sep 16 12:37  boot.mount
-rw-r--r--. 1 root root 230 Sep 16 12:37 'dev-mapper-rhelx2dswap.swap'
drwxr-xr-x. 2 root root  80 Sep 16 12:37  local-fs.target.requires
drwxr-xr-x. 2 root root  60 Sep 16 12:37  local-fs.target.wants
-rw-r--r--. 1 root root 218 Sep 16 12:37  -.mount  <--- This is for/(root) filesystem
drwxr-xr-x. 2 root root  60 Sep 16 12:37  swap.target.requires

列出当前安装的系统单元

要查看当前正在加载的正在挂载文件系统的systemd单元文件,可以使用以下命令:

[root@rhel-8 system]# systemctl -t mount
UNIT                    LOAD   ACTIVE SUB     DESCRIPTION
-.mount                 loaded active mounted Root Mount
boot.mount              loaded active mounted /boot
dev-hugepages.mount     loaded active mounted Huge Pages File System
dev-mqueue.mount        loaded active mounted POSIX Message Queue File System
run-user-0.mount        loaded active mounted /run/user/0
sys-kernel-config.mount loaded active mounted Kernel Configuration File System
sys-kernel-debug.mount  loaded active mounted Kernel Debug File System
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.
7 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

如我们所见,当前在我的RHEL系统上加载了7个单元。

系统安装点的位置

默认情况下,所有用于挂载文件系统的systemd单元文件都在/usr/lib/systemd/system中可用。

[root@rhel-8 ~]# cd /usr/lib/systemd/system

名称以.mount结尾的单元配置文件编码有关由systemd控制和管理的文件系统安装点的信息。

[root@rhel-8 system]# ls -l *.mount
-rw-r--r--. 1 root root 750 Jun 22  2016 dev-hugepages.mount
-rw-r--r--. 1 root root 665 Jun 22  2016 dev-mqueue.mount
-rw-r--r--. 1 root root 655 Jun 22  2016 proc-sys-fs-binfmt_misc.mount
-rw-r--r--. 1 root root 795 Jun 22  2016 sys-fs-fuse-connections.mount
-rw-r--r--. 1 root root 767 Jun 22  2016 sys-kernel-config.mount
-rw-r--r--. 1 root root 710 Jun 22  2016 sys-kernel-debug.mount
-rw-r--r--. 1 root root 704 Jun 22  2016 tmp.mount

创建文件系统

现在,出于本文的目的,我将创建/dev/sdb1来演示不带fstab的装载文件系统。
由于本文与本主题无关,因此我删除了创建文件系统所需的其他步骤。

[root@rhel-8 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.44.3 (10-July-2016)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: cea0757d-6329-4bf8-abbf-03f9c313b07f
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

获取文件系统的UUID

要在不使用fstab的情况下挂载文件系统,我们将使用systemd单元文件,但将使用分区的UUID而不是文件系统/分区名称。

我已经展示了两种获取文件系统的UUID的方法

[root@rhel-8 system]# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx. 1 root root  9 Sep 16 11:23 2019-04-04-08-40-23-00 -> ../../sr0
lrwxrwxrwx. 1 root root 10 Sep 16 11:23 2796b6a6-1080-4f7c-a902-b4438f071e6c -> ../../dm-4
lrwxrwxrwx. 1 root root 10 Sep 16 11:23 abf4aa90-0b58-499a-b601-bc5f208fd2cd -> ../../sda1
lrwxrwxrwx. 1 root root 10 Sep 16 11:46 cea0757d-6329-4bf8-abbf-03f9c313b07f -> ../../sdb1
lrwxrwxrwx. 1 root root 10 Sep 16 11:23 e6024940-527e-4a08-ac77-0e503b219d27 -> ../../dm-3

或者使用blkid

[root@rhel-8 system]# blkid /dev/sdb1
/dev/sdb1: UUID="cea0757d-6329-4bf8-abbf-03f9c313b07f" TYPE="ext4" PARTUUID="0b051d7e-01"

示例systemd单元文件以在没有fstab的情况下挂载文件系统

下面,我创建了一个示例systemd挂载文件,以将/dev/sdb1挂载在/tmp_dir挂载点上。

重要的提示:

挂载单元必须以其控制的挂载点目录命名。
例子:挂载点"/home/lennart"必须在单元文件" home-lennart.mount"中配置。

因此,其中我将我的systemd单元文件创建为tmp_dir

因为我的挂载点是/tmp_dir

[root@rhel-8 system]# cat tmp_dir.mount
#  This file is part of systemd.
[Unit]
Description=Test Directory (/tmp_dir)
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target
[Mount]
What=/dev/disk/by-uuid/cea0757d-6329-4bf8-abbf-03f9c313b07f
Where=/tmp_dir
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target

其中

What=
Takes an absolute path of a device node, file or other resource to mount. See mount(8) for details. If this refers to a device node, a dependency on the respective device unit is automatically created. This option is mandatory. Note that the usual specifier expansion is applied to this setting, literal percent characters should hence be written as "%%".
Where=
Takes an absolute path of a directory for the mount point; in particular, the destination cannot be a symbolic link. If the mount point does not exist at the time of mounting , it is created. This string must be reflected in the unit filename. (See above.) This option is mandatory.
Type=
Takes a string for the file system type. See mount(8) for details. This setting is optional.
Options=
Mount options to use when mounting. This takes a comma-separated list of options. This setting is optional. Note that the usual specifier expansion is applied to this setting, literal percent characters should hence be written as "%%".

除非设置DefaultDependencies = no,否则添加以下依赖项:

  • 所有挂载单元都会在umount.target上自动获取" Before ="和" Conflicts =",以便在关机期间停止。

  • 引用本地文件系统的安装单元自动获得对local-fs-pre.target的After =依赖。

  • 网络安装单元自动获取对remote-fs-pre.targetnetwork.targetnetwork-online.targetAfter =依赖关系。
    向后者添加了一个" Wants ="单元。

启动服务(不带fstab的挂载文件系统)

重新加载守护程序以刷新systemd更改

[root@rhel-8 system]# systemctl daemon-reload

挂载文件系统(启动systemd服务)

我们都准备好了。
接下来,验证此新挂载服务的状态

[root@rhel-8 system]# systemctl show -p ActiveState -p SubState --value tmp_dir.mount
inactive
dead

由于服务处于非活动状态,这意味着我们的文件系统当前未安装。
因此,我们将开始我们的系统服务。

[root@rhel-8 system]# systemctl start tmp_dir.mount

接下来,验证文件系统,如预期的那样,我们可以在/tmp_dir下不使用fstab的情况下挂载文件系统。

[root@rhel-8 system]# df -h /tmp_dir/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       976M  2.6M  907M   1% /tmp_dir

就像我们现在看到的那样,我们的服务正在激活

[root@rhel-8 system]# systemctl show -p ActiveState -p SubState --value tmp_dir.mount
active
mounted
[root@rhel-8 ~]# systemctl status tmp_dir.mount
● tmp_dir.mount - Test Directory (/tmp_dir)
   Loaded: loaded (/usr/lib/systemd/system/tmp_dir.mount; enabled; vendor preset: disabled)
   Active: active (mounted) since Mon 2019-09-16 19:01:09 IST; 10s ago
    Where: /tmp_dir
     What: /dev/sdb1
    Tasks: 0 (limit: 11517)
   Memory: 56.0K
   CGroup: /system.slice/tmp_dir.mount
Sep 16 19:01:09 rhel-8.example systemd[1]: Mounting Test Directory (/tmp_dir)...
Sep 16 19:01:09 rhel-8.example systemd[1]: Mounted Test Directory (/tmp_dir).

但是我们的服务处于禁用状态,这意味着重新启动后,默认情况下不会挂载/tmp_dir

[root@rhel-8 ~]# systemctl is-enabled tmp_dir.mount
disabled

为了证明这一理论,我将重新启动节点。
重新启动后,我们看到未安装/tmp_dir

[root@rhel-8 ~]# df -h /tmp_dir/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root   15G  2.1G   12G  16% /
[root@rhel-8 ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               900M     0  900M   0% /dev
tmpfs                  915M     0  915M   0% /dev/shm
tmpfs                  915M  8.5M  907M   1% /run
tmpfs                  915M     0  915M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   15G  2.1G   12G  16% /
/dev/sda1              483M  258M  225M  54% /boot
tmpfs                  183M     0  183M   0% /run/user/0

同样,tmp_dir挂载服务是不活动的

[root@rhel-8 ~]# systemctl show -p ActiveState -p SubState --value tmp_dir.mount
inactive
dead

因此,首先让我们启用tmp_dir服务,以便可以在重新启动后挂载此文件系统(永久)

[root@rhel-8 system]# systemctl enable tmp_dir.mount
Created symlink /etc/systemd/system/multi-user.target.wants/tmp_dir.mount → /usr/lib/systemd/system/tmp_dir.mount.

验证状态

[root@rhel-8 system]# systemctl is-enabled tmp_dir.mount
enabled

接下来,我将再次重新引导节点,重新引导后,如我们所见,现在systemd在已挂载文件系统列表中显示tmp_dir,因此我们能够在没有fstab的情况下挂载文件系统

[root@rhel-8 ~]# systemctl -t mount
UNIT                    LOAD   ACTIVE SUB     DESCRIPTION
-.mount                 loaded active mounted Root Mount
boot.mount              loaded active mounted /boot
dev-hugepages.mount     loaded active mounted Huge Pages File System
dev-mqueue.mount        loaded active mounted POSIX Message Queue File System
run-user-0.mount        loaded active mounted /run/user/0
sys-kernel-config.mount loaded active mounted Kernel Configuration File System
sys-kernel-debug.mount  loaded active mounted Kernel Debug File System
tmp_dir.mount           loaded active mounted Test Directory (/tmp_dir)
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.
8 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

验证df输出,如预期的那样,/dev/sdb1正在使用我们的tmp_dir

[root@rhel-8 system]# df -h /tmp_dir
Filesystem             Size  Used Avail Use% Mounted on
/dev/sdb1              976M  2.6M  907M   1% /tmp_dir

我将继续本文,其中提供使用systemd自动挂载或者自动卸载文件系统的步骤以及使用systemd和/etc/fstab并按示例以一定顺序(如果需要的话,依次安装)的文件系统的步骤。