Troubleshoot Linux 2 文件系统挂载错误致系统启动失败
troubleshoot:文件系统挂载错误致系统启动失败

今天启动虚拟机直接进紧急模式了,大概率是因为/etc/fstab文件配置错误:例如你之前挂载了一个磁盘,后来把磁盘删了,但忘记删除配置文件里的挂载项。
获取root权限之后使用:
1 | journalctl -xb | grep failed |
查看日志。
Job dev-sdb1.device/start failed with result ‘timeout’ (等待 sdb1 设备超时)
Dependency failed for mnt-data.mount - /mnt/data (因为找不到设备,所以无法挂载到 /mnt/data)
a
系统找不到 /dev/sdb1 这个分区。
问题就锁定好了。
troubleshoot
- 获取写权限:现在的系统通常是“只读”的,必须先重新挂载为“读写”模式,否则无法保存修改。输入以下命令并回车:
1 | mount -o remount,rw / |
- 修改配置文件,把之前关于/dev/sdb1的那一行注释掉。
1 | vi /etc/fstab |
- reboot
复盘
问题的根源是我新添加了一块和这个/dev/sdb完全一样大小的磁盘。这在 Linux 运维中是非常经典的“盘符漂移”事故。
发生了什么?
Linux 系统分配 /dev/sda, /dev/sdb 等名字的规则极其简单粗暴:排队领号,先到先得。它不认硬盘的“脸”(数据),只认硬盘“进门”的顺序。
以前的情况:
- 系统盘 -> 抢到了
sda - 你的数据盘 -> 抢到了
sdb /etc/fstab里写着:“启动时去挂载/dev/sdb1”。
- 系统盘 -> 抢到了
刚才的操作:
- 你加了一块新硬盘。
- 在虚拟机的底层(SCSI 总线)顺序中,这块新硬盘可能插在了旧硬盘的前面(或者仅仅是因为扫描顺序的随机扰动)。
现在的启动顺序(漂移发生):
- 系统盘 -> 依然是
sda。 - 新硬盘 -> 被内核先发现了,它抢走了
sdb的名字。 - 旧硬盘(原本的数据盘) -> 被挤到了后面,变成了
sdc。
- 系统盘 -> 依然是
为什么会报错 Timeout?
- 系统根据
/etc/fstab去找/dev/sdb1。 - 现在的
/dev/sdb是刚加的那块崭新的空盘。 - 空盘没有分区,自然就没有
sdb1这个分区设备。 - 系统找不到
sdb1,等了 90 秒(默认超时时间),最后报错Timeout,被踢进紧急模式。
- 系统根据
建议使用UUID来作为盘名

使用lsblk我们可以看到那个我们曾经的数据盘的确到/dev/sdc1上去了。
查看真·数据盘的 UUID:
1
blkid /dev/sdc1
复制输出的
UUID="xxxx-xxxx..."那一串。修改
/etc/fstab:
把:1
/dev/sdb1 /mnt/data xfs defaults 0 0
改成:
1
UUID=刚刚复制的UUID /mnt/data xfs defaults 0 0

这样改完后,无论以后加多少硬盘,插在什么顺序,系统都只认这个“身份证号”,再也不会认错人了。






































、













