virsh attach-disk支持热插拔添加新硬盘,但默认不持久(重启丢失),必须显式加--persistent或--config才永久生效;qcow2镜像须指定--subdriver=qcow2,否则libvirt误判为raw导致容量识别错误。

virsh attach-disk 可以热插拔添加新硬盘,但默认不持久——重启就丢,这点必须提前确认清楚。
virsh attach-disk 命令必须带 --subdriver 参数
qcow2 镜像如果不显式指定 --subdriver=qcow2,libvirt 会当成 raw 处理,导致容量识别错误(比如显示为 0 字节或远小于实际大小)。常见错误现象是:fdisk -l 在 guest 里看不到设备,或 lsblk 显示容量异常。
- 正确写法:
virsh attach-disk vm-name /path/to/disk.qcow2 vdb --subdriver=qcow2 --cache=none - raw 镜像也得写:
--subdriver=raw,不能省略 -
--cache=none是推荐值,避免写缓存引发数据一致性风险;如需性能可改用writeback,但需确保 guest 支持 barrier
加进去的硬盘要不要重启?怎么让它永久生效?
virsh attach-disk 默认只作用于当前运行态(live),虚拟机重启后设备消失。要持久化,有两个等效方式:
- 加
--persistent参数:命令执行即写入 XML 配置,下次启动自动加载 - 加
--config参数:效果同上,只是语义更明确(修改 inactive 配置) - 不加这两个参数 = 临时挂载,适合测试或短期扩容
注意:--live 和 --current 是默认行为,无需显式写出;但 --persistent 必须手动加,否则等于白操作。
guest 里怎么识别和使用这块新盘?
Linux guest 一般能自动识别新设备(/dev/vdb 或 /dev/sdb),但 Windows 需进磁盘管理器初始化。关键点不是“能不能看到”,而是“能不能直接用”:
- 先确认设备存在:
lsblk或fdisk -l,看有没有未分区的新盘 - 不要直接
mkfs:如果后续想加入 LVM,应先pvcreate /dev/vdb,再vgextend和lvextend - 若只作独立挂载,建议用 UUID:
blkid /dev/vdb→ 记下 UUID →/etc/fstab中写UUID=xxx /mnt/data ext4 defaults 0 2 - 热插拔后,部分老内核可能需要手动触发扫描:
echo 1 > /sys/class/scsi_host/host*/scan(极少需要,优先查dmesg | tail)
最容易被忽略的是:attach-disk 后没加 --persistent,又忘了用 virsh edit 补配置,结果虚拟机一重启,盘就没了,应用报错才回头排查——这种问题在生产环境里往往卡住整个上线流程。











