编辑
2026-01-20
技术漫谈
00
请注意,本文编写于 40 天前,最后修改于 28 天前,其中某些信息可能已经过时。

目录

1. 乱改文件名导致快照链断裂(CID 校验失败)
2. 网络不通:VMware 自动桥接的坑
3. 磁盘占用异常:Docker 与 Containerd 的存储关系
4. 备份与压缩

Gemini_Generated_Image_w44c9rw44c9rw44c.png

今天记录一下下午踩的一个大坑,起因是嫌虚拟机文件太乱,直接在 Windows 资源管理器里重命名了 .vmdk 文件,结果导致虚拟机无法启动,顺带引发了一系列网络和存储问题。

折腾了一下午,把几个关键的技术点记下来,以后备查。

1. 乱改文件名导致快照链断裂(CID 校验失败)

故障现象: 手动修改 .vmdk 文件名后,启动虚拟机报错:The parent virtual disk has been modified

原因分析: VMware 的快照机制依赖 CID (Content ID) 来校验父子磁盘的一致性。子盘(快照)的文件头里记录了父盘的 parentCID。直接改名虽然文件还在,但可能会导致 VMware 判定父盘状态改变(或者仅仅是路径索引失效),导致 CID 校验不通过,链条断裂。

解决方法: 软件层面无法修复,只能修改文件头。

  1. 使用 HxD (十六进制编辑器) 打开父盘的 vmdk(文本部分),记录下当前的 CID 值。
  2. 用 HxD 打开报错的子盘 vmdk。
  3. 找到 parentCID 字段,发现数值和父盘不一致。
  4. 手动将子盘的 parentCID 修改为父盘当前的 CID 值,保存。

修改后校验通过,虚拟机成功启动。教训:改名一定要用 VMware 自带的工具,别在文件夹里瞎改。

2. 网络不通:VMware 自动桥接的坑

故障现象: 系统恢复后,虚拟机无法联网,ping 不通外网。

排查: 起初以为是 Ubuntu 24.04 的 Netplan 配置问题,排查很久无果。后来发现是 VMware “桥接模式” 的问题。 默认设置下,VMware 的 VMnet0 是“自动桥接”。我的电脑上有多个网卡(包括 VPN 的虚拟网卡),VMware 自动桥接到错误的网卡上了。

解决方法: 打开 VMware 的“虚拟网络编辑器”,将 VMnet0 从“自动”改为**“手动指定”**,强制选择当前使用的物理网卡(Realtek Gaming GbE)。修改后网络立刻恢复。

3. 磁盘占用异常:Docker 与 Containerd 的存储关系

故障现象: 服务恢复后,发现 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 运行时的核心依赖。

4. 备份与压缩

最后为了防止数据丢失,做了一次整机冷备份(关机复制文件夹)。 值得一提的是,62G 的虚拟机文件,打包压缩后只有 27G 左右。这得益于 Linux 文本日志的高压缩率,以及之前做过一次“完整克隆”清理了磁盘碎片。


总结: 这次故障完全是操作不规范(手动改名)引起的。不过也借此机会熟悉了 VMDK 的底层结构和 VMware 的网络机制。数据无价,操作前记得备份。

本文作者:小转圈

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!