本质是systemd默认等待90秒才放弃挂载,nofail仅避免中断启动但不缩短等待时间;需组合_nofail、_netdev(网络设备必需)和x-systemd.device-timeout=5三者协同生效。

加了非关键硬盘后系统启动卡在 “A start job is running for dev-disk-by…”,本质不是硬盘“损坏”,而是 /etc/fstab 中该设备挂载失败时,systemd 默认阻塞等待 90 秒才放弃。nofail 不是万能开关,它只解决“不中断启动”这一环,但必须搭配其他关键配置才能真正防卡死。
nofail 的真实作用和常见误解
nofail 表示:如果对应设备不存在、不可达或挂载失败,systemd 不将该挂载单元标记为 failed,也不中止启动流程,仅记录日志。但它不跳过等待过程——若设备节点迟迟不出现(比如 USB 口接触不良、U 盘供电不足),systemd 仍会按默认超时(通常是 90 秒)反复探测。
- 写错 nofail(如 no-fail、nofaile、NOFAIL)会被视为非法选项,部分发行版(Ubuntu 22.04+、Debian 12)会直接忽略或触发重试逻辑,反而更易卡住
- 仅写 nofail 而不处理网络依赖,对 NFS/CIFS 等网络盘无效——它们需要 _netdev 显式声明网络前提
- nofail 对已挂载但后续出错的设备无影响;它只作用于开机阶段的首次挂载尝试
真正起效的三要素组合
防卡死不是单靠 nofail,而是三个参数协同:
- nofail:挂载失败时不报错、不中断启动流程
- _netdev:仅对网络存储(NFS、CIFS)必需;告诉 systemd 此设备依赖网络,自动延迟到 network-online.target 就绪后再尝试
- x-systemd.device-timeout=5:显式限制设备探测与挂载总耗时(单位秒),避免默认 90 秒空等;推荐设为 5~15 秒
例如正确写法:
UUID=abcd-1234 /mnt/usb vfat defaults,nofail,_netdev,x-systemd.device-timeout=8 0 0# 注意:_netdev 对本地 USB/移动硬盘非必需,但加上也无害;对 NFS/CIFS 则必须加
配置前必须做的四件事
-
用 UUID 替代 /dev/sdX:运行
blkid或lsblk -f获取准确 UUID,避免因设备顺序变动导致 fstab 指向错误设备 -
提前创建挂载点目录:如
sudo mkdir -p /mnt/usb,否则 mount -a 会报错 -
手动验证配置:保存 fstab 后,立即执行
sudo mount -a;无输出即成功,有报错则立刻修正(比重启排查快得多) -
备份原文件:修改前先执行
sudo cp /etc/fstab /etc/fstab.bak,万一出问题可快速恢复
挂载点被其他服务依赖也会卡住
即使 fstab 配置完全正确,以下情况仍可能卡启动:
- 某服务(如 rsyslog、backup-script)在 systemd 单元中通过
Requires=/mnt/data或After=media-data.mount显式依赖该挂载点 - fstab 中该行用了
auto(defaults 默认包含 auto),而没配noauto,导致 systemd 自动创建并调度该 mount unit,纳入启动依赖图
解决方法:检查相关服务的 .service 文件,移除对非关键挂载点的硬依赖;或改用 noauto,nofail 组合,让挂载完全由用户或脚本按需触发,不参与开机流程。

















