LOADING

加载过慢请开启缓存 浏览器默认开启

systemd-mount实现nfs开机自动挂载

2025/4/10 NAS nas

前言

使用/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服务等都启动完成

最终方案

  1. 创建/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
  1. 创建/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
  1. 设置开机启动
sudo systemctl daemon-reload
sudo systemctl enable wait_for_functioning_dns.service
sudo systemctl enable mnt-nas-video.mount