参考文章:

技术|在 Ubuntu 上安装和使用 Qemu (linux.cn)

QEMU使用记录 | Clang裁缝店 (xuanxuanblingbling.github.io)

  • qemu与Docker不同,qemu既可以对操作系统的虚拟也可以对硬件的虚拟,但是Docker只能对系统层面上的虚拟,但是对于不同架构的系统是没办法跨架构虚拟的。

  • qemu有两种模式

    • 系统模式(System model):该模式能够模拟整个计算机系统,包括CPU、内存、硬盘、网络接口、显卡等各种硬件资源。这种模式下,qemu可以在一种架构上运行另一种架构的操作系统。(所以导致了qemu指令很多)
    • 用户者模式(User model):该模式运行在一种架构下的操作系统中运行另一种架构的应用程序。比如:可以在AMD架构下的ubuntu运行经过Risc-v编译器编译的ELF可执行文件。
  • 由于qemu非常多的指令,所以在使用qemu的时候尽量理解指令含义

虚拟化的关系

  • 这个主要是出现了问题一,对问题一的有一些疑问,对其作出解释
  • Intel VT-xAMD-V 是两大主要处理器厂商(Intel 和 AMD)提供的硬件虚拟化技术。
  • Intel VT-dAMD-Vi 是对应的设备虚拟化技术,允许虚拟机直接访问物理I/O设备,从而进一步提高虚拟机的性能和可管理性。
  • Hyper-V 是微软开发的虚拟化平台,内置于Windows操作系统中,用于创建和管理虚拟机。Hyper-V 本质上是一个 Type 1 Hypervisor,这意味着它直接运行在硬件之上,并且具有更直接的硬件访问能力和更高的性能。
  • Hyper-V 依赖于 Intel VT-x 或 AMD-V 这类硬件虚拟化技术来运行。没有这些硬件虚拟化扩展,Hyper-V 无法有效工作,因为它需要这些技术来提供底层的CPU虚拟化支持。

  • 对于使用了VMware的嵌套虚拟化在Windows上的WSL就使用不了

    • WSL 2 使用了轻量级虚拟化技术,它本质上是一个基于 Hyper-V 的虚拟机。WSL 需要直接访问硬件的虚拟化扩展来运行 Linux 内核。
    • 嵌套虚拟化允许在一个虚拟机中运行另一个虚拟机。要实现这一点,底层的虚拟化平台(如 VMware)需要直接控制硬件的虚拟化扩展(Intel VT-x 或 AMD-V),并且将部分虚拟化功能传递给嵌套的虚拟机。
    • WSL 2 依赖于 Hyper-V 虚拟化技术,而 Hyper-V 本身需要控制硬件的虚拟化扩展。在启用了 VMware 的嵌套虚拟化后,VMware 也需要控制这些虚拟化扩展。如果 VMware 已经占用了这些资源,Hyper-V 无法再获取对这些资源的访问权,导致 WSL 2 无法启动。

解决办法

安装qemu

检查虚拟化

  • 安装qemu是在ubuntu虚拟机上安装的,如果没有ubuntu虚拟机请先安装ubuntu虚拟机。安装教程:Ubuntu安装 | iyheart的博客

  • 由于qemu是虚拟化技术,但是并不是所有硬件都支持虚拟化技术的,所以在安装qemu的时候我们应当先检查我们的硬件是否支持虚拟化技术

    • 这里的LC_ALL=C:这个部分是设置环境变量,指定将所有区域设置为”C”(即不使用任何特定的语言环境),从而确保输出是英文的。
    • lscpu:这是一个Linux命令,用于显示有关CPU架构的信息。
    • grep Virtualization:这个部分是从lscpu命令的输出中筛选出包含”Virtualization”字样的行。
1
LC_ALL=C lscpu | grep Virtualization
  • 输出结果如下:这边可能会有几个输出结果
    • full:CPU支持全虚拟化
    • VT-x:CPU支持Intel VT-x即英特尔的硬件虚拟化技术
    • AMD-v:CPU支持AMD-v即AMD的硬件虚拟化技术
    • 如果没有任何输出结果,就表面该CPU不支持虚拟化,这也就是表明在你的系统上使用不了qemu

