欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > QEMU(Quick EMUlator)学习

QEMU(Quick EMUlator)学习

2024/10/24 9:29:37 来源:https://blog.csdn.net/m0_51451952/article/details/139795426  浏览:    关键词:QEMU(Quick EMUlator)学习

QEMU介绍

QEMU (Quick EMUlator) 是一个开源的虚拟化软件和硬件仿真器,它能实现完整系统仿真或进程级仿真。QEMU 的用途广泛,可以用来运行不同体系结构的程序,测试操作系统和驱动程序,开发嵌入式系统,甚至作为云计算平台的一部分。以下是 QEMU 的一些主要特性和使用示例。

QEMU 的主要特性

  1. 全系统仿真 (System Emulation):
  • 仿真整个计算机系统,包括 CPU、存储器、硬盘、网络设备等。
  • 支持多种架构,如 x86、ARM、MIPS、PowerPC、SPARC 等。
  1. 用户模式仿真 (User Mode Emulation):
  • 仿真单个用户模式进程,可以运行不同架构的程序,而无需完整操作系统的仿真。
  1. 加速模式:
  • 与 KVM (Kernel-based Virtual Machine) 结合使用,可以利用硬件虚拟化特性,大幅提升性能
  1. 设备仿真:
  • 支持多种虚拟设备,如网络接口、存储设备、图形设备等。

QEMU 的安装

在大多数 Linux 发行版中,可以使用包管理器安装 QEMU:
Ubuntu / Debian:

sudo apt-get install qemu qemu-kvm

CentOS / Fedora:

sudo yum install qemu-kvm

QEMU 选项总结

  • -m : 指定虚拟机内存大小,例如 -m 4G
  • -smp : 指定虚拟机 CPU 数量,例如 -smp 4
  • -drive file=,format=: 指定磁盘映像及其格式。
  • -net : 配置网络设备。
  • -cdrom : 指定光盘镜像文件。
  • -boot : 指定启动顺序,例如 -boot d 从光盘启动。
  • -enable-kvm: 启用 KVM 硬件加速。
  • -cpu : 指定 CPU 模型和功能集。
  • -device : 添加虚拟或物理设备。

使用 QEMU 进行系统仿真

以下是如何使用 QEMU 仿真一个简单的 x86 系统的示例。

1. 下载操作系统镜像

首先,下载一个操作系统镜像。例如,可以下载一个 Ubuntu 的 ISO 镜像:

wget https://releases.ubuntu.com/20.04/ubuntu-20.04.6-desktop-amd64.iso

2. 创建一个虚拟硬盘

使用 QEMU 创建一个虚拟硬盘文件:

qemu-img create -f qcow2 ubuntu.qcow2 20G

3. 启动虚拟机

使用 QEMU 启动虚拟机,并从 ISO 镜像启动:

qemu-system-x86_64 -m 4G 
-cdrom ubuntu-20.04.6-desktop-amd64.iso 
-hda ubuntu.qcow2 
-boot d

在这个命令中:

  • qemu-system-x86_64:指定仿真 x86_64 架构的系统。
  • -m 4G:分配 4 GB 内存给虚拟机。
  • -cdrom ubuntu-20.04.6-desktop-amd64.iso:指定 ISO 镜像文件作为 CD-ROM。
  • -hda ubuntu.qcow2:指定虚拟硬盘文件。
  • -boot d:从 CD-ROM 启动。

4. 安装操作系统

QEMU 启动后,会加载 ISO 镜像,像在物理机上那样进行操作系统安装。

使用 QEMU 进行用户模式仿真

QEMU 还可以用于用户模式仿真,即仿真单个用户进程。以下是一个简单的示例:

1. 编写一个简单的 C 程序

编写一个简单的 C 程序 hello.c

#include <stdio.h>int main() {printf("Hello, QEMU!\n");return 0;
}

2. 编译程序

假设我们要在 ARM 架构上运行这个程序,可以使用交叉编译工具链进行编译:

arm-linux-gnueabi-gcc -o hello-arm hello.c

3. 使用 QEMU 运行程序

使用 QEMU 的用户模式仿真来运行这个 ARM 程序:

