qemu 简介
qemu是一款可执行硬件虚拟化的虚拟机,与他类似的还有Bochs、PearPC,但qemu具有高速(配合KVM)、跨平台的特性
qemu主要有两种运行模式:qemu-user 和 qemu-system
- 用户模式(User Mode),亦称使用者模式。qemu能启动那些为不同中央处理器编译的Linux程序。
- 模拟模式(System Mode),亦成为系统模式。qemu能模拟整个计算机系统,包括中央处理器及其他周边设备,它使能为跨平台编写的程序进行测试及排错工作变得容易。其亦能用来在一部主机上虚拟数个不同的虚拟计算机,类似我们平常使用的Vmare、VirtualBox等。
ubuntu下载
apt-get安装
apt-get install qemu
1 | #安装 qemu-user |
- 源代码安装
要下载并构建QEMU 5.1.0:
1 | wget https://download.qemu.org/qemu-5.1.0.tar.xz |
要从git下载并构建QEMU:
1 | git clone https://git.qemu.org/git/qemu.git |
用户模式使用
为了启动Linux进程,QEMU需要进程可执行文件本身以及它使用的动态库。
即用户模式要下载运行文件对应的链接库
用户模式下的二进制文件
用户模式(x86)
qemu-i386
用户模式(Arm)
qemu-arm
用户模式(MIPS)
qemu-mips
执行32位大端序MIPS二进制文件(MIPS O32 ABI)。qemu-mipsel
执行32位小端序 MIPS二进制文件(MIPS O32 ABI)。qemu-mips64
执行64位大端MIPS二进制文件(MIPS N64 ABI)。qemu-mips64el
执行64位小端序(Little Endian) MIPS二进制文件(MIPS N64 ABI)。qemu-mipsn32
执行32位大端序MIPS二进制文件(MIPS N32 ABI)。qemu-mipsn32el
执行32位小端序(Little Endian) MIPS二进制文件(MIPS N32 ABI)。
使用
(x86为例)
在x86上,您可以尝试使用本机库启动任何进程
在非x86 CPU上,首先需要至少下载一个x86 glibc(qemu-runtime-i386-XXX-.tar.gz
在QEMU网页上)。
确保 LD_LIBRARY_PATH
未设置:
1 | unset LD_LIBRARY_PATH |
然后,您可以启动预编译的ls
可执行文件:
1 | qemu-i386 tests/i386/ls |
您可以查看一下scripts/qemu-binfmt-conf.sh
以便在尝试启动x86可执行文件时Linux内核自动启动QEMU。它需要Linux内核中的binfmt_misc
模块。
命令行选项
1 | qemu-i386 [-h] [-d] [-L path] [-s size] [-cpu model] [-g port] [-B offset] [-R size] program [arguments...] |
-h
打印帮助-L path
设置x86 elf解释器前缀(默认= / usr / local / qemu-i386)-s size
设置x86堆栈大小(以字节为单位)(默认值= 524288)-cpu model
选择CPU型号(-cpu帮助以获得列表和其他功能选择)-E var=value
将环境变量设置为值。-U var
从环境中删除var。-B offset
将来宾地址偏移指定的字节数。当来宾应用程序所需的地址区域保留在主机上时,这很有用。当前仅在某些主机上支持此选项。-R size
预分配给定大小的访客虚拟地址空间(以字节为单位)。指定大小时,可以使用“ G”,“ M”和“ k”后缀。
调试选项:
-d item1,...
激活指定项目的日志记录(使用“ -d帮助”获取日志项目列表)-p pagesize
就像主机页面大小是’pagesize’字节一样-g port
等待gdb连接到端口-singlestep
在单步模式下运行仿真。
(mips)
共有两种模拟程序,分别是运行大端机格式的qemu-mips和小端机格式的模拟执行程序qemu-mipsel,它们的执行参数是一样的。
命令格式
1 | qemu-mipsel [options] program [arguments...] |
- “program”是需要qemu运行的其他处理器编译的程序;
- “arguments”是“program”的参数;
- “options”是qemu-mipsel或qemu-mipsel的选项。
选项 | 说明 |
---|---|
-E var=value | 为program进程设置环境变量 |
-g port | QEMU开启调试模式,等待GDB连接PORT |
LD_PRELOAD=newlib | 使用新的动态库newlib劫持系统调用 |
系统模式使用
系统模式要下载对应的镜像
下载并解压缩安装了Linux硬盘映像(例如 linux.img
),然后键入:
1 | qemu-system-x86_64 linux.img |
调用
1 | qemu-system-x86_64 [选项] [disk_image] |
系统模式命令的格式为”$qemu-system-mipsel [options] [disk_image]”。”disk_image”是一个原始的IDE硬盘镜像。选项如表所示。
常用选项 | 说明 |
---|---|
-kernel bzImage | 使用“bzImage”作为内核镜像 |
-hda/-hdb file | 使用“file”作为IDE硬盘0/1镜像 |
-append cmdline | 使用“cmdline”作为内核命令行 |
-nographic | 禁用图形输出,重定向串行I/O到控制台 |
-initrd file | 使用“file”作为初始化的RAM磁盘 |
网络配置
配置qemu-system网络
qemu-system模式配置网络常见的方法是tap桥接
- 安装网络配置的依赖文件:
1 | $ sudo apt install uml-utilities bridge-utils |
- 修改Ubuntu主机网络接口配置文件:
1 | $sudo vim /etc/network/interfaces |
- 创建并编写qemu网络接口启动脚本:
1 | $ sudo vim /etc/qemu-ifup |
保存文件后使用如下命令修改qemu-ifup的权限:
1
$ sudo chmod a+x /etc/qemu-ifup
重启网络使配置生效:
1
$ sudo /etc/init.d/networking restart
启动桥接网络:
1
$ sudo ifdown ens33 && sudo ifup br0
运行之后,桥br0代替ens33接管了ubuntu虚拟机的网口
启动 qemu
./start.sh
1 |
|