image-20240826112725741

  • 另外,确保你的系统有多个处理器核心,这样你可以分配一些给你的虚拟机,并且仍然有足够的处理能力提供给宿主机。

  • 使用如下命令检查

    • egrep 允许使用更复杂的正则表达式来匹配文本
    • -c 选项用于计数匹配行的数量。也就是说,这个选项会返回匹配模式的行数。
    • '(vmx|svm)':这是一个正则表达式模式,表示匹配包含 vmxsvm 的行。vmx 是 Intel 虚拟化技术(VT-x)的标识符。svm 是 AMD 虚拟化技术(AMD-V)的标识符
    • | 是正则表达式中的“或”操作符,表示匹配 vmxsvm 中的任意一个。
    • /proc/cpuinfo:
      • 这是一个虚拟文件,包含有关系统 CPU 的信息。
      • cpuinfo 文件包含每个逻辑 CPU 的信息,例如型号、核心数、缓存等
1
egrep -c '(vmx|svm)' /proc/cpuinfo
  • 输出结果应该要大于零,我这边输出结果会为0。意味着虚拟机无法检测到虚拟化扩展。具体解决问题查看下方问题一

  • 然后重新输入检查指令,最后返回下图所示

image-20240826152514387

安装与配置

  • 检查没问题后就可以进行安装QemuKVM,安装完成后重新启动系统
1
sudo apt install qemu qemu-kvm virt-manager bridge-utils
1
2
sudo useradd -g $USER libvirt
sudo useradd -g $USER libvirt-kvm
  • 接下来启用并启动libvirt服务:
1
sudo systemctl enable libvirtd.service && sudo systemctl start libvirtd.service
  • 这样就没有问题了

安装qemu指令汇总

1
2
sudo apt install qemu-user # 安装qemu用户者模式

qemu安装Linux

  • 从系统菜单栏中打开虚拟机管理器
  • 建议还是有命令,用虚拟系统管理器安装会比较卡

image-20240826153203490

  • 点击文件——>新建虚拟机

image-20240826153310158

  • 然后选择本地安装介质,然后再点击forward

image-20240826153337541

  • 接下来需要添加ISO文件。如果本地有ISO文件,那么就选择你的ISO文件进行,选择好后点击Forward

image-20240826153724505

  • 如果本地没有ISO文件建议下载一个ISO文件
  • 这里推荐使用轻量级的Linux,这样不会太占资源下载 - Bodhi Linux

image-20240826235650805

  • 然后配置内存和存储,使用ubuntu配置
    • 除了磁盘空间,CPU 和内存等系统资源只在 VM 中运行操作系统时使用。

image-20240826235751823

image-20240826235909083

  • 然后为虚拟机起一个名字,然后点击完成

image-20240826235932074

  • 这样就使用qemu创建好了虚拟机,使用图形化界面的qemu创建虚拟机没涉及到指令。这里建议还是利用指令来一遍,具体查看拓展一。剩下的就是虚拟机的内部安装了

Qemu中启用共享文件夹

  • 将宿主机的现有目录与虚拟机共享
    • 通过 Qemu 中的虚拟机设置添加一个共享文件系统
    • 在虚拟机中挂载文件系统
  • 从系统菜单中打开虚拟机管理器,选择虚拟机,并点击打开按钮来管理控制台

image-20240826164524031

  • 然后点击“信息”按钮,选择“内存“,然后启用共享内存,选择后先点右下方的Apply要不然接下来的操作会报错

image-20240826164656202

  • 然后点击”添加硬件”按钮,选择“文件系统”选项
  • 在文件系统选项中做以下工作
    • 在“源路径”部分添加一个你想要共享的目录的路径(宿主机)
    • 在“目标路径”部分添加该目录的名称(名称会在虚拟机中显示)
    • 然后点击完成
  • 这里在出现了一个问题,也就是驱动程序下方有个感叹号,具体解决看下方问题二

image-20240826165129087

  • 完成后启动虚拟机
  • 在虚拟机中,打开终端,使用下面的语法来挂载共享目录

问题

  • 记录一下出现的问题

问题一

  • 输入egrep -c '(vmx|svm)' /proc/cpuinfo时,虚拟机无法检测到虚拟化扩展。
  • 原因:虚拟机设置中的虚拟化Intel VT-x没有开启

image-20240826152114399

  • 然后在开启这个的时候有出现问题,说宿主机不支持虚拟化。
  • 但是宿主机能使用VMware,而且我在宿主机还安装了WSL。这说明宿主机是支持虚拟化的。
  • 通过排查得知应该把控制面板->程序里面的虚拟机平台这个选项关闭
    • 原因:“虚拟机平台”(Virtual Machine Platform)是 Windows 的一项功能,支持 Hyper-V 的部分功能。虽然不是完整的 Hyper-V,但它可能与 VMware 的虚拟化功能冲突。

