CentOS /etc/fstab写错导致无法开机,单用户模式修复UUID
手欠改完/etc/fstab直接reboot,结果机器卡在启动进度条,提示“Give root password for maintenance”或“Failed to mount /xxx”。别慌,九成是UUID写错、磁盘没插、文件系统类型填错。下面把踩坑到爬出的全过程拆开讲,照着敲命令,十分钟内能让系统重新滚起来。

一、先确认到底是不是fstab闯祸
启动报错行一般会给出挂载点,比如“/data”或“/boot/efi”,后面紧跟着“unknown filesystem type”“can't find UUID”字样。见到这几句,基本就能定案:系统按你写的UUID找不到分区,挂载失败,于是 systemd 直接丢进紧急模式。此时如果强行输入 root 密码,会进单用户维护 Shell,但根分区是只读,需要重新挂成读写才能改文件。
二、重启进单用户模式,拿到读写权限
1. 在 grub 菜单按 e 找到 linux16 开头那行,把 ro 改成 rw init=/sysroot/bin/sh,Ctrl+x 启动。
系统会停在 sh-4.4# 提示符,先执行
chroot /sysroot

再把语言改成熟悉的中文,防止 cat 出现菱形乱码:
export LANG=zh_CN.UTF-8
此时根目录已是原系统,可以痛快编辑 /etc/fstab。
三、快速找到正确的UUID
fstab 里 UUID=写错一个字母都会挂。用下面两条命令当场核对:
blkid

ls -l /dev/disk/by-uuid/
blkid 会列出所有分区对应的 UUID、文件系统类型、LABEL,一一抄下来即可。如果之前用了 LVM,记得先 vgchange -ay 激活卷组,再执行 blkid 才能看到逻辑卷。
四、现场改fstab,注意这四行别动
1. / 根分区那一行务必先确认 UUID 正确,否则改完重启依旧跪。
/boot 分区如果单独分出来,UUID 同样要匹配,内核升级后 grub 会读这里。
swap 行写错不会导致启动失败,但会报“Failed to mount swap”,顺手一起改。
新增的数据盘挂载点,建议先写成 nofail 参数,例如:
UUID=xxxx /data ext4 defaults,nofail 0 2
nofail 能让挂载失败时系统继续启动,留条后路。
五、保存退出后必做的检查
1. 执行 mount -a 让系统按新 fstab 全部重挂一遍,没报错才算过关。
若提示 “mount point does not exist”,手动 mkdir 补目录。
确认 SELinux 上下文没错,直接 restorecon -Rv / 一键修复。
退出 chroot,再执行 reboot -f 硬重启,系统正常滚到登录界面即大功告成。
六、如果连单用户都进不去,还有救援盘方案
把 CentOS 安装 U 盘插上去,选 Troubleshooting → Rescue a CentOS system,语言选继续,网络可跳过。rescue 会尝试把原系统挂到 /mnt/sysimage,进去后同样 chroot,再重复 blkid、改 fstab、mount -a 三板斧。云主机没物理口,就用厂商提供的“救援模式”,原理一样,都是把盘挂到临时系统上让你改。
七、预防再踩坑的三条土办法
1. 改 fstab 前先在命令行手动 mount UUID=xxx /mnt 试挂,确认没错再写进文件。
给关键分区加 nofail,尤其外挂数据盘,写错也不影响启动。
备份旧文件:cp /etc/fstab{,.bak},翻车秒回滚。
照着上面流程,基本都能把因 UUID 写错、磁盘未就绪、文件系统类型填错导致的启动失败救回来。下次再手痒改配置,先默念一句:手动挂载验证过,再写 fstab,系统就再也不会把你踢到维护模式。
