//SVG 图标绘画
正在载入中...

?、アイドル宣言
的博客小站

返回到首页


作者:?、アイドル宣言

前言

本文章是为了让各位更好的学习 QEMU 命令。
这里只学习 qemu-system,没有 qemu-user 的内容。

QEMU 是什么

QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器软件,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KVM,QEMU能虚拟化至真实电脑的速度。

QEMU 有什么用?

简单来说就是能跨平台高速模拟各种系统。不恰当的比喻:就是能在手机上运行 Windows 系统,而且速度很快。

开始学习

安装 QEMU

编译安装

安装依赖

QEMU 可以通过编译的方式安装。
需要先根据你系统的情况,安装 QEMU 必需的依赖(一般是这些):

1
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev libsdl1.2-dev libsnappy-dev liblzo2-dev zlib1g-dbg automake gcc python wget && apt-get install build-essential

Git Glib fdt pixman zlib libsdl snappy lzo2 automake gcc python
安装完成后,需要下载 QEMU 的源码包或者是克隆。

克隆 QEMU

请输入以下命令(北京外国语大学开源软件镜像站)

1
git clone https://mirrors.bfsu.edu.cn/git/qemu.git

然后你应该会在主目录看到一个叫“qemu”的文件夹,这就是最新的源码包。

下载 QEMU 源码(tar.xz)

在此网站下载源码包:
https://download.qemu.org
然后通过 tar 命令解压:

1
tar -xvf ./qemu-7.1.0-rc3.tar.xz

开始编译

如果你前面的操作完成了的话,就可以开始编译了。
首先我们要 cd 到目录

1
cd ~/qemu-7.1.0-rc3

然后开始配置编译内容,输入 ./configure 即可。但是这样的话没用的东西会很多,所以我们在 configure 里面加参数。参数可以查阅 ./configure --help。比如我们只需要编译一个架构而不是全局编译,那么我们输入:

1
./configure --target-list=x86_64-softmmu

其中,x86_64-softmmu 是你要编译的架构。
那我们想编译多个架构怎么办呢?
只需要在架构后加上其他架构即可,用小写的逗号分隔。

1
./configure --target-list=x86_64-softmmu,aarch64-softmmu,ppc-softmmu

还有其他的编译选项。这里就不说了。
等待配置完成后,就可以开始编译 qemu 了。
输入 make 可以开始,也可以加参数。比如我要是想开 8 核编译那么输入:

1
make -j8

具体几核看你设备的 CPU 核心数。不加参数只会开一核编译,速度很慢。

编译后安装

编译完成后,你直接运行 qemu 是没有反应的,提示命令不存在。我们需要再安装一下 qemu 才能使用。
输入:

1
make install

就安装完成了。

brew 安装 QEMU

Mac 电脑不需要必须通过编译安装,也可以通过软件包管理器安装 QEMU。
首先给你的 Mac 电脑安装 HomeBrew。这里推荐使用国内安装脚本:

1
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

跟着安装脚本走。安装完成 Homebrew 之后,输入以下命令安装 QEMU:

1
brew install qemu

等待安装完成即可享用 QEMU。

APT 安装 QEMU

aptDebian GNU/Linux 以及基于 Debian 的其他发行版中默认的软件包管理器。我们使用它安装 QEMU。同样也不用必须编译安装。
输入以下命令,安装 qemu 的命令行。以 x86_64/i386 架构为例,输入:

1
sudo apt install qemu-system-x86

等待安装完成即可。
如果你的 Linux 系统有图形界面,那么可以直接安装 qemu 的图形前端。输入:

1
sudo apt install aqemu

安装完成后,可以在程序菜单里看到 aqemu,直接运行即可。

QEMU 的使用

运行 QEMU

我们按照上面的步骤安装完成 QEMU 之后,可以查看一下安装完 QEMU 的版本,输入:

1
qemu-system-<架构> --version


可以看到 QEMU 已经正确安装,我们现在就可以试试水,看看如何启动。

熟悉命令

QEMU 基本命令如下(x86_64):

