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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

temu跨境选品师是怎么样的一个项目?

TEMU(特穆)跨境选品师项目&#xff0c;作为一项创新的全球商品采购和选品服务&#xff0c;正在逐步改变消费者对于跨境电商产品的认知和选择方式。这个项目不仅仅是一个简单的商品推荐平台&#xff0c;更是一种以数据驱动的精准选品策略的体现&#xff0c;为消费者提供了全新的…

Spring Boot集成vavr快速入门demo

1.什么是vavr&#xff1f; 初闻vavr&#xff0c;感觉很奇怪&#xff0c;咋这个名字&#xff0c;后面看到它的官网我沉默了&#xff0c;怀疑初创团队付费资讯了UC震惊部如何取名字&#xff0c;好家伙&#xff0c;vavr就是java这四个字倒过来&#xff0c;真的是’颠覆’了java……

为什么Mid journey很容易就能做出很有氛围感的图而SD却容易做图很丑?

前言 6月12日&#xff0c;Midjourney更新了一项新的功能——模型个性化&#xff0c;这一项功能最重要的作用就是能够让生成的图像更加符合你自己的审美标准。就像每个艺术家都有自己的独特风格一样&#xff0c;有了这项模型个性化功能的加持&#xff0c;每个人都能生成具有鲜明…

松弛变量(slack variable)与拉格朗日对偶

松弛变量&#xff08;slack variables&#xff09;和拉格朗日对偶&#xff08;Lagrangian duality&#xff09;是优化理论中的两个重要概念&#xff0c;它们之间有着密切的关系&#xff0c;特别是在线性规划和凸优化中。 松弛变量 松弛变量用于将不等式约束转化为等式约束。在…

kali系统几个开机启动项的区别

1、Live system (amd64) 简单的模式 &#xff0c;启动系统&#xff0c;直接进入 Kali&#xff0c;在系统中的所有的操作和设置都会在下次重启时失效。 Kali 中保存/编辑的所有东西都会重启丢失。 2、Live system (amd64 fail-safe mode) 这种模式与 Live (amd64) 类似&#xf…

【机器学习】第5章 朴素贝叶斯分类器

一、概念 1.贝叶斯定理&#xff1a; &#xff08;1&#xff09;就是“某个特征”属于“某种东西”的概率&#xff0c;公式就是最下面那个公式。 2.朴素贝叶斯算法概述 &#xff08;1&#xff09;是为数不多的基于概率论的分类算法&#xff0c;即通过考虑特征概率来预测分类。 …

C#利用SignalR实现通信事例Demo

1.服务端安装SignalR的Nuget包 dotnet add package Microsoft.AspNet.SignalR --version 2.4.3 2.接下来&#xff0c;创建一个ChatHub类&#xff0c;它是SignalR通信的核心&#xff1a; using Microsoft.AspNetCore.SignalR;public class ChatHub : Hub {public static Dict…

MATLAB 二维平面绘图

x 0:0.01:2pi: 大家还记得这个是什么意思吧 就是0到2π 每次所取的数 是相差0.01进行选取的 ysin&#xff08;x&#xff09;: figure (这个意思就是建立一个幕布) plot&#xff08;x&#xff0c;y&#xff09; 这个主要是绘制当前的二维平面的图 但是大家会发现这张图里没有标…

iOS Category

原理&#xff1a; 【iOS】——分类、扩展和关联对象_ios 为什么分类不能加成员变量-CSDN博客 面试题&#xff1a; 1.Category和Extension区别&#xff1f; 在 Objective-C 中&#xff0c;Category 和 Extension 是两种用于向现有类添加新功能的机制&#xff0c;但它们各有特…

反激开关电源输入电解电容选型及计算

输入电解电容波形如下 计算 1、输入电解电容经验选取法 当输入电压为220V20%&#xff08;AC176-264V&#xff09;时 按照输出功率选取&#xff1a;W/μF 耐压&#xff08;400V&#xff0c;输入176-264V最高DC峰值373V&#xff09; 当输入电压为11020%时&#xff08;AC88-132V…

windows服务器一台机器安装多个mysql实例

1、复制安装mysql安装包 2、修改配置文件信息 标注红色部分是需要修改成复制后的包信息 [mysqld] default-time_zone8:00basedirD:/tools/MySQL-Cluster/mysql-53306 datadirD:/tools/MySQL-Cluster/mysql-53306/data default-storage-engineINNODB sql-mode"STRICT_TRANS…

网络运维:企业数字化转型的基石

在数字化时代&#xff0c;网络已经成为企业运营不可或缺的一部分。网络运维作为确保网络稳定、安全和高效运行的关键环节&#xff0c;其重要性不言而喻。本文将探讨网络运维的重要性&#xff0c;并分析其在企业数字化转型中的作用。 网络运维的定义 网络运维&#xff0c;也称…

Amazon Systems Manager中补丁合规性定期扫描

问题 需要使用Amazon Systems Manager对EC2补丁合规性定期扫描。 步骤 点击如下入口界面&#xff1a; 权限使用默认配置&#xff0c;勾选“Scan instances for missing patches daily”每天扫描EC2实例是否存在补丁&#xff0c;来完成合规检查&#xff0c;选择所有实例&…

Zabbix自定义监控JAVA进程

一.定义脚本 二 .ZABBIX得agent允许以root身份执行 三. Zabbix测试自定item是否成功 四.ZABBIX服务端web添加新得item项 五.查看最新数据&#xff0c;取值成功

每日AI资讯-20240618

1. 3D 版 SORA 来了&#xff01; DreamTech 官宣了其高质量 3D 生成大模型 Direct3D&#xff0c;并公开了相关学术论文 Direct3D: Scalable Image-to-3D Generation via 3D Latent Diffusion Transformer。 链接&#xff1a;https://arxiv.org/abs/2405.14832 这是首个公开发布…

分享一下,如何搭建个人网站的步骤

在这段充满探索与创造的奇妙旅途中&#xff0c;我就像一位耐心的建筑师&#xff0c;在数字世界的荒原上精心雕琢&#xff0c;两周的时光缓缓流淌。每天&#xff0c;我与代码共舞&#xff0c;手执HTML、CSS与JavaScript这三大构建魔杖&#xff0c;一砖一瓦地筑起了梦想中的网络城…

JDK与JRE与JVM:它们之间的区别

JDK与JRE与JVM&#xff1a;它们之间的区别 JDK&#xff08;Java开发工具包&#xff09; JDK是JRE的超集&#xff0c;它包含JRE所拥有的一切以及编译器、调试器等开发工具。 JDK代表Java开发工具包。要在您的系统上安装Java&#xff0c;您需要首先在系统上安装JDK。 JDK包含编…

Blazor 中基于角色的授权

介绍 Blazor用于使用 .NET 代码库创建交互式客户端 Web UI。Microsoft 默认在 Blazor 应用程序中提供了一个用于身份验证和授权的身份框架。请注意&#xff0c;他们目前使用 MVC Core Razor 页面作为身份验证 UI。使用“Microsoft.AspNetCore.Identity.UI”包库来实现这一点。…

实战|YOLOv10 自定义目标检测

引言 YOLOv10[1] 概述和使用自定义数据训练模型 概述 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领…

基于STM32和人工智能的智能楼宇安防系统

目录 引言环境准备智能楼宇安防系统基础代码实现&#xff1a;实现智能楼宇安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能楼宇安防管理与优化问题解决方案与优化收尾与总结 1. 引言 随着物联网和人工智能技术的…