自从Linux操作系统引入了systemd后引导过程变快了很多,这是因为许多服务和进程都是并行启动的。这样其实会导致操作系统在启动时,不再根据/etc/fstab中条目顺序来挂载文件系统。如下所示,预期的结果是先挂载/data2,接着挂载/data1。
[root@yunweixia.com ~]# grep vdb /etc/fstab /dev/vdb2 /data2 xfs defaults 0 0 /dev/vdb1 /data1 xfs defaults 0 0
但实际试验结果是先挂载/data1,然后挂载/data2
[root@yunweixia.com ~]# dmesg -T |grep vdb [Mon Aug 14 14:51:34 2023] virtio_blk virtio6: [vdb] 41943040 512-byte logical blocks (21.5 GB/20.0 GiB) [Mon Aug 14 14:51:34 2023] vdb: vdb1 vdb2 [Mon Aug 14 14:51:38 2023] XFS (vdb1): Mounting V5 Filesystem [Mon Aug 14 14:51:38 2023] XFS (vdb2): Mounting V5 Filesystem [Mon Aug 14 14:51:38 2023] XFS (vdb1): Ending clean mount [Mon Aug 14 14:51:38 2023] XFS (vdb2): Ending clean mount [root@yunweixia.com ~]# df -Th |grep vdb /dev/vdb1 xfs 5.0G 38M 5.0G 1% /data1 /dev/vdb2 xfs 15G 48M 15G 1% /data2
解决方案
您可以使用/etc/fstab文件中的“x-systemd.requires-mountsfor=”选项按特定顺序装载文件系统。
[root@yunweixia.com ~]# grep vdb /etc/fstab /dev/vdb2 /data2 xfs defaults 0 0 /dev/vdb1 /data1 xfs defaults,x-systemd.requires-mounts-for=/data2 0 0 [root@yunweixia.com ~]# reboot
重新启动后进行验证
[root@yunweixia.com ~]# dmesg -T |grep vdb [Mon Aug 14 14:58:53 2023] virtio_blk virtio6: [vdb] 41943040 512-byte logical blocks (21.5 GB/20.0 GiB) [Mon Aug 14 14:58:53 2023] vdb: vdb1 vdb2 [Mon Aug 14 14:58:57 2023] XFS (vdb2): Mounting V5 Filesystem [Mon Aug 14 14:58:57 2023] XFS (vdb2): Ending clean mount [Mon Aug 14 14:58:57 2023] XFS (vdb1): Mounting V5 Filesystem [Mon Aug 14 14:58:57 2023] XFS (vdb1): Ending clean mount [root@yunweixia.com ~]# df -Th |grep vdb /dev/vdb2 xfs 15G 48M 15G 1% /data2 /dev/vdb1 xfs 5.0G 38M 5.0G 1% /data1
由于我们使用fstab来执行这些更改,systemd将为/run/systemd/generator中的各个fstab条目创建一个服务单元文件/
[root@yunweixia.com ~]# ls -lt /run/systemd/generator/ total 56 -rw-r--r-- 1 root root 343 Aug 14 14:58 -.mount -rw-r--r-- 1 root root 382 Aug 14 14:58 \x2esnapshots.mount -rw-r--r-- 1 root root 398 Aug 14 14:58 boot-grub2-i386\x2dpc.mount -rw-r--r-- 1 root root 404 Aug 14 14:58 boot-grub2-x86_64\x2defi.mount -rw-r--r-- 1 root root 300 Aug 14 14:58 dev-disk-by\x2duuid-b929613f\x2d4f4c\x2d40e4\x2da392\x2d2ab9cf82eb32.swap -rw-r--r-- 1 root root 370 Aug 14 14:58 home.mount drwxr-xr-x 2 root root 300 Aug 14 14:58 local-fs.target.requires drwxr-xr-x 2 root root 60 Aug 14 14:58 local-fs.target.wants -rw-r--r-- 1 root root 332 Aug 14 14:58 data1.mount -rw-r--r-- 1 root root 245 Aug 14 14:58 data2.mount -rw-r--r-- 1 root root 368 Aug 14 14:58 opt.mount -rw-r--r-- 1 root root 370 Aug 14 14:58 root.mount -rw-r--r-- 1 root root 368 Aug 14 14:58 srv.mount drwxr-xr-x 2 root root 60 Aug 14 14:58 swap.target.requires -rw-r--r-- 1 root root 368 Aug 14 14:58 tmp.mount -rw-r--r-- 1 root root 380 Aug 14 14:58 usr-local.mount -rw-r--r-- 1 root root 368 Aug 14 14:58 var.mount
systemd生成的装载单元文件如下:
[root@yunweixia.com ~]# cat /run/systemd/generator/data1.mount # Automatically generated by systemd-fstab-generator [Unit] Documentation=man:fstab(5) man:systemd-fstab-generator(8) SourcePath=/etc/fstab RequiresMountsFor=/data2 Before=local-fs.target After=blockdev@dev-vdb1.target [Mount] Where=/data1 What=/dev/vdb1 Type=xfs Options=defaults,x-systemd.requires-mounts-for=/data2
扩展阅读
[root@yunweixia.com ~]# man systemd.mount x-systemd.requires-mounts-for=依赖关系。参数必须是绝对路径。此选项可以指定多次。有关详细信息,请参阅systemd.unit(5)中的RequiresMountsFor=。
原创文章,作者:运维侠,如若转载,请注明出处:https://www.yunweixia.com/solutions/ensure-mount-order-filesystems-in-etc-fstab-guide.html