-accel 加速类型,一般为(kvm,hax,hvf,tcg)
-machine 机器类型,一般为pc和q35。具体可查看help
-net nic,model=<网卡名称> 设置虚拟机网卡。
-net user 设置虚拟机网络模式,有user和tap可选。
-hda,-hdb,-hdc,-hdd 磁盘位,放入磁盘镜像。
-m 256 设置的内存(RAM),单位是MB。1GB=1024MB
-vga vmware 设置的显示卡
-device 添加各种硬件设备。
-soundhw sb16 启用声音支持。
-cdrom 光盘位,放入 ISO 镜像。
-fda,-fdb 软盘位,放入磁盘镜像。
-cpu 设置虚拟的 CPU
-smp <核心数> 设置虚拟cpu核心数。默认单核
-vnc :<端口号> 开启后使用 VNC Viewer 连接。
-pflash <固件> 并行闪存镜像,一般用于 EFI 启动。
-nographic 无图形启动,一般用于 Linux。
-win2k-hack (i386)在安装 Windows 2000 时使用它以避免磁盘已满错误,但会降低磁盘性能,安装完成后可以删掉该命令。
-usb 启用 USB 控制器,其他 USB 设置需要使用 -device 命令。
-sdl 开启后使用 XSDL Server 连接。 
-k <language> 键盘的语言,一般是为了适配不同语种的键盘。一般不用填。
-boot c 引导顺序,c是硬盘、n是网络、d是光盘、s是软盘。
-name 虚拟机名称,如果你是 VNC 连接,该名称将显示到你 VNC 远程桌面信息。

这些命令组合起来可以运行虚拟机。

一个实例

下面是包含了上面的部分命令的一个实例,不知道你能不能看懂。

qemu-system-x86_64 -hda /home/steve372/win10.qcow2 -cdrom /home/steve372/win10.iso -m 768 -machine q35 -accel kvm -smp 2 -vga std -soundhw ac97 -usb -device usb-tablet -boot d -pflash /home/steve372/QEMU_EFI.fd -net nic,model=rtl8139 -net user -vnc :0 -name "Windows 10"

如果不能看懂,可以看下面的“命令详解“。来更加了解这些命令。

命令详解

-accel 命令

-accel 命令可以为虚拟机提供加速,有以下加速类型:kvm,hax,hvf,tcg。当然,这些命令要运行起来都有一定的要求,如下:

kvm 只能在 Linux 环境运行,并且需要内核支持(手机可以洗洗睡了)
hvf 只能在 macOS 环境运行。
hax 只能在 Windows 或 macOS 环境运行,似乎不太稳定。
tcg 通用。手机只能用 tcg 了

请根据你自己的系统进行搭配。
这些加速类型之中,kvm是最快的,hvf和hax差不多,最后是tcg。
稳定性中,kvm、hvf、tcg都挺稳定的,hax一般。

-machine 命令

-machine 命令可以设置机器类型。有以下机器类型:

一般来说,我们最常用的就是 pc 和 q35。如果你使用的是别人的镜像,那么务必跟随镜像主的安排。

-net 命令

QEMU 的 -net 命令是提供跟网络相关的功能,这里只介绍最基本的两种方式。
-net 的用法是:

1
-net user -net nic,model=<网卡名称>

首先,前面的 -net 有五种选择:user, tap, bridge, vde, socket
如果你没有特殊需求,直接使用 User 网络即可。
然后,后面的 -net 是选择虚拟的网卡。QEMU 这里有以下网卡可选:

我们常用的是 e1000,ne2k_pci,rtl8139,virtio 网卡。
还是要看镜像主的安排。比如你的镜像支持 rtl8139 网卡,那么输入:

1
-net user -net nic,model=rtl8139

就可以了。

-hda 命令

-hda,-hdb,-hdc,-hdd 是磁盘镜像位,需将下载到的镜像放到这里。用法:

1
-hda <文件路径>

其中,文件支持所有可用的镜像文件。
不推荐使用 -hdc 参数,可能会出问题。
如果需要使用 virtio 磁盘,那么需要使用 -drive 命令。

-m 命令

-m 命令是设置你虚拟机的内存用的。M 是 Memory(内存) 的首字母。用法:

1
-m <数字>

数字单位是 MB。1 GB=1024 MB、3 GB=3072 MB

-vga 命令

-vga 命令可以模拟虚拟机的显卡,用法:

1
-vga <显卡名称>

目前支持的显卡有:

