本文主要合并两则 KVM 运维碎片:在宿主机上查看/处理虚拟机磁盘镜像,以及通过 Virtio memory balloon 调整虚拟机可见内存。操作涉及离线镜像与热调整,生产环境请先确认业务窗口与备份。

背景说明

日常排障时经常需要:

  1. 虚拟机关机或确认安全后,在宿主机检查 qcow2/raw 镜像分区
  2. 在开启 balloon 的虚拟机上,动态下调/观察内存占用

相关进阶(CPU 绑核、qcow2 扩容)见 drafts/review 中已改写文。

磁盘镜像查看(离线)

典型场景:镜像落在宿主机目录(示例路径请替换):

cd /path/to/vms
ls -lh *.img

使用 fdisk / parted 查看分区表(只读观察优先,写操作前务必备份):

fdisk -l /path/to/vm.img
# 或
fdisk /path/to/vm.img   # 交互查看 p 打印分区,勿轻易 w

更稳妥的挂载方式通常是 qemu-nbdguestmount(视发行版工具而定):

modprobe nbd max_part=8
qemu-nbd --connect=/dev/nbd0 /path/to/vm.qcow2
fdisk -l /dev/nbd0
# 用完后
qemu-nbd --disconnect /dev/nbd0

注意:

  • 正在运行的虚拟机对应镜像禁止多头写。
  • 属主常为 qemu/libvirt-qemu,权限不足时用合适用户或 ACL。
  • 生产改分区前先快照或冷拷贝。

内存气球(balloon)

客户机需具备 Virtio balloon 设备,例如:

lspci | grep -i balloon
free -m

宿主机用 virsh + QEMU monitor 查看/调整(域名与命令以环境为准):

virsh qemu-monitor-command <domain> --hmp --cmd info balloon
# 将气球目标设为约 8G(单位依 QEMU 版本,常见为 MB)
virsh qemu-monitor-command <domain> --hmp --cmd balloon 8192
virsh qemu-monitor-command <domain> --hmp --cmd info balloon

再在客户机执行 free -m,确认 total 是否下降。

行为边界(待结合版本验证):

  • 下调通常依赖客户机 balloon 驱动配合回收。
  • 上调可能受 libvirt 当前 maxMemory / XML 上限限制,未必能超过启动时上限。
  • 仅 balloon 不能替代 长期容量规划;对延迟敏感业务要评估回收抖动。

测试验证

场景验证
镜像检查fdisk -l / nbd 断开后虚拟机仍可正常启动
balloon 下调宿主机 info balloon 与客户机 free -m 一致变小
balloon 上调未超 XML 上限时客户机 total 回升;超限则记录实际行为

注意事项

  • 示例中的主机名、镜像名、IP 均已脱敏,请替换为本机路径与域名。
  • 与 CPU pin、磁盘扩容文档配合阅读,避免只调内存掩盖超卖问题。