Linux 服务器启动卡死的排查与修复:/etc/fstab 重复挂载条目
场景 :生产服务器无法在本地终端登录,机房屏幕停在内核报错界面,但 SSH 远程连接仍然可用。只有一次重启机会。
故障现象
机房屏幕所见(本地终端)
服务器开机后,屏幕停留在如下报错,无法进入登录界面:
[336.933560] systemd-fstab-generator[6588]: Failed to create unit file
/run/systemd/generator/media-ssd.mount, as it already exists.
Duplicate entry in /etc/fstab?
[336.933712] systemd-fstab-generator[6588]: Failed to create unit file ...
[337.783324] systemd-fstab-generator[66411]: Failed to create unit file ...
[337.784370] systemd-fstab-generator[66411]: Failed to create unit file ...
异常行为
- 通过 SSH 远程连接可以正常登录
- 一旦访问
/media/ssd01(NVMe SSD)上的数据,服务器立即关机 - 本地终端完全无法使用,无法正常重启进入系统
环境信息
| 项目 | 详情 |
|---|---|
| 系统盘 | /dev/sdb2 → /(879G) |
| NVMe SSD | /dev/nvme0n1 → /media/ssd01(3.6T) |
| 其他数据盘 | sda1 / sdc / sdd |
| 故障组件 | /etc/fstab 第 15--17 行 |
bash
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb2 879G 546G 288G 66% /
/dev/nvme0n1 3.6T 2.9T 544G 85% /media/ssd01
/dev/sda1 1.8T 1.4T 325G 82% /media/media03
/dev/sdc 3.6T 3.3T 158G 96% /media/media02
/dev/sdd 3.6T 3.3T 186G 95% /media/media01
根因分析
第一步:检查 fstab
bash
$ grep -n '/media/ssd' /etc/fstab
15: /dev/disk/by-uuid/51e1fb65-... /media/ssd auto nosuid,nodev,nofail,x-gvfs-show 0 0
16: /dev/disk/by-uuid/5dc65724-... /media/ssd auto nosuid,nodev,nofail,x-gvfs-show 0 0
17: /dev/disk/by-uuid/445b53be-... /media/ssd auto nosuid,nodev,nofail,x-gvfs-show 0 0
18: /dev/disk/by-uuid/08c7d34d-... /media/ssd01 auto nosuid,nodev,nofail,x-gvfs-show 0 0
发现问题 :第 15--17 行有 3 个不同 UUID 但挂载点相同 (/media/ssd)的条目。
第二步:验证 UUID 是否存在
bash
$ sudo blkid | grep -E "51e1fb65|5dc65724|445b53be|08c7d34d"
/dev/nvme0n1: UUID="08c7d34d-d66e-4b4a-b95e-de878a3bad54" TYPE="ext4"
结论:
| 行号 | UUID | 状态 |
|---|---|---|
| 15 | 51e1fb65-... |
❌ 设备不存在(已拔除或重分区) |
| 16 | 5dc65724-... |
❌ 设备不存在 |
| 17 | 445b53be-... |
❌ 设备不存在 |
| 18 | 08c7d34d-... |
✅ /dev/nvme0n1,当前唯一 SSD |
根本原因
systemd-fstab-generator 在启动时尝试为 fstab 中的每个条目生成 .mount unit 文件。由于第 15--17 行挂载点相同 (均为 /media/ssd),systemd 尝试创建同名 unit media-ssd.mount 三次,第二次起就会报 "already exists" 错误。
这导致:
- systemd 进入错误循环,无法完成启动序列
- 本地 getty(登录终端)无法启动
- 访问 SSD 触发内核异常或电源保护导致关机
修复步骤
⚠️ 注意:所有操作均通过 SSH 远程执行,仅有一次重启机会。
1. 备份 fstab(必做)
bash
sudo cp /etc/fstab /etc/fstab.bak
2. 注释掉无效的重复条目
bash
sudo sed -i.bak2 '15s/^/#/' /etc/fstab
sudo sed -i '16s/^/#/' /etc/fstab
sudo sed -i '17s/^/#/' /etc/fstab
3. 验证修改结果
bash
$ grep -n '/media/ssd' /etc/fstab
15: #/dev/disk/by-uuid/51e1fb65-... /media/ssd auto ... ← 已注释
16: #/dev/disk/by-uuid/5dc65724-... /media/ssd auto ... ← 已注释
17: #/dev/disk/by-uuid/445b53be-... /media/ssd auto ... ← 已注释
18: /dev/disk/by-uuid/08c7d34d-... /media/ssd01 auto ... ← 保留
4. 清理已生成的冲突 unit 文件
bash
sudo rm -f /run/systemd/generator/media-ssd.mount
sudo systemctl daemon-reload
5. 重启服务器
bash
sudo reboot
修复后验证
重启完成后,确认以下内容:
bash
# 确认 SSD 正常挂载
$ ls /media/ssd01
data codes disk_project ...
# 确认无 fstab 相关报错
$ sudo systemctl --failed
# 确认本地终端可以正常登录(机房现场)
应急回滚方案
如果重启后问题未解决,通过 SSH 执行:
bash
sudo cp /etc/fstab.bak /etc/fstab
sudo reboot
经验总结
为什么 SSH 可以连但本地终端不行?
SSH 服务(sshd)由 systemd 在早期阶段启动,网络和基础服务均正常。问题出在 getty(本地登录服务)依赖 fstab 挂载完成,而 fstab 的冲突导致 systemd 的挂载目标(local-fs.target)无法正常完成,从而阻塞了本地终端的启动。
为什么访问 SSD 会关机?
fstab 中存在多个指向同一挂载点的异常条目时,内核在运行时处理挂载请求可能触发文件系统层的竞争或异常,在某些驱动或固件配置下会触发内核 panic 并导致系统重启/关机。
预防措施
- 每次修改 fstab 前先备份 :
cp /etc/fstab /etc/fstab.bak - 修改后用
findmnt --verify验证语法(无需重启) - 拔除磁盘前先从 fstab 中删除对应条目,避免留下僵尸 UUID
- 挂载点名称要唯一,不同设备不能共用同一挂载目录
- 定期审计 fstab :
cat -n /etc/fstab检查是否有重复挂载点
关键命令速查
bash
# 查看当前挂载状态
df -h
# 列出所有块设备及 UUID
sudo blkid
# 验证 fstab 中 UUID 是否存在
grep -n '/media/ssd' /etc/fstab
# 注释掉指定行(以第15行为例)
sudo sed -i '15s/^/#/' /etc/fstab
# 验证 fstab 语法
findmnt --verify --fstab
# 重载 systemd(无需重启)
sudo systemctl daemon-reload
本文记录于一次真实的生产环境故障排查,操作环境为 Ubuntu Server + systemd。
