![Systemd 服务在断电后在文件系统挂载之前启动](https://linux22.com/image/229268/Systemd%20%E6%9C%8D%E5%8A%A1%E5%9C%A8%E6%96%AD%E7%94%B5%E5%90%8E%E5%9C%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%8C%82%E8%BD%BD%E4%B9%8B%E5%89%8D%E5%90%AF%E5%8A%A8.png)
我遇到了一个问题系统服务在安装本地分区之前启动,特别是在断电事件之后。我调查了一下,发现这个问题是由于系统重新启动和随后的操作而引起的FSCK手术。
为了轻松复制问题,我创建了一个最小的概念证明。以下是详细信息。
我有一个名为 systemd 的服务,test.service
配置如下:
[Unit]
Description=fsck order POC
After=network-online.target local-fs.target remote-fs.target swap.target
[Service]
ExecStart=/bin/bash -c "date > /mnt/storage/hello"
[Install]
WantedBy=multi-user.target
在我的 中/etc/fstab
,我配置了一个安装点,如下所示:
/dev/sda1 /mnt/storage auto nosuid,nodev,nofail 0 2
运行sudo tune2fs -l /dev/sda1 | grep -i "mount count"
返回:
Mount count: 1
Maximum mount count: 1
这表明/dev/sda1
每次启动时都会进行 fsck。但是,该hello
文件是在根文件系统的/mnt/storage
目录中创建的,而不是预期的sda1挂载点。
结果,/mnt/storage
启动后我看不到任何东西。但是,如果我可以看到该hello
文件umount /mnt/storage
。
我的问题是:我应该进行哪些更改test.service
以确保在安装并检查所有文件系统后执行我的脚本? (注意:安装点的名称可能会有所不同,因为当部署在客户端站点时我无法控制它。)
系统运行的是Ubuntu。这个问题在 Debian 上不会发生。
任何有关解决此问题的见解或建议将不胜感激。预先感谢您的帮助!
答案1
我的评论中的解决方案
来自 systemd.mount 联机帮助页:
nofail
With nofail, this mount will be only wanted, not required,
by local-fs.target or remote-fs.target. Moreover the mount unit is not ordered
before these target units. This means that the boot will continue without
waiting for the mount unit and regardless whether the mount point can be
mounted successfully.
如果您尝试不使用该标志,则 local-fs.target
第一次尝试提供帮助(在这种情况下没有解决方案)
跑步:
systemctl list-units --type=mount
识别您的挂载单元,并将其添加到 systemd 文件中的 After= 中。
也许有助于识别正确的单位:
systemctl status <unit>