云服务器开机,屏幕卡在一行字上:“A start job is running for dev-disk-by-uuid-xxxxx…”。然后就是漫长的 90 秒倒计时。你盯着 VNC 窗口,心里想的是不是硬盘坏了,或者内核崩了——但大概率都不是。就是 /etc/fstab 里某一行写错了。Ubuntu 24.04、Anolis OS 8.8、CentOS Stream 9,谁都跑不掉。systemd 默认等 90 秒,超时才扔你进 emergency mode。你连 root 密码都没机会输,它已经默默挂载失败三次了。

别急着重装系统,更别联系售后说“机器挂了”。这事有救,而且不复杂。

那个 90 秒的倒计时,到底是谁的锅?

最常见的问题就三类。UUID 对不上——比如你热插拔过磁盘,或者云平台给盘重挂了,UUID 变了。NFS 或 CIFS 挂载没加 _netdev,systemd 不知道这玩意得等网络就绪才去挂。还有 U 盘或临时盘漏了 nofail,盘一拔就卡住。

别信什么“failfast”参数——fstab 里根本没这玩意。网上有实测:nofail 加上 _netdev 再加上 x-systemd.device-timeout=5,三个一起上才是真解药。缺一个,启动就卡那了。

所以问题很明确:fstab 写错了。但你现在连系统都进不去,怎么改?

GRUB edit kernel parameters init=/bin/bash

别等 rescue,用 init=/bin/bash 直捣黄龙

你可能会想去找救援盘,或者等 90 秒进 emergency.target——但云服务器上这两个都不太现实。一来你没机会输密码,二来救援盘得挂 ISO,折腾半天。其实有个更快的方法:GRUB 编辑内核参数。

云服务器上,init=/bin/bash 是唯一能绕过 systemd 挂载链、直抵 root shell 的后门。但这玩意得进 GRUB 菜单才能改。Ubuntu 24.04 默认隐藏 GRUB 菜单,你得在开机瞬间狂按 Esc。Anolis OS 8.8 也一样。CentOS Stream 9 则得按住 Shift——注意,是 VNC 里点“发送按键”选 Shift,不是你物理键盘上的 Shift,很多人在这步翻车。

进 GRUB 后别急着回车。光标移到以“linux”开头的那行(不是“initrd”),按 e 编辑。找到末尾类似 ro quiet splash $vt_handoff 的部分,删掉 ro,换成 rw init=/bin/bash。注意空格:前面留一格,后面不加换行。

linux /boot/vmlinuz-6.8.0-52-generic root=UUID=xxx ro quiet splash $vt_handoff
→ 改成 →
linux /boot/vmlinuz-6.8.0-52-generic root=UUID=xxx rw init=/bin/bash

改完按 Ctrl+X 或 F10 启动。你会看到一个 bash 提示符,而且根文件系统已经是可写状态——/etc/fstab 就在你指尖下。

注意

云服务器通常无物理键盘,需通过 VNC 或管理面板发送 Ctrl+Alt+Del 重启并进入 GRUB
Edit /etc/fstab in single user mode

对着 fstab 动手:注释比修复快,但得知道删哪行

进到 init=/bin/bash 后,你面对的不是 rescue shell,是裸奔的 root——/ 早已挂为可写。/etc/fstab 就在你 vi 手指下。别急着 mount -a,那会当场报错退出。先看问题在哪:UUID 错了?CentOS Stream 9 上一块 NVMe 盘重插后,blkid 输出的 UUID 和 fstab 里差了两个字符。Anolis OS 8.8 的 NFS 条目漏了 _netdev,但没加 nofail,systemd 死等 90 秒。

动刀前先确认根分区状态。执行 mount | grep " / ",确保输出含 rw(不是 ro)。如果还是只读,补一句:mount -o remount,rw /。再跑 ls -l /etc/fstab,权限得是 -rw-r--r--,否则 chmod 644。

打开文件:vi /etc/fstab。重点盯三类:以 /dev/sdX 开头却已不存在的盘(云服务器热插拔后设备名漂移)、NFS/CIFS 行缺 _netdev、U 盘或临时挂载点没加 nofail。别碰 root 分区那行——UUID 错了就真起不来了。删?不如先注释掉整行,加 # 开头。保存退出。

