娃在书房里玩,无意间把pve服务器的电源插头给碰掉了,再次开机时,发现有一个容器启动失败了。

分析
- 看逻辑是运行了
lxc.hook.pre-start脚本钩子导致的失败,因为有容器可能启动,肯定不是全局钩子。检查lxc100的配置,发现没有相关的配置,应该不是配置出问题了。
pct config 100 | grep -i hook
# 输出为空,没有相关配置
可能1:容器元数据或运行时状态损坏
LXC 在启动时会读取容器的运行时状态目录(如 /var/lib/lxc/100/),如果断电发生在关键写入阶段,可能导致:
- 残留的临时 hook 脚本未清理
- 锁文件、状态文件损坏
- 配置缓存不一致
即使 /etc/pve/lxc/100.conf 是干净的,LXC 底层仍可能因残留文件误判需要执行 hook。清理容器运行时状态
# 删除 LXC 运行时目录(不会删除 rootfs 数据!)
rm -rf /var/lib/lxc/100/
rm -rf /var/lib/vz/tmp/*
# Proxmox 会在下次启动时自动重建 /var/lib/lxc/100/
pct start 100
- 结果:还是启动失败。
可能2:容器配置莫名其妙损坏
- 保留磁盘,重建容器
# 1. 备份当前配置
cp /etc/pve/lxc/100.conf /root/100.conf.bak
# 2. 记录 rootfs 位置
ROOTFS=$(pct config 100 | awk '/^rootfs:/ {print $2}')
# 3. 手动删除配置和运行时(不清磁盘)
rm -f /etc/pve/lxc/100.conf
rm -rf /var/lib/lxc/100/
rm -f /etc/pve/lock/100.lock
# 4. 用原磁盘重新创建容器(--rootfs 指向原磁盘)
pct create 100 $ROOTFS \
--ostype $(grep ostype /root/100.conf.bak | cut -d' ' -f2) \
--cores $(grep cores /root/100.conf.bak | cut -d' ' -f2) \
--memory $(grep memory /root/100.conf.bak | cut -d' ' -f2) \
--net0 $(grep net0 /root/100.conf.bak | cut -d' ' -f2-) \
--features $(grep features /root/100.conf.bak | cut -d' ' -f2)
# 5. 手动对比一下新创建的 /etc/pve/lxc/100.conf 与备份的配置 /root/100.conf.bak 有啥区别,缺少的可以手动修改。
# 6. 启动
pct start 100
- 结果:依然启动失败。
可能3:容器磁盘是否损坏
经过前二步,基本判断是容器磁盘出问题了,查看配置,假设容器磁盘为:
/var/lib/vz/images/100/vm-100-disk-0.raw
- 尝试挂载磁盘
# 尝试只读挂载测试
mkdir -p /mnt/test100
mount -o ro,loop "/var/lib/vz/images/100/vm-100-disk-0.raw" /mnt/test100 && echo "OK" || echo "Mount failed"
- 结果挂在失败
mount: /mnt/test100: cannot mount /dev/loop7 read-only.
dmesg(1) may have more information after failed mount system call.
Mount failed
- 检查文件系统,尝试修复
# 检查是否是有效的 ext4/xfs 文件系统
file -s "/var/lib/vz/images/100/vm-100-disk-0.raw"
# 强制检查文件系统(ext4)
fsck -y -f "/var/lib/vz/images/100/vm-100-disk-0.raw"
# 如果是 xfs(不能用 fsck!)
xfs_repair -n "/var/lib/vz/images/100/vm-100-disk-0.raw" # 先只读检查
xfs_repair "/var/lib/vz/images/100/vm-100-disk-0.raw" # 修复(会修改数据!)

- 清理 Proxmox 临时目录,重启
rm -rf /var/lib/lxc/100/
rm -rf /var/lib/vz/tmp/*
pct start 100
- 结果:重启成功。
结论
做好备份是防止意外的最佳办法。
评论区