qemu-arm hello-arm

QEMU 将仿真 ARM CPU 并执行程序,输出 Hello, QEMU!

使用 QEMU 进行更高级的系统仿真

1. 通过网络启动虚拟机

QEMU 支持通过网络启动虚拟机。这在构建无盘工作站或测试网络引导配置时非常有用。
准备 TFTP 服务器和网络引导文件: 首先,您需要设置一个 TFTP 服务器并准备网络引导文件。以下示例基于 Ubuntu:
安装 TFTP 服务器:

sudo apt-get install tftpd-hpa

配置 TFTP 服务器:
编辑 /etc/default/tftpd-hpa,确保以下内容:

TFTP_OPTIONS="--secure --create"
TFTP_DIRECTORY="/srv/tftp"
RUN_DAEMON="yes"
OPTIONS="-l -s /srv/tftp"

启动 TFTP 服务器:

sudo systemctl restart tftpd-hpa

将 PXE 引导文件(如 pxelinux.0 和相关配置文件)放入 /srv/tftp 目录。
启动 QEMU 并使用网络引导:

qemu-system-x86_64 -m 2G -boot n -net nic -net user,tftp=/srv/tftp,bootfile=pxelinux.0

在这个命令中:

  • -boot n: 指定从网络引导。
  • -net nic: 创建一个虚拟网络接口。
  • -net user,tftp=/srv/tftp,bootfile=pxelinux.0: 使用用户模式网络后端并设置 TFTP 根目录及引导文件。

2. 使用快照功能

QEMU 支持快照功能,可以在不修改原始磁盘映像的情况下保存和恢复虚拟机状态。
创建基础映像

qemu-img create -f qcow2 base.qcow2 20G

创建快照映像

qemu-img create -f qcow2 -b base.qcow2 snapshot.qcow2

启动虚拟机并使用快照映像

qemu-system-x86_64 -m 2G -hda snapshot.qcow2

在这个命令中:

  • -b base.qcow2: 指定基础映像。

您可以进行各种操作,并在需要时创建新的快照映像,从而无需担心对原始映像的破坏。

3. 使用 GPU 直通 (PCI Passthrough)

QEMU 支持将主机的 PCI 设备(如 GPU)直接分配给虚拟机,提供接近原生的性能。这通常与 KVM 结合使用,并且需要特定的硬件支持。
启用 IOMMU 支持: 在主机的启动配置中启用 IOMMU。编辑 /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"  # 对于 Intel CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"    # 对于 AMD CPU

更新 GRUB 并重启主机:

sudo update-grub
sudo reboot

分离 GPU 驱动: 找到 GPU 设备的 PCI 地址:

lspci -nn | grep -i vga

分离设备: 创建 /etc/modprobe.d/vfio.conf 并添加以下内容:

options vfio-pci ids=<GPU设备ID>,<声卡设备ID>

重新生成 initramfs:

sudo update-initramfs -u

启动虚拟机并使用 GPU 直通

qemu-system-x86_64 -enable-kvm -m 8G -cpu host,kvm=off \
-device vfio-pci,host=01:00.0,x-vga=on \
-device vfio-pci,host=01:00.1

在这个命令中:

  • -enable-kvm: 启用 KVM。
  • -cpu host,kvm=off: 使用主机 CPU 的功能集,禁用 KVM 特定标志。
  • -device vfio-pci,host=01:00.0,x-vga=on: 分配 GPU。
  • -device vfio-pci,host=01:00.1: 分配声卡。

使用 QEMU 进行用户模式仿真

1. 运行不同架构的程序

QEMU 的用户模式仿真可以在一个架构上运行另一个架构的程序。以下是一个示例,展示如何在 x86_64 主机上运行 ARM 程序。
编写并编译 ARM 程序
创建一个简单的 ARM 程序 hello_arm.c

#include <stdio.h>int main() {printf("Hello, ARM!\n");return 0;
}

使用交叉编译工具链编译:

arm-linux-gnueabi-gcc -o hello_arm hello_arm.c

运行 ARM 程序: 使用 QEMU 的用户模式仿真运行:

qemu-arm ./hello_arm

输出将是 Hello, ARM!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com