我最初尝试将其发布在 Ubuntu 论坛上,但我希望在这里能有更广泛的受众。
我有一个设置,在我的 fstab 中安装 NFS/CIFS,然后由服务使用(在我的例子中,服务由 docker 容器呈现)。
一般来说,一切都很好。当我的 systemd 服务启动时,它确保正确加载挂载点(我的单元是用 定义的RequiresMountsFor=
)。我的挂载点是/etc/fstab
使用 FQDN 名称定义的,这些名称在我的网络内部解析:
nas.home.ca:/mnt/HomeNAS /mnt/nas nfs ro 0 0
nas.home.ca:/mnt/HomeNAS/VM/Config/Alma-Docker1 /mnt/docker nfs rw 0 0
//nas.home.ca/Restore /mnt/restore cifs credentials=/etc/fstab.credentials.backup,file_mode=0777,dir_mode=02777 0 0
如果我的内部名称服务器在服务启动时离线,就会出现问题。如果挂载尚不存在,则挂载会快速失败,并出现 FQDN 无法解析的错误,并且 systemd 不会尝试重新挂载它们。因此,我的服务也无法启动,并且由于依赖项失败而不会尝试重新启动。
我查看了x.systemd
fstab 的可用选项,但没有找到任何可以将安装单元配置为在失败时重新启动/重试的内容。
[eric@dockervm2 system]$ sudo systemctl start mnt-nas.mount
Job failed. See "journalctl -xe" for details.
[eric@dockervm2 system]$ sudo systemctl start mnt-restore.mount
Job failed. See "journalctl -xe" for details.
[eric@dockervm2 system]$ sudo systemctl start mnt-docker.mount
Job failed. See "journalctl -xe" for details.
[eric@dockervm2 system]$ sudo journalctl -xe
因此,当我尝试启动服务时,我收到以下错误消息:
[eric@dockervm2 system]$ sudo systemctl start backup-docker-compose
A dependency job for backup-docker-compose.service failed. See 'journalctl -xe' for details.
如何设置我的挂载点以便他们重试?我意识到问题是我的名称服务器处于离线状态,我希望它尝试每 XXX 秒重新启动一次,直到我的名称服务器重新启动并运行。我知道我可以通过在 fstab 中使用 IP 而不是 fqdn(或 /etc/hosts 文件中的本地条目)来规避,但这有点违背了目的。
有没有办法在 systemd 中本地配置它以继续重试?
答案1
很多人都问过,答案似乎都没有。
https://github.com/systemd/systemd/issues/4468
我通过忽略 systemd 挂载并将挂载实现为服务来解决了这个问题。例如:
[root@adele ~]# cat /etc/systemd/system/srv-music.service
[Unit]
Description=Media devices
After=network.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/bin/mount -t nfs4 -o vers=4,minorversion=1,owner,ro darknight.localdomain6:/Media /srv/music
ExecStop=/usr/bin/umount /srv/music
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
上面的关键字是Restart
和RestartSec
。