QEMU虚拟机镜像快速创建的核心是用qemu-img create命令搭配qcow2格式,优化则靠CPU穿透、virtio驱动和异步I/O这三板斧。
qemu虚拟机镜像创建命令详解
许多刚接触虚拟化的朋友,第一次敲命令时容易在镜像格式上栽跟头,业内专家指出,选择正确的镜像格式,比后续折腾优化参数更重要。
一行命令建立基础镜像
创建镜像本身不复杂,核心命令长这样:
qemu-img create -f qcow2 ubuntu.qcow2 20G
-f指定格式,后面跟镜像文件名和大小,如果想让镜像文件立刻占满20G,可以加-o preallocation=full,好处是后续运行时的性能表现最稳定,缺点是创建时间会变长,选择-o preallocation=metadata做折中,只预分配元数据区域,创建速度快,性能也不差:
qemu-img create -f qcow2 -o preallocation=metadata win.qcow2 40G
行业共识认为,这种预分配元数据的方式是单人开发环境里性价比最高的做法。
从ISO安装系统的完整流程
镜像建好后,用一条命令挂载ISO并启动安装:
qemu-system-x86_64 -hda ubuntu.qcow2 -cdrom ubuntu-22.04.iso -boot d -m 2048
几个值得留意的参数:
-m 2048分配2G内存,测试环境够用-boot d强制从光驱启动-hda指定主硬盘镜像
安装完成后的第一次启动,去掉-cdrom参数即可,有人问windows虚拟机安装步骤是不是更繁琐?其实流程完全一致,只是把ISO换成了Windows安装镜像,装完系统务必先安装virtio驱动,否则磁盘和网络性能会差一大截,这一步能省去后面大量排查时间。
qemu镜像压缩与格式转换怎么做
镜像用久了体积膨胀,这是qcow2的天然特性,删除文件并不会让镜像文件变小,因为qcow2只有在写入数据时才会分配新的数据块。
为什么qcow2是最佳选择
先看一组常见镜像格式的对比:
| 格式 | 体积特征 | 快照支持 | 典型场景 |
|---|---|---|---|
| raw | 固定大小 | 不支持 | 追求极致性能的服务器 |
| qcow2 | 动态增长 | 支持 | 桌面虚拟化与日常开发 |
| vmdk | 固定/动态 | 有限支持 | 需要兼容VMware的环境 |
在常见的国内云服务器环境下,qcow2是绝对的多数选择,动态占用宿主机磁盘空间,还能做快照回滚,容错性高出不少。
镜像压缩的实操命令
压缩前先清理系统内的垃圾文件,然后关机执行:
qemu-img convert -O qcow2 ubuntu.qcow2 ubuntu_compressed.qcow2
convert命令会重新排列数据块,把无用的空洞丢弃,原来的镜像如果有快照,用-p参数显示进度,转换完成后得到的是一个干净的独立镜像文件。
格式互转同样通过convert实现,raw转qcow2:
qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2
命令本身不复杂,真正的坑在于磁盘空间,转换过程中新旧镜像同时存在,需要预留原镜像两倍以上的空间,中途写满磁盘是新手最容易踩的雷。
qemu虚拟机性能优化参数怎么调
镜像搞定之后,性能优化才是重头戏,很多人装完系统发现运行卡顿,第一反应加内存,其实问题往往出在更底层的虚拟化配置上。
CPU与内存的直通配置
默认的QEMU CPU模型比较保守,虚拟机能识别到的CPU特性有限,启动时加一行参数,把宿主机的CPU特性直接透传进去:
-cpu host -enable-kvm
这两项缺一不可,-enable-kvm负责开启硬件加速,-cpu host负责特性透传,内存方面,如果宿主机内存充裕,开启HugePages可以降低TLB miss的概率,对数据库这类内存敏感型负载提升明显,多台虚拟机同时跑的时候,宿主机开启KSM内核同页合并,可以省出相当一部分物理内存。
磁盘I/O与缓存模式选择
I/O模式决定磁盘性能,也是优化空间最大的地方,常见选择有:
-drive file=disk.qcow2,if=virtio,aio=native,cache=none:适合Linux宿主机,性能均衡-drive file=disk.qcow2,if=virtio,cache=writeback:性能更好,但断电可能丢数据-drive file=disk.qcow2,if=virtio,cache=unsafe:只适合测试环境,生产环境千万慎用
多数情况下,aio=native配合cache=none是稳妥之选,如果宿主机用的是SSD,记得在宿主机侧开启TRIM,qcow2的空洞回收机制就靠这个指令集正常工作。
网络虚拟化的性能提升
网卡默认模拟e1000,老系统兼容性不错,但吞吐量一般,换成virtio-net:
-netdev user,id=net0 -device virtio-net-pci,netdev=net0
单独用user模式做NAT访问外网足够,如果要让虚拟机对外服务,改用tap设备挂到宿主机网桥,再开多队列(
mq=on),配合vhost内核加速,网络吞吐量比默认配置高出数倍并不夸张。
在低配机器上跑虚拟机,CPU穿透、virtio驱动、异步I/O这三项务必全上,基本可以让性能损失降到接近裸机水平。
常见问题:qemu镜像启动失败和体积膨胀怎么办
qemu虚拟机启动卡黑屏怎么处理?
卡黑屏大概率是KVM模块没加载,先确认宿主机CPU支持虚拟化,再执行:
lsmod | grep kvm
没有输出就手动加载模块:
modprobe kvm_intel # Intel CPU modprobe kvm_amd # AMD CPU
启动命令里少了-enable-kvm参数,同样会导致启动极慢、CPU占用居高不下。
镜像文件体积膨胀是异常吗?
属于qcow2的正常现象,但可以通过维护手段控制,Linux虚拟机内部执行fstrim,Windows虚拟机碎片整理,主动丢弃废弃块,宿主机制作快照前再跑一次:
qemu-img check ubuntu.qcow2
扫描结果正常后,再按上文提到的convert压缩方案回收空间。
qemu虚拟机性能不如宿主机正常吗?
每个层面都有性能损耗,关键看损耗控制在什么范围,如果跑同样的程序速度明显偏慢,检查是否忘记加-enable-kvm,或者虚拟机内没装virtio驱动,轻量级负载场景下,性能差距可以控制在非常小的范围内。
创建qemu虚拟机镜像,记住三步:qemu-img create建底子,virtio驱动提速度,convert压缩收空间,一个稳定高效的虚拟化环境,并没有想象中那么难搭。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/665356.html