image-20240826152327332

问题二

  • 在共享文件设置的时候出现问题
  • 原因:在勾选内存共享时没有点击应用

image-20240826170852651

拓展

拓展一

  • 使用qemu命令行模式安装一个Arch Linux

创建虚拟硬盘

  • 首先,您需要创建一个虚拟硬盘以安装 Arch Linux。可以使用 qemu-img 工具来创建一个 8GB 的虚拟硬盘。
    • 在使用 qemu-img create 命令创建虚拟硬盘时,如果不指定路径,硬盘文件会被创建在当前工作目录中。您可以通过指定路径来选择硬盘文件的存放位置。
    • qemu-img: 这是 QEMU 的一个工具,用于创建、转换和修改虚拟硬盘镜像。
    • create: 这是 qemu-img 命令的一个子命令,用于创建新的虚拟硬盘镜像文件。
    • -f qcow2: 这是指定虚拟硬盘镜像的格式。qcow2 是 QEMU 的一种虚拟硬盘格式,支持压缩、快照等功能。其他可能的格式包括 raw(原始格式)、vmdk(VMware 格式)等。
    • learn_linux2.qcow2: 这是创建的虚拟硬盘文件的名称及其扩展名。在这个例子中,虚拟硬盘将被创建为名为 learn_linux2.qcow2 的文件。
    • 8G: 这是虚拟硬盘的大小。在这个例子中,虚拟硬盘的大小设置为 8 GB
1
2
3
qemu-img create -f qcow2 learn_linux2.qcow2 8G
如果要指定位置
qemu-img create -f qcow2 /path/to/directory/learn_linux2.qcow2 8G

启动虚拟机

  • qemu-system-x86_64:这是 QEMU 的一个可执行程序,用于创建和管理 x86_64(64-bit x86)架构的虚拟机。您可以用它来启动虚拟机和执行各种操作。
  • -name learn_linux2:设置虚拟机的名称为 learn_linux2。这在管理和识别虚拟机时非常有用,但在虚拟机运行时不会影响其性能。
  • -m 1024:分配给虚拟机的内存大小为 1024 MB(即 1 GB)。-m 选项用于指定虚拟机的内存。
  • -smp 2:分配给虚拟机的 CPU 核心数量为 2。-smp 选项用于设置虚拟机的处理器核心数。
  • -drive file=learn_linux2.qcow2,format=qcow2:指定虚拟硬盘文件为 learn_linux2.qcow2,并指定格式为 qcow2-drive 选项用于添加磁盘驱动器,并通过 file 指定硬盘镜像文件和然后通过format指定硬盘格式media=cdrom-drive选项的一个参数,它指定了该驱动器(drive)的媒体类型为CD-ROM。
  • -boot d:设置启动顺序,d 表示从 CD-ROM 启动。这意味着虚拟机会首先尝试从 CD-ROM 启动,即安装镜像的 ISO 文件。
  • -enable-kvm:启用 KVM(Kernel-based Virtual Machine)加速。-enable-kvm 选项会启用硬件虚拟化支持(如果宿主机支持),以提高虚拟机的性能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
qemu-system-x86_64 \
-name learn_linux2 \
-m 1024 \
-smp 2 \
-drive file=learn_linux2.qcow2,format=qcow2 \
-drive file=/path/to/archlinux.iso,media=cdrom \
-boot d \
-enable-kvm
我这边的命令为
qemu-system-x86_64 \
-name learn_linux2 \
-m 1024 \
-smp 2 \
-drive file=learn_linux2.qcow2,format=qcow2 \
-drive file=/home/iyheart/all_os/archlinux.iso,media=cdrom \
-boot d \
-enable-kvm

image-20240826163950733

  • 等下次再启动虚拟机就不用加入iso文件了,下面的命令换了一个版本的Linux
1
2
3
4
5
6
7
8
qemu-system-x86_64 \
-m 512 \
-smp 1 \
-drive file=/path/to/slitaz-vm.img,format=qcow2 \
-net nic \
-net user \
-vga std \
-accel kvm

qemu-user

  • 前面的内容都是qemu-System的模式,现在来介绍一下qemu的user模式
  • 以在amd64的Linux环境下,运行一个riscv架构的程序
  • 先安装qemu-user模式,sudo apt install qemu-user
  • 然后直接使用qemu-riscv64 ./elf即可