直接结论:用x-systemd.automount+noauto才能真正实现nfs/cifs按需延迟挂载,首次访问才触发,不阻塞启动;仅\_netdev无法避免开机硬挂载和超时卡死,因它只声明网络依赖,未分离挂载时机。

直接结论:用 x-systemd.automount + noauto 就能实现 NFS/CIFS 的延迟按需挂载,首次访问目录时才触发挂载,不阻塞启动、不浪费连接资源。
为什么不能只靠 _netdev 和 defaults
很多人以为加个 _netdev 就万事大吉,结果发现系统启动仍卡在 remote.mount 超时失败,日志里反复出现 Mounting timed out. Terminating.。这是因为 _netdev 只告诉 systemd “这是网络设备”,但没解决“什么时候挂”——它依然会在 local-fs.target 阶段尝试挂载,而此时网络可能还没 ready,DNS 也可能未解析。更关键的是,它做不到“按需”,只要开机就硬挂,哪怕你一整天都不访问那个目录。
真正需要的是两个动作分离:
- 不让挂载发生在 boot 阶段(用 noauto)
- 把挂载时机交给内核 vfs 层的首次访问事件(用 x-systemd.automount)
/etc/fstab 中必须写的三个关键选项
以挂载 NFS 共享 nfs.example.com:/data 到本地 /mnt/nfs-data 为例,/etc/fstab 条目应为:
UUID=1234-5678 /mnt/nfs-data nfs noauto,x-systemd.automount,_netdev,soft,timeo=500,retrans=3 0 0
必须包含的三项是:
- noauto:跳过 systemd-fstab-generator 在 boot 时的自动挂载逻辑
- x-systemd.automount:触发 systemd 创建一个 .automount unit,监听路径访问事件
- _netdev:确保 automount unit 启动前等待 network-online.target,避免 DNS 解析失败
其他推荐项:
- soft:避免挂载失败时进程卡死(尤其 NFS 服务端临时不可达)
- timeo=500:NFS 重试超时设为 5 秒(单位是 1/10 秒),比默认 70×10 更激进
- retrans=3:最多重试 3 次,防止无限等待
挂载后空闲多久自动卸载?用 x-systemd.idle-timeout
automount 默认不会自动卸载,挂载后就一直挂着——这在长期运行的服务中可能造成连接泄漏或权限僵化。加上 x-systemd.idle-timeout 可以控制空闲回收:
UUID=1234-5678 /mnt/nfs-data nfs noauto,x-systemd.automount,_netdev,x-systemd.idle-timeout=2min,soft,timeo=500 0 0
注意:
- 单位支持 s、min、h,但不能写成 120s(systemd 会报错),必须用 2min
- timeout 是从最后一次文件操作(open/read/write)开始计时,不是 mount 时间
- 如果该路径下有进程正在执行 ls 或 find,timeout 会不断重置
验证是否生效:
- 运行 systemctl list-units --type=automount,应看到 mnt-nfs\x2ddata.automount
- 查看状态:systemctl status mnt-nfs\x2ddata.automount,Active 状态为 active (waiting) 表示已就绪待触发
常见错误现象与排查线索
挂载看似“成功”,但第一次 ls /mnt/nfs-data 卡住 30 秒甚至失败,通常不是配置漏了,而是依赖没对齐:
- journalctl -u mnt-nfs\x2ddata.automount -n 50:重点看
Failed to start Automount或DNS resolution failed - systemctl show mnt-nfs\x2ddata.automount | grep -E "(Wants|After|BindsTo)":确认是否绑定了
network-online.target - 如果用了主机名(如
nfs.example.com),确保nss-lookup.target已就绪;可临时改用 IP 测试排除 DNS 问题 - 挂载点目录权限错误也会导致 automount 失败(比如
/mnt/nfs-data属于 root:root 但 mode 是 700),systemd 不会自动创建或修复目录,必须手动mkdir -p /mnt/nfs-data && chmod 755 /mnt/nfs-data
最易被忽略的一点:automount 单元的名称来自挂载点路径转义,/mnt/nfs-data → mnt-nfs\x2ddata.automount,中间的 - 被转义为 \x2d。查日志或启停时输错名字,就会找不到 unit。