1
2
3
4
5
6
std                  standard VGA (default)
cirrus Cirrus VGA
vmware VMWare SVGA
xenfb Xen paravirtualized framebuffer
virtio Virtio VGA
QXL

如果你模拟的是 Windows 的话,那么可能需要根据你的 Windows 系统选择显卡。如下:

Windows 3.1     需要手动安装 cirrus 驱动。
Windows 95      cirrus
Windows 98      cirrus
Windows 2000    cirrus
Windows XP      std / VMware
Windows Vista   std / VMware
Windows 7       std / VMware
Windows 8       std / VMware
Windows 8.1     std / VMware
Windows 10      std / VMware
Windows 11      std / VMware

Linux 应该可以选择 virtio 显卡。

-device 命令

-device 命令是 QEMU 处理硬件的一个媒介,他也可以取代部分命令。比如 -soundhw 和 -usbdevice。如果需要将 VNC 和鼠标对齐的话,输入:

1
2
-usb // 启用 USB 控制器
-device usb-tablet // 添加虚拟的 USB 触控板

就可以了。更深层次的 USB 命令到后面会讲。

-soundhw 命令

-soundhw 命令是启用声音支持,直白了说就是能让虚拟机出声音。用法:

1
-soundhw <声卡名称>

我们只需要填入声卡名称就可以了,声卡名如下:

1
2
3
4
5
6
7
8
ac97        Intel 82801AA AC97 Audio
adlib 雅马哈 YM3812 (OPL2)
cs4231a CS4231A
es1370 ENSONIQ AudioPCI ES1370
gus Gravis Ultrasound GF1
hda Intel HD Audio
pcspk PC speaker
sb16 创新科技声霸卡 16

我们常用的是 sb16 和 ac97 还有 hda。

-cdrom 命令

该命令是光驱位,放入光盘镜像(*.ISO)用法:

1
-cdrom <文件路径>

直接将光盘文件路径写下即可。
光盘是有code显示的,可以通过这个代码定位问题。

-cpu 命令

模拟你要模拟的 CPU,可选 CPU 有:

具体根据自己需求选择。

-smp 命令

该命令可以指定虚拟 CPU 的数量,核心数,线程数等。用法:

只指定 CPU 数量:

1
-smp 2

即代表 QEMU 会模拟两个 CPU 出来(不是核心)。
当然,你也可以加参数,命令如下:

1
-smp cores=2,threads=4,sockets=1

这条命令的意思是:一个 CPU 插槽,双核四线程。

-vnc 命令

这条命令可以让你的虚拟机通过 VNC Viewer 连接。用法:

1
-vnc :<端口号>

输入后直接使用 VNC Viewer 连接。如果 -vnc :0 那么在 VNC Viewer 的连接中就设置为 <ip地址>:0。如果你是手机开的模拟器,输入 127.0.0.1:0

-pflash 命令

一般用于 EFI 引导启动,用法:

1
-pflash <EFI 固件>

需要你有 EFI 固件,一般是 fd 格式。

其他 QEMU 模拟器的操作

连接 USB 设备

可以通过 -device 命令将 U 盘连接到模拟器
如果要连接 USB 设备到 QEMU,那么需要先查询 USB 设备的位置。我们输入:

1
lsusb -t

来查询 USB 设备的位置。看他的输出:

找到你要连接的 USB 的位置。我这里以 我的 U 盘(Disk 2.0) 为例子。
输入:

1
2
-device usb-ehci,id=ehci
-device usb-host,bus=ehci.0,hostbus=20,hostport=1

其中,第一行的命令是指定虚拟的 USB 版本,我这里是 2.0。如果要虚拟 USB 3.0,请输入 xhci
第二行的命令是定位 USB 设备的位置,我的设备在 Bus 020,Port 1 的位置上,所以输入的bus=20 port=1。而 port 的位置就是指树根下的位置。我是树根下的第 1 个位置,所以填 1。一定要根据自己实际情况填写。

EFI 固件的使用

QEMU 是可以使用 UEFI 启动的,需要 EFI 固件。
启动命令请查看 -pflash 命令。
这里提供下载:
下载 QEMU_EFI.fd

无界面引导

有时候我们在模拟虚拟系统的时候需要直接将终端变成 QEMU 的控制台,那么我们加上 -nographic 命令即可。

QEMU 镜像下载

点击进入下载站