如何使用systemd在没有fstab的情况下挂载文件系统(CentOS/RHEL 7/8)
我们使用/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.target
,network.target
和network-online.target
的After =
依赖关系。
向后者添加了一个" 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并按示例以一定顺序(如果需要的话,依次安装)的文件系统的步骤。