# 注释掉这行:/dev/sdb1  /mnt/data  ext4  defaults  0  2
# 或修正为:UUID=1a2b3c4d-...  /mnt/data  ext4  nofail,_netdev,x-systemd.device-timeout=5  0  2

说实话,90% 的 case 改完就能 reboot。剩下 10%,是改错了 root 分区 UUID 或 fs_passno 设成 2 却没配 /boot。重启前,先 exec /sbin/init 测试 systemd 是否能接上——它会按正常流程走一遍挂载,失败时立刻报错,比硬重启更省事。

mount -a 是你要的保险绳

文件改完了,先别急着敲 reboot。你盯着 vi 里那几行被注释掉的配置,觉得稳了是吧?但 systemd 这玩意儿可不会跟你客气。我见过有人手速太快,把 root 分区那行删掉一个 UUID 字符,重启直接 kernel panic,连 GRUB 菜单都回不去——老实讲,那会儿想死的心都有。

所以,先跑 mount -a

这个命令会按 /etc/fstab 里剩下的条目,全部试挂一遍。如果某行 UUID 写错、设备不存在、或者 NFS 服务器没开,它当场吐错误信息。比如报 mount: /mnt/data: special device /dev/sdb1 does not exist,那就是注释漏了或修错了盘符。回去改,再试,直到 mount -a 安静地返回 prompt,没任何输出——这才是好消息。

注意:mount -a 不会告诉你哪行被跳过了。如果某行设了 noauto,它直接略过,你回头还得检查。另外,之前加了 nofail 的行,就算挂不上也不会报错退出,但 mount -a 照样不会输出——别被假象骗了。建议跑一遍 mount | grep /mnt 确认目标挂载点真的出现了。

验证无误后,执行 exec /sbin/init 是最稳妥的下一刀。它会走一遍完整的 systemd 启动流程,挂载所有 fstab 条目。如果某个 NFS 挂载点缺了 _netdev,systemd 会在网络就绪前硬等 90 秒,你正好亲眼看到那个倒计时。Ctrl+C 打断,回去加 _netdevx-systemd.device-timeout=5,再来一次。直到 init 执行后顺利进入多用户模式,login prompt 出现。

这时候再 reboot。彻底重启一次,确认下次冷启动也不卡。如果一切顺利,你等来的不是 rescue shell,而是正常的 SSH 登录欢迎词。

最后一句:别把 mount -a 当摆设。它是你修复 fstab 后、按重启键之前,唯一能抓住的保险绳。

防患未然:把三个参数焊进脑子里

这次折腾完,我算记住了——绝大多数 fstab 导致的开机卡死,背后凶手其实是网络存储或者外接设备在搞鬼。再配个 UUID 写错,直接全家桶。

NFS、CIFS 这些远程挂载,系统启动时网络可能还没起来。systemd 傻等 90 秒,你就得盯着屏幕数秒。解法就三个关键词:_netdevnofail

// 一个靠谱的网络挂载条目长这样
// 192.168.1.100:/data /mnt/nfs nfs _netdev,nofail,x-systemd.device-timeout=10 0 0

_netdev 告诉 systemd:等网络就绪再挂。nofail 意思是挂不上别拦着开机,跳过继续走。x-systemd.device-timeout=10 把默认的 90 秒砍到 10 秒——就算 NAS 关机了,你也能正常登录,事后慢慢修。

外接 USB 盘同理。不加 nofail,出差拔了硬盘回来开机直接卡住。加上 x-systemd.device-timeout=5,5 秒没反应就跳过,顶多少个挂载点,不耽误 SSH。

很多人配 fstab 只写设备路径和挂载点,缺了 nofail_netdev,然后某天 NAS 换 IP 就炸了。其实多敲几个字符,能省掉今晚所有操作。把这些参数当默认模板焊进脑子里——云服务器上任何非根分区、任何网络路径,都加一遍。坏习惯不改,下次 rescue shell 见还是你。