目录
一、引言:Qemu 是什么
二、Qemu 的安装秘籍
2.1 在 Ubuntu 上安装 Qemu
2.2 在 CentOS 上安装 Qemu
2.3 从源码编译安装 Qemu
三、Qemu 运行模式大揭秘
3.1 使用者模式
3.2 系统模式
四、Qemu 系统模式实战
4.1 准备工作
4.2 启动 Qemu 虚拟机
五、Qemu 网络配置技巧
5.1 User Mode Network
5.2 Tap/Tun Network
六、Qemu 进阶用法探索
6.1 Qemu 与 KVM 结合加速
6.2 Qemu 常用参数详解
七、总结与展望
一、引言:Qemu 是什么
在 Linux 的广阔技术天地里,Qemu 就像是一把神奇的万能钥匙,能够打开通往各种不同硬件平台和操作系统世界的大门,是一款功能强大的开源虚拟化软件,在虚拟化领域占据着举足轻重的地位。无论是开发人员进行跨平台开发,还是系统管理员测试不同的操作系统,Qemu 都能提供强大的支持。
与其他常见模拟器相比,Qemu 有着独一无二的优势。就拿 VirtualBox 来说,它虽然也是一款出色的虚拟机软件,广泛应用于日常的虚拟化需求,但在硬件平台的模拟支持上,Qemu 更胜一筹。Qemu 能够模拟多种不同的硬件平台,从常见的 x86 架构,到 ARM、PowerPC 等架构 ,这使得开发者可以在自己熟悉的计算机上,模拟运行不同架构的操作系统和应用程序,而无需实际拥有对应的硬件设备,大大降低了开发和测试成本。例如,在开发针对 ARM 架构的嵌入式软件时,借助 Qemu,开发者可以在 x86 架构的电脑上进行模拟开发和调试,而不用花费高昂的成本购买 ARM 硬件开发板。
再看 KVM(Kernel-based Virtual Machine),它是基于 Linux 内核的虚拟化技术,性能表现出色,但 Qemu 的灵活性是 KVM 难以比拟的。Qemu 不仅可以作为独立的虚拟化软件使用,还能与 KVM 结合,实现硬件加速的虚拟化,充分发挥两者的优势。同时,Qemu 还支持用户模式仿真,这意味着它可以在一种架构上运行另一种架构的程序,而 KVM 主要侧重于系统级的虚拟化。
二、Qemu 的安装秘籍
想要使用 Qemu,安装是第一步。在不同的 Linux 发行版中,Qemu 的安装方法各有特点,下面我就为大家详细介绍在常见的 Ubuntu 和 CentOS 系统上的安装步骤。
2.1 在 Ubuntu 上安装 Qemu
如果你使用的是基于 Debian 的 Ubuntu 系统,安装 Qemu 相对简单,通过包管理器就能轻松搞定。首先,打开终端,更新系统软件包列表,确保你安装的是最新版本的软件包,输入以下命令:
sudo apt update
更新完成后,就可以安装 Qemu 了。如果你只是想安装 Qemu 的基本功能,可以执行:
sudo apt install qemu-system
但如果你希望获得更完整的虚拟化体验,比如使用图形界面管理虚拟机,那就需要安装更多的组件 ,命令如下:
sudo apt install qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager
这里的qemu-kvm提供了 KVM 加速功能,可以显著提升虚拟机的性能;libvirt-daemon和libvirt-clients是管理虚拟机的工具;bridge-utils用于配置网络桥接,让虚拟机能够访问外部网络;virt-manager则是一个图形化的虚拟机管理工具,使用起来更加直观方便。
安装完成后,可以通过运行qemu-system-x86_64 –version来验证 Qemu 是否正确安装,并查看其版本信息。
2.2 在 CentOS 上安装 Qemu
对于使用 CentOS 系统的用户,同样可以利用包管理器进行安装。在安装之前,先确保系统已连接到互联网,并使用以下命令更新系统软件包列表:
sudo yum update
接着,安装 Qemu 软件包,命令如下:
sudo yum install qemu-system
如果需要安装图形界面管理工具virt-manager,可以执行:
sudo yum install virt-manager
安装完成后,为了让非 root 用户也能使用虚拟化功能,需要将用户添加到相应的组中,比如libvirt组 ,命令如下:
sudo usermod -a -G libvirt $(whoami)
newgrp libvirt
2.3 从源码编译安装 Qemu
除了使用包管理器安装,从源码编译安装 Qemu 可以让你获得最新版本的 Qemu,并且能够根据自己的需求进行定制。不过,这个过程相对复杂一些,需要安装一些编译依赖。
以 Ubuntu 系统为例,首先安装编译所需的工具和依赖包:
sudo apt install build-essential libncurses5-dev libsdl1.2-dev libpixman-1-dev
然后,从 Qemu 官方网站(Download QEMU – QEMU )下载最新的源码包,比如qemu-7.2.0.tar.xz 。下载完成后,解压源码包:
tar xvJf qemu-7.2.0.tar.xz
cd qemu-7.2.0
接下来,进行配置。你可以通过./configure –help查看所有可用的配置选项。例如,如果要启用 KVM 加速,可以执行:
./configure --enable-kvm
配置完成后,开始编译,这一步可能需要一些时间,取决于你的计算机性能:
make -j4
这里的-j4表示使用 4 个线程进行编译,可以加快编译速度。编译完成后,执行安装命令:
sudo make install
安装完成后,就可以在/usr/local/bin目录下找到编译生成的 Qemu 可执行文件。
三、Qemu 运行模式大揭秘
3.1 使用者模式
使用者模式(User Mode)就像是一个神奇的 “翻译官”,让你可以在不拥有特定硬件平台的情况下,运行不同平台编译的 Linux 程序。在这种模式下,最显著的特点就是无需用户操心内核和虚拟磁盘的自定义配置,Qemu 会自动处理好一切,你只需专注于运行程序本身,使用起来非常便捷。
比如,当你在开发一款跨平台的应用程序时,可能需要在不同架构的处理器上进行测试,像 ARM、MIPS 等。如果没有 Qemu 的使用者模式,你可能需要购买对应的硬件开发板,成本高昂且耗时。而有了 Qemu,你只需在自己的 x86 架构电脑上,通过简单的命令就能运行针对其他架构编译的程序 ,大大提高了开发效率。
下面来看看如何在使用者模式下运行程序。如果你的程序是静态编译的,也就是在编译时使用了-static选项,这样编译出来的程序不依赖外部的动态链接库,运行起来就非常简单。假设你有一个针对 MIPS 架构编译的静态可执行程序hello,首先,你需要找到对应的 Qemu 模拟器二进制文件,比如qemu-mips ,可以使用which qemu-mips命令来查找它的路径。然后,将其复制到当前目录,使用以下命令即可运行程序:
$ cp $(which qemu-mips) .
$ ./qemu-mips hello "Hello World"
执行上述命令后,你就能看到程序输出Hello World,就像在真实的 MIPS 架构设备上运行一样。
而对于动态编译的程序,由于它依赖动态链接库,运行时稍微复杂一些。例如,你有一个动态编译的busybox程序,直接使用qemu-mips运行会报错,因为它找不到所需的动态链接库。这时,你可以通过chroot命令来更改 Qemu 执行的根目录,将动态链接库所在的目录设置为根目录,假设busybox和它的动态链接库都在当前目录下的bin目录中,操作如下:
$ cp $(which qemu-mips) .
$ sudo chroot . ./qemu-mips ./bin/busybox
这样,Qemu 就能在指定的目录中找到动态链接库,从而成功运行程序。
3.2 系统模式
系统模式(System Mode)则像是一个功能强大的 “虚拟世界建造者”,允许用户根据自己的需求,精细地定制虚拟计算机系统的各个组件。在系统模式下,你可以自由地指定运行的内核镜像、虚拟硬盘文件、内核命令行等参数,打造出一个与真实硬件环境高度相似的虚拟环境,这为系统开发、测试、教学等场景提供了极大的便利。
对于系统开发人员来说,在开发新的操作系统或者对现有操作系统进行定制化修改时,Qemu 的系统模式是一个不可或缺的工具。通过在 Qemu 中模拟不同的硬件平台和操作系统环境,可以方便地进行内核调试、驱动开发和系统优化等工作。例如,在开发一款基于 ARM 架构的嵌入式操作系统时,开发人员可以使用 Qemu 创建一个虚拟的 ARM 开发板环境,在这个环境中进行操作系统的编译、安装和调试,避免了在真实硬件上频繁烧录系统带来的麻烦,同时也降低了开发成本。
在系统测试方面,Qemu 的系统模式也发挥着重要作用。软件测试人员可以利用 Qemu 创建多个不同配置的虚拟机,模拟各种实际使用场景,对软件进行全面的兼容性和稳定性测试。比如,测试一款软件在不同版本的 Windows 和 Linux 操作系统上的运行情况,就可以通过 Qemu 快速创建对应的虚拟机环境,无需为每一种操作系统准备一台真实的物理机。
在教学领域,Qemu 的系统模式为学生提供了一个安全、可定制的实验环境。学生可以在 Qemu 中学习操作系统的安装、配置和管理,进行网络实验、数据库实验等,而不用担心误操作导致真实系统的损坏。例如,在学习 Linux 系统管理时,学生可以使用 Qemu 创建一个 Linux 虚拟机,在其中进行用户管理、文件系统操作、服务配置等实验,加深对知识的理解和掌握。
四、Qemu 系统模式实战
4.1 准备工作
在开始 Qemu 系统模式的实战之旅前,我们需要准备好一些必要的文件,就像是踏上冒险前要备好装备一样。其中,内核镜像和 IDE 硬盘镜像尤为重要。
对于内核镜像,我们可以从 Debian 官网(Debian — The Universal Operating System )获取。在官网中,进入 “Getting Debian” 菜单,选择 “Download”,然后根据自己的需求选择合适的 Debian 版本和架构,比如 “Stable” 版本和 “amd64” 架构。在镜像类型中,“Netinst” 是安装最小化版本的不错选择,它能让我们快速搭建起一个基础的系统环境。选择好后,点击下载链接,就能获取到所需的内核镜像文件。
而 IDE 硬盘镜像,我们可以使用qemu-img工具来创建。qemu-img是 Qemu 提供的一个磁盘管理工具,功能十分强大。例如,要创建一个名为debian.img,大小为 10GB 的 qcow2 格式的硬盘镜像,可以使用以下命令:
qemu-img create -f qcow2 debian.img 10G
这里的-f参数指定了镜像文件的格式为qcow2,这是一种常用的磁盘镜像格式,具有占用空间小、支持快照等优点 。
4.2 启动 Qemu 虚拟机
一切准备就绪后,就可以启动 Qemu 虚拟机了。启动 Qemu 虚拟机的命令包含多个参数,每个参数都有其特定的作用,通过合理配置这些参数,我们可以打造出符合自己需求的虚拟机环境。
假设我们已经下载好了 Debian 的内核镜像文件vmlinuz,并创建了硬盘镜像debian.img,下面是启动 Qemu 虚拟机的命令示例:
qemu-system-x86_64
-kernel vmlinuz
-hda debian.img
-append "root=/dev/sda console=ttyS0"
-nographic
下面来详细解释一下这些参数:
qemu-system-x86_64:这是 Qemu 针对 x86_64 架构的模拟器可执行文件,不同的架构可能有不同的可执行文件,比如qemu-system-arm用于 ARM 架构。
-kernel vmlinuz:指定使用的内核镜像文件为vmlinuz,这个文件包含了操作系统的核心代码,是启动虚拟机的关键。
-hda debian.img:将debian.img作为虚拟机的硬盘,-hda表示使用第一个 IDE 硬盘接口 ,如果有多个硬盘,可以使用-hdb、-hdc等参数指定。
-append “root=/dev/sda console=ttyS0″:-append参数用于向内核传递启动参数。root=/dev/sda指定了根文件系统所在的设备为/dev/sda,也就是我们前面指定的硬盘镜像;console=ttyS0指定了串口终端为控制台,这样我们就可以通过串口与虚拟机进行交互。
-nographic:表示不使用图形界面,以纯文本模式启动虚拟机。如果不添加这个参数,Qemu 会尝试启动图形界面,但在某些情况下可能会出现兼容性问题。如果需要使用图形界面,可以去掉这个参数,并确保系统安装了相关的图形库和显示驱动。
执行上述命令后,Qemu 就会启动虚拟机,并加载我们指定的内核镜像和硬盘镜像。如果一切顺利,你将在终端中看到虚拟机的启动过程,就像在真实的计算机上启动系统一样。
五、Qemu 网络配置技巧
在使用 Qemu 的过程中,网络配置是一个至关重要的环节,它直接关系到虚拟机与外界的通信能力。Qemu 提供了多种网络配置方式,其中 User Mode Network 和 Tap/Tun Network 是较为常用的两种,下面我将为大家详细介绍这两种网络配置方式的特点和配置方法。
5.1 User Mode Network
User Mode Network 就像是一个便捷的 “网络代理”,它实现虚拟机上网非常简单,类似于 VMware 里的 NAT 模式 。在这种模式下,Qemu 使用 Slirp 实现了一整套 TCP/IP 协议栈,不需要管理员权限就能运行,这使得它在一些对权限要求严格的场景中非常实用。
比如,当你只是需要让虚拟机能够访问互联网,进行软件更新、下载文件等操作时,User Mode Network 就能轻松满足需求。虚拟机里使用 DHCP 方式获取 IP,Qemu 启动时加入-user-net参数,虚拟机即可与互联网通信 ,就像为虚拟机找到了一个通往互联网的快速通道。
不过,User Mode Network 也存在一些局限性,其中最明显的就是虚拟机与主机的通信不太方便。由于它在 Qemu 内部实现所有网络协议栈,相对性能也较差。例如,在进行文件传输、远程调试等需要频繁与主机交互的操作时,可能会遇到延迟较高、连接不稳定等问题。
下面来看具体的配置方法。假设你已经启动了一个 Qemu 虚拟机,要让它通过 User Mode Network 上网,可以在启动命令中加入相关参数,例如:
qemu-system-x86_64
-hda debian.img
-net user,hostfwd=tcp::10022-:22
-nographic
这里的-net user表示使用 User Mode Network,hostfwd=tcp::10022-:22表示将宿主机的 10022 端口转发到虚拟机的 22 端口,这样就可以通过 SSH 连接到虚拟机 ,方便进行远程管理。
5.2 Tap/Tun Network
Tap/Tun Network 则像是一座功能强大的 “网络桥梁”,它能让虚拟机与主机、互联网之间的通信变得十分容易,设置上类似 VMware 的 host – only 模式 。这种方式使用 Tun/Tap 设备在主机上增加一块虚拟网络设备,比如tun0,然后就可以像真实网卡一样配置它,具有很好的性能,并且支持各种虚拟网络拓扑 ,在需要构建复杂网络环境的场景中应用广泛。
比如,在进行网络测试、开发网络应用程序时,需要虚拟机与主机之间能够高效、稳定地通信,Tap/Tun Network 就能很好地满足这些需求。通过合理配置,虚拟机可以与主机处于同一个局域网中,实现文件共享、远程访问等功能,就像它们是真实的物理设备连接在同一个网络中一样。
要使用 Tap/Tun Network,首先需要确保内核支持 Tun/Tap 设备。你可以通过检查/dev/net/tun文件是否存在来确认,如果不存在,可以按照以下步骤进行配置。假设你使用的是基于 Debian 的系统:
安装相关工具包,使用以下命令:
sudo apt-get install uml-utilities bridge-utils
确认内核支持 Tun/Tap 设备,如果/dev/net/tun文件不存在,可以尝试手动创建:
sudo mkdir /dev/net
sudo mknod /dev/net/tun c 10 200
sudo /sbin/modprobe tun
创建一个 Tun/Tap 初始化脚本,例如/etc/qemu-ifup ,内容如下:
#!/bin/sh
/sbin/ifconfig $1 172.20.0.1 up
然后给予该脚本执行权限:
sudo chmod +x /etc/qemu-ifup
启动 Qemu 虚拟机时,配置网络参数。假设你已经创建好了硬盘镜像debian.img,启动命令如下:
qemu-system-x86_64
-hda debian.img
-net nic
-net tap,ifname=tap0,script=/etc/qemu-ifup,downscript=no
-nographic
这里的-net nic表示创建一个网卡,-net tap表示使用 Tap 设备,ifname=tap0指定了 Tap 设备的名称为tap0,script=/etc/qemu-ifup指定了初始化脚本,downscript=no表示不使用关闭脚本。
配置虚拟机的网络参数,使其与主机在同一网段。例如,主机上tun0的 IP 地址为172.20.0.1 ,子网掩码为255.255.0.0 ,则虚拟机的 IP 地址可以设置为172.20.0.100 ,网关为172.20.0.1 ,DNS 可以设置为主机的 DNS 或者公共 DNS,如8.8.8.8 。
通过以上步骤,就完成了 Tap/Tun Network 的配置,虚拟机就可以与主机、互联网进行通信了。
六、Qemu 进阶用法探索
6.1 Qemu 与 KVM 结合加速
在虚拟化的世界里,追求更高的性能是永恒的主题。Qemu 虽然功能强大,但在性能方面,单独使用时可能无法满足一些对性能要求苛刻的场景。这时,KVM(Kernel-based Virtual Machine)就像是一位强力助手,与 Qemu 结合后,能为虚拟机的运行带来显著的性能提升。
KVM 是基于 Linux 内核的虚拟化技术,它利用硬件辅助虚拟化(如 Intel VT 或 AMD-V),让虚拟机中的部分指令能直接在真实 CPU 中执行 ,大大提高了虚拟机的运行效率。简单来说,KVM 就像是一座桥梁,连接了虚拟机和硬件,让虚拟机能够更高效地利用硬件资源。
当 Qemu 与 KVM 结合时,Qemu 主要负责模拟硬件设备,如网卡、显卡、存储控制器等,而 KVM 则专注于提供 CPU 和内存的虚拟化支持。这种分工合作的方式,充分发挥了两者的优势,使得虚拟机的性能得到了极大的提升。例如,在运行大型数据库服务器、高性能计算任务等对性能要求较高的场景中,Qemu 与 KVM 结合后的表现要远远优于单独使用 Qemu。
那么,如何将 Qemu 与 KVM 结合使用呢?首先,需要确保你的系统支持硬件虚拟化。对于 Intel CPU,可以通过grep “vmx” /proc/cpuinfo命令来检查;对于 AMD CPU,则使用grep “svm” /proc/cpuinfo命令 。如果输出结果中包含vmx(Intel)或svm(AMD),则说明你的 CPU 支持硬件虚拟化。
接下来,安装qemu-kvm软件包。在基于 Debian 的系统中,如 Ubuntu,使用以下命令进行安装:
sudo apt install qemu-kvm
在基于 RPM 的系统中,如 CentOS,命令如下:
sudo yum install qemu-kvm
安装完成后,就可以使用kvm命令替代qemu-system-x86_64命令来启动虚拟机了。例如,原来使用qemu-system-x86_64启动虚拟机的命令如下:
qemu-system-x86_64
-hda debian.img
-m 2048
-nographic
使用kvm命令启动时,只需将qemu-system-x86_64替换为kvm即可:
kvm
-hda debian.img
-m 2048
-nographic
这样,虚拟机就会在 KVM 的加速下运行,性能会有明显的提升。在实际使用中,你可以根据自己的需求,进一步优化 KVM 和 Qemu 的配置,以获得更好的性能表现。例如,可以调整虚拟机的 CPU 和内存分配,优化存储和网络配置等。
6.2 Qemu 常用参数详解
在使用 Qemu 启动虚拟机时,掌握常用参数的用法至关重要,这些参数就像是一把把钥匙,能够帮助我们根据不同的需求,打造出个性化的虚拟机环境。下面,我将为大家深入解析一些启动系统时常用的参数。
内存相关参数:-m参数用于指定虚拟机的内存大小,单位可以是 MB 或 GB。例如,-m 2048表示为虚拟机分配 2048MB(即 2GB)的内存。合理分配内存对于虚拟机的性能至关重要,如果内存分配过小,虚拟机在运行复杂应用程序时可能会出现卡顿;而分配过大,则会浪费宿主机的资源。比如,运行一个简单的 Linux 桌面环境,2GB 内存通常就足够了,但如果要运行大型数据库服务器,可能需要 4GB 甚至更多的内存。
BIOS 相关参数:-bios参数用于指定虚拟机使用的 BIOS。默认情况下,Qemu 使用的是 SeaBIOS,但在一些特殊场景中,我们可能需要使用其他的 BIOS,比如 OVMF(用于 UEFI 启动) 。例如,-bios OVMF.fd表示使用OVMF.fd作为虚拟机的 BIOS,这样就可以支持 UEFI 启动,方便安装一些需要 UEFI 支持的操作系统,如 Windows 10 的 64 位版本。
串口相关参数:-serial stdio参数用于指定串口输出,它将串口设备重定向到标准输入输出(即终端)。在调试内核、查看系统启动日志等场景中,这个参数非常有用。比如,当我们在虚拟机中安装操作系统时,如果遇到问题,可以通过串口输出查看详细的安装过程和错误信息,从而快速定位问题。
CPU 相关参数:-smp参数用于指定虚拟机的 CPU 核心数。例如,-smp 4表示为虚拟机分配 4 个 CPU 核心。根据虚拟机的工作负载,合理分配 CPU 核心数可以提高其运行效率。如果虚拟机主要用于运行单线程应用程序,过多的 CPU 核心可能并不会带来明显的性能提升;但对于多线程的计算任务,增加 CPU 核心数可以显著加快处理速度。
存储设备相关参数:-hda参数用于指定第一个硬盘镜像文件,例如-hda debian.img将debian.img作为虚拟机的主硬盘。-cdrom参数则用于指定光盘镜像文件,常用于加载操作系统安装镜像,如-cdrom ubuntu.iso 。另外,-drive参数提供了更灵活的存储设备配置方式,支持多种格式和选项。例如,-drive file=disk.qcow2,format=qcow2,if=virtio指定了一个格式为qcow2的硬盘镜像文件disk.qcow2,并使用virtio接口,virtio接口具有高性能的特点,适合在虚拟机中使用。
网络相关参数:-net nic用于添加一个虚拟网卡,默认是e1000网卡。-net user表示使用用户模式网络,提供 NAT 功能,让虚拟机可以访问外部网络,但外部无法直接访问虚拟机,适用于简单的网络需求,如虚拟机上网下载文件。而-net bridge,br=br0则用于配置桥接网络,br=br0指定了宿主机的网桥设备为br0,通过这种方式,虚拟机可以与宿主机共享网络接口,直接与外部网络通信,适用于需要高性能网络的场景,如网络测试、开发网络应用程序等。
七、总结与展望
通过本文的介绍,相信大家已经对 Qemu 的使用有了较为深入的了解。从安装到运行模式,再到网络配置和进阶用法,Qemu 展现出了强大的功能和灵活性,无论是进行跨平台开发、系统测试,还是开展教学与研究工作,Qemu 都能成为你的得力助手。
Qemu 的应用场景远不止于此。在漏洞挖掘领域,Qemu Fuzzer 这款基于 AFL 的模糊测试工具,通过修改 Qemu 源代码,使 AFL 能够控制其内部状态,对 Qemu 虚拟机进行深度安全漏洞挖掘,帮助开发者及时发现并修复潜在的安全问题 ,保障系统的安全性。在操作系统研究中,借助 Qemu,研究人员可以模拟各种不同的硬件平台和操作系统环境,深入探究操作系统的内核机制、内存管理、设备驱动等方面的知识,为操作系统的优化和创新提供有力支持。
如果你对 Qemu 感兴趣,不妨进一步探索它在更多场景下的应用。你可以尝试在 Qemu 中运行不同架构的操作系统,如 ARM、PowerPC 等,体验跨平台的开发乐趣;也可以利用 Qemu 进行网络实验,构建复杂的网络拓扑,研究网络协议和网络安全;还可以深入研究 Qemu 与其他技术的结合,如与容器技术相结合,探索新的应用交付和部署方式。相信在不断的探索中,你会发现 Qemu 更多的魅力和价值。
暂无评论内容