qemu封装虚拟机的核心就两步:先用qemu-img创建磁盘镜像,再通过qemu-system-x86_64启动镜像并安装系统,全程由命令行驱动,按下面流程操作即可跑通。
qemu 创建虚拟机步骤:从磁盘镜像到系统安装
很多新手第一次接触qemu,会被一堆陌生的命令吓到,其实把“封装虚拟机”这件事拆开看,本质上就是准备一块虚拟硬盘,然后把操作系统装进去,qemu只是把“创建硬盘”和“开机”分成了两个工具来用,搞懂这一点,后面的操作就顺了。
先分清 qemu-img 和 qemu-system-x86_64
qemu全家桶里,你只需要先记住两个命令:
- qemu-img:负责创建、转换、压缩磁盘镜像文件,相当于虚拟硬盘的管理工具。
- qemu-system-x86_64:负责启动虚拟机,模拟CPU、内存、网卡、显卡等硬件。
封装虚拟机时,你先用qemu-img造出硬盘,再用qemu-system-x86_64启动这台“没有系统的裸机”,最后像装实体机一样装入操作系统。
用 qemu-img 创建虚拟机磁盘镜像
打开终端,进入你想存放虚拟机文件的目录,执行下面这条命令:
qemu-img create -f qcow2 ubuntu.qcow2 30G
这条命令的意思是:创建一个名为ubuntu.qcow2的磁盘镜像,格式为qcow2,容量上限30GB。
这里有一个新手容易误解的地方:qcow2格式的镜像文件一开始很小,只有几百KB,它会随着虚拟机里数据的增加而逐步增大,直到达到30GB上限,这种做法省空间,也让镜像文件便于复制和迁移,是绝大多数场景下的首选。
如果你更看重性能,不在乎空间占用,也可以创建raw格式的镜像:
qemu-img create -f raw debian.raw 20G
raw格式会一次性占满20GB空间,但读写时少了一层转换,磁盘I/O稍快一些,两种格式没有绝对的好坏,我给你的建议是:日常实验和学习用qcow2,跑数据库、编译任务等磁盘密集型负载可以考虑raw。
启动安装介质,把系统封装进镜像
磁盘镜像造好后,接下来把它当成一块空硬盘,用系统ISO镜像引导开机,以安装Ubuntu Server为例:
qemu-system-x86_64 -m 2048 -smp 2 -hda ubuntu.qcow2 -cdrom ubuntu-22.04-server-amd64.iso -boot d
各参数的含义是:
- -m 2048:分配2GB内存。
- -smp 2:分配2个CPU核心。
- -hda ubuntu.qcow2:把刚才创建的镜像挂载为第一块硬盘。
- -cdrom ubuntu.iso:把ISO镜像挂载为光驱。
- -boot d:指定从光驱启动。
执行后,会弹出一个图形窗口,显示Ubuntu的安装界面,跟着向导完成系统安装,整个过程和物理机装系统几乎一致。安装完成后,重启虚拟机时会发现再次进入了安装界面,这是因为光驱还在优先引导
,这时把命令里的-boot d改成-boot c,让虚拟机从硬盘启动即可。
在安装过程中,qemu会默认开启一个VNC服务,如果你在远程服务器上执行上述命令,可以通过VNC客户端连接看到安装界面,这一点在无显示器环境下使用qemu时特别方便。
qemu 和 virtualbox 的区别是什么
新手经常问的一个问题是:既然VirtualBox有图形界面,点几下鼠标就能建好虚拟机,为什么还要折腾qemu的命令行?这个问题问到了点子上,我直接给你对比结论。
| 对比项 | qemu | VirtualBox |
|---|---|---|
| 界面 | 默认命令行,可选图形管理工具 | 完整图形界面,上手快 |
| 性能 | 配合KVM可接近原生性能 | 日常使用足够,重负载略逊 |
| 网络模式 | 支持桥接、用户模式、VDE等 | NAT、桥接、内部网络 |
| 快照能力 | 通过qemu-img或QMP支持 | 界面一键快照,更直观 |
| 适用场景 | 服务器、嵌入式、云镜像定制 | 桌面虚拟机、跨平台测试 |
qemu的精髓不在方便,而在灵活和贴近底层,尤其当你需要在服务器上创建虚拟机、定制云镜像,或者调试内核时,VirtualBox的图形界面反而会成为拖累,行业共识认为,qemu加上KVM是Linux服务器上虚拟化的首选组合,而VirtualBox更适合个人桌面用户快速开一台测试虚拟机,两者的定位不完全重合,按你的使用场景选就好。
我见过不少开发者,最初从VirtualBox入手学会了虚拟机的基本概念,后来转向qemu做自动化打包,这个路径很自然,如果你只是需要跑个Windows软件或体验新系统,用VirtualBox更省心;如果你要把装好的系统镜像分发给别人、想写脚本批量生成虚拟机,或者折腾不同架构的模拟,那qemu会越用越顺手,近年来的趋势是,越来越多云原生开发者在本地用qemu做镜像构建,因为它能直接生成云平台通用的磁盘格式。
封装完成后如何调整虚拟机资源
虚拟机装好系统,运行一段时间后,你可能会发现内存不够用,磁盘空间也快满了,虚拟机的好处就是资源可以随时调整,不像物理机那样拆机换硬件,qemu的资源调整分两种情况。
调整内存和CPU
内存和CPU的调整最简单,直接在启动命令里改参数就行,不需要动磁盘镜像:
qemu-system-x86_64 -m 4096 -smp 4 -hda ubuntu.qcow2 -accel kvm
这条命令把内存加到4GB,CPU核心加到4个,并开启了KVM硬件加速。加了-accel kvm后,虚拟机的性能会大幅提升,因为qemu会把大部分虚拟机指令直接交给CPU的虚拟化硬件去执行,不再逐条模拟,执行前先确认你的CPU支持虚拟化,用
ls -l /dev/kvm检查,存在这个设备文件就可以用KVM。
改内存和CPU不影响磁盘里的数据,随时可以改,也随时可以改回来。
扩容磁盘镜像
磁盘空间不够用时,情况稍微复杂一些,qcow2镜像虽然初始体积小,但设定的上限在那里,比如你创建时设的30GB,用完了就得扩容。
第一步,扩大镜像本身:
qemu-img resize ubuntu.qcow2 50G
这一步只是把镜像容量上限从30GB改为50GB,系统内部还没有感知到新空间,第二步,进入虚拟机,用分区工具把新增的空间分配给根分区。
- ext4文件系统:用
resize2fs /dev/sda1合并新空间。 - XFS文件系统:用
xfs_growfs /扩展。 - LVM逻辑卷:先用
lvextend扩展逻辑卷,再执行上述文件系统扩容命令。
这套操作和物理机上给磁盘扩容的步骤完全一样,网上有大量详细教程,跟着做就行。
压缩qcow2镜像体积
虚拟机用久了,qcow2镜像会越来越大,即使你删掉了里面的文件,镜像体积也不会自动缩小,如果你打算把这台虚拟机拷贝给别人,或者上传到服务器,提前瘦身很有必要。
先启动虚拟机,用fstrim -av命令释放未使用的空间,然后关机,接着在宿主机上执行:
qemu-img convert -O qcow2 ubuntu.qcow2 ubuntu-compact.qcow2
convert命令会重新创建一个干净的镜像文件,只保留实际有数据的部分,压缩完成后,新的镜像可能比原来小不少,对比一下体积,确认无误再把旧镜像删掉即可,据QEMU官方文档说明,convert还能把其他格式的镜像统一转换成qcow2,也支持raw转qcow2,是镜像格式迁移的标准工具。
qemu 虚拟机网络配置怎么选
虚拟机装好了,资源也够用,接下来就是让它上网,qemu的网络配置有几种模式,新手不需要全弄懂,先掌握两种最常用的即可。
用户模式网络
默认情况下,不加任何网络参数,qemu会自动创建一个用户模式的网络(user mode),虚拟机可以通过NAT方式访问外网,宿主机也能访问虚拟机,但外部设备无法主动连接到虚拟机内部。
显式指定用户模式网络的写法:
-netdev user,id=net0 -device virtio-net-pci,netdev=net0
这里用virtio-net-pci虚拟网卡,相比qemu默认模拟的e1000网卡,virtio半虚拟化网卡性能更好,吞吐量更接近物理网卡,大多数现代Linux发行版都自带virtio驱动,Windows系统可能需要额外安装驱动。
用户模式网络适合做开发和测试,比如果你要在虚拟机里装一个Nginx,然后在宿主机上通过localhost端口访问,qemu还支持通过hostfwd参数做端口转发:
-netdev user,id=net0,hostfwd=tcp::8080-:80 -device virtio-net-pci,netdev=net0
这条命令把宿主机的8080端口转发到虚拟机的80端口,外部访问宿主机8080端口就等同于访问虚拟机里的Web服务。
桥接网络模式
用户模式网络有个先天限制,外部设备无法直接与虚拟机通信,如果你在虚拟机里搭建了一个游戏服务器,想让局域网里的朋友直接连进来,桥接模式才是正解。
qemu的桥接模式需要宿主机先建立一个网桥,然后把物理网卡桥接到这个网桥上,常见做法是用ip命令快速创建一个桥:
sudo ip link add br0 type bridge sudo ip link set br0 up
然后给你的物理网卡(比如eth0)设置IP,并把它加入桥:
sudo ip addr add 192.168.1.100/24 dev br0 sudo ip link set eth0 master br0
最后启动qemu时,使用br0作为虚拟机的网桥:
-netdev bridge,id=net0,br=br0 -device virtio-net-pci,netdev=net0
桥接模式下的虚拟机,会像一台独立的物理机一样出现在局域网中,拥有自己的IP地址,可以直接被其他设备访问,不过这种配置依赖你的网络环境,如果宿主机用的是无线网卡,桥接通常会有兼容性问题,这是qemu的已知局限。
Q&A:qemu 封装虚拟机常见问题解答
问:qemu-img create时选raw还是qcow2,哪个更适合新手?
新手建议首选qcow2,理由是它的按需分配特性让磁盘占用更小,支持快照、压缩和加密功能,而且通过qemu-img convert可以随时转换为raw或其他格式,raw格式虽然性能略好,但不支持快照,也不节省空间,遇到需要回滚系统状态的场景时非常不便,等你把qcow2用熟了,再根据具体场景评估是否需要换成raw。
问:启动qemu后窗口黑屏,什么都看不到,是什么原因?
最常见的原因是KVM加速没有启用,或者CPU不支持嵌套虚拟化,检查/dev/kvm是否存在,确认CPU的VT-x或AMD-V功能已开启,另一个常见情况是ISO文件损坏或下载不完整,导致引导加载器无法读取,可以先用qemu-img info ubuntu.qcow2确认镜像文件完整,然后排除法检查:先用-m 512最小配置启动,逐步排除参数冲突。
问:qemu命令行太长,每次启动都要输入一大串参数,有没有简化办法?
有,qemu支持把启动参数写入脚本文件,例如创建一个start.sh,用变量或直接拼接命令的方式管理参数,更正规的做法是编写systemd service文件,把qemu启动命令注册为系统服务,实现开机自启和异常退出后自动重启,如果你需要管理多台qemu虚拟机,可以考虑安装libvirt+virt-manager,它会提供一套独立的命令和图形界面来管理qemu实例,qemu仍然在底层工作,但你可以不用再面对冗长的命令行了。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/646167.html





