前言
使用/etc/fstab进行nfs开机挂载时候经常会遇到其他依赖服务没启动完成等问题导致挂载失败,同时,使用 /etc/fstab 文件时若遇到硬盘丢失还会导致启动问题,systemd-mount更灵活,也不会因为配置错误导致无法开机。
systemed-mount挂载基础方案
以debian12为例,假如我需要将 192.168.2.9:/volume1/video挂载到/mnt/nas/video,需要在/etc/systemd/system/下创建一个文件mnt-nas-video.mount。
注意:由于路径是 /mnt/nas/video,因此文件名需要是 mnt-nas-video.mount
[Unit]
Description=NFS
Wants=network-online.target
After=network-online.target
[Mount]
What=192.168.2.9:/volume1/video
Where=/mnt/nas/video
Type=nfs
Options=_netdev,auto
TimeoutSec=30
[Install]
WantedBy=multi-user.target
该方案的问题
仅仅这样配置,启动时候会遇见Network is unreachable的错误导致挂载失败
network-online.target 并不能保证所有网络服务(如 DNS 解析、路由表完整性等)都已准备好。它只是确保网络接口已启动并分配了 IP 地址。
因此需要引入一个新的service来定义网络是否真正准备好。
wait_for_functioning_dns.service
[Unit]
Description=Make network-online.target dependant on the ability to resolve host.domain
Documentation=https://gitlab.com/ggeurts/extend-network-online.target/-/blob/master/README.md
Requisite=NetworkManager.service
After=NetworkManager.service
Before=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/usr/bin/timeout 3m /bin/sh -c \'while ! /usr/bin/timeout 1 /usr/bin/dig host.domain>/dev/null 2>&1; do /usr/bin/sleep 0.1; done\'&&/usr/bin/echo ""DNS reachable""'
RemainAfterExit=yes
[Install]
WantedBy=network-online.target
该service能够等待dns服务等都启动完成
最终方案
- 创建/etc/systemd/system/wait_for_functioning_dns.service,文件内容
[Unit]
Description=Make network-online.target dependant on the ability to resolve host.domain
Documentation=https://gitlab.com/ggeurts/extend-network-online.target/-/blob/master/README.md
Requisite=NetworkManager.service
After=NetworkManager.service
Before=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/usr/bin/timeout 3m /bin/sh -c \'while ! /usr/bin/timeout 1 /usr/bin/dig host.domain>/dev/null 2>&1; do /usr/bin/sleep 0.1; done\'&&/usr/bin/echo ""DNS reachable""'
RemainAfterExit=yes
[Install]
WantedBy=network-online.target
- 创建/etc/systemd/system/mnt-nas-video.mount,文件内容
[Unit]
Description=Mount NFS
Wants=wait_for_functioning_dns.service
After=wait_for_functioning_dns.service
[Mount]
What=192.168.2.9:/volume1/video
Where=/mnt/nas/video
Type=nfs
Options=_netdev,auto
TimeoutSec=30
[Install]
WantedBy=multi-user.target
- 设置开机启动
sudo systemctl daemon-reload
sudo systemctl enable wait_for_functioning_dns.service
sudo systemctl enable mnt-nas-video.mount