
今天记录一下下午踩的一个大坑,起因是嫌虚拟机文件太乱,直接在 Windows 资源管理器里重命名了 .vmdk 文件,结果导致虚拟机无法启动,顺带引发了一系列网络和存储问题。
折腾了一下午,把几个关键的技术点记下来,以后备查。
故障现象:
手动修改 .vmdk 文件名后,启动虚拟机报错:The parent virtual disk has been modified。
原因分析:
VMware 的快照机制依赖 CID (Content ID) 来校验父子磁盘的一致性。子盘(快照)的文件头里记录了父盘的 parentCID。直接改名虽然文件还在,但可能会导致 VMware 判定父盘状态改变(或者仅仅是路径索引失效),导致 CID 校验不通过,链条断裂。
解决方法: 软件层面无法修复,只能修改文件头。
CID 值。parentCID 字段,发现数值和父盘不一致。parentCID 修改为父盘当前的 CID 值,保存。修改后校验通过,虚拟机成功启动。教训:改名一定要用 VMware 自带的工具,别在文件夹里瞎改。
故障现象: 系统恢复后,虚拟机无法联网,ping 不通外网。
排查: 起初以为是 Ubuntu 24.04 的 Netplan 配置问题,排查很久无果。后来发现是 VMware “桥接模式” 的问题。 默认设置下,VMware 的 VMnet0 是“自动桥接”。我的电脑上有多个网卡(包括 VPN 的虚拟网卡),VMware 自动桥接到错误的网卡上了。
解决方法: 打开 VMware 的“虚拟网络编辑器”,将 VMnet0 从“自动”改为**“手动指定”**,强制选择当前使用的物理网卡(Realtek Gaming GbE)。修改后网络立刻恢复。
故障现象:
服务恢复后,发现 75G 的硬盘被占用了 62G。ncdu 扫描显示:
/var/lib/containerd: 31G/var/lib/docker: 20G分析:
一开始以为 /var/lib/containerd 是冗余文件,尝试改名隔离,结果所有 Docker 容器(MaxKB, Stirling-PDF 等)全部无法启动。
查看日志发现,当前的 Docker 环境(1Panel 部署)采用了混合存储:Docker 目录仅存储元数据和日志,而真正的镜像文件和 overlayfs 层是委托给 containerd 管理的。由于部署了几个巨型应用(镜像解压后体积很大),这 50G 占用属于正常刚需。
结论: 不要随意删除 /var/lib/ 下的大文件夹,尤其是 containerd,它是 Docker 运行时的核心依赖。
最后为了防止数据丢失,做了一次整机冷备份(关机复制文件夹)。 值得一提的是,62G 的虚拟机文件,打包压缩后只有 27G 左右。这得益于 Linux 文本日志的高压缩率,以及之前做过一次“完整克隆”清理了磁盘碎片。
总结: 这次故障完全是操作不规范(手动改名)引起的。不过也借此机会熟悉了 VMDK 的底层结构和 VMware 的网络机制。数据无价,操作前记得备份。
本文作者:小转圈
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!