昨天下午我删掉了一台虚拟机。测试不是虚拟误操作,是测试故意的。那台Ubuntu Server 22.04被我折腾了整整两周,虚拟装了又卸,测试卸了又装,虚拟最后连SSH登录都变得迟缓。测试删掉它的虚拟瞬间,磁盘空间释放了47.6GB,测试心里有种莫名的虚拟痛快——就像清空了一个塞满旧衣服的衣柜。
测试虚拟机这件事,测试听起来像是虚拟技术文档里的标准流程,实际上更像是测试在玩一场永远无法通关的游戏。我见过太多人把虚拟机当作一次性玩具,虚拟用完就删,测试删完再建,仿佛那些二进制文件从未存在过。但真正的测试不是这样的。它需要你像对待一台物理服务器那样严肃——给它分配固定IP,设置好防火墙规则,甚至模拟断电场景。
上周我测试一个高可用集群方案,三台虚拟机跑着Keepalived和HAProxy。第一次切换测试,主节点宕机后备用节点接管花了整整7秒。这在生产环境里是不可接受的。我盯着日志看了两个小时,发现是健康检查脚本里多写了一个sleep 5。改掉那行代码,切换时间降到1.2秒。这1.2秒背后,是无数次快照回滚和状态比对。
虚拟机最迷人的地方在于它的可欺骗性。你可以在里面模拟网络延迟、丢包、磁盘故障,甚至CPU降频。我常用tc命令给虚拟网卡加上100ms延迟,然后看着NTP同步时间从毫秒级变成秒级。这种体验在物理机上几乎不可能实现——除非你真有本事把机房里的网线拔了再插上。
但虚拟机也有它让人抓狂的一面。资源争抢是最常见的问题。我曾在同一台宿主机上跑了六台虚拟机,其中一台突然开始疯狂读写磁盘,结果其他五台全部卡成PPT。那时候你才会意识到,虚拟化不是魔法,它只是把物理资源切得更细而已。宿主机内存不足时,交换分区发出的咔嗒声,比任何报警邮件都来得直接。
回到删掉那台虚拟机的事。我后来重新建了一台,用Packer做了镜像模板,配合Ansible自动配置环境。这次只花了20分钟就恢复到之前的状态。但奇怪的是,我总觉得新虚拟机里少了点什么——可能是旧系统里那些乱七八糟的编译缓存,也可能是某个配置文件里藏着的一段注释。虚拟机的生命周期就是这么微妙,你删掉的不仅是一堆文件,还有一段调试时的记忆。
测试虚拟机说到底,是在跟时间较劲。快照能让你回到过去,但回不到当时的思考状态。所以我现在养成了习惯:每次做重要变更前,先写一份简短的变更说明,存到虚拟机的 /root 目录下。不是为了给谁看,纯粹是怕自己忘了当初为什么这么改。虚拟机可以随时重建,但判断力和经验没法快照。
那台被我删掉的虚拟机,现在安安静静躺在回收站里。等哪天我心情好,或许会恢复它,看看里面还有什么值得留下的东西。大概率不会。但这就是测试虚拟机最有意思的地方——你永远知道它就在那里,随时可以重新开始。
