qemu使用
参考文章:
技术|在 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-x 和 AMD-V 是两大主要处理器厂商(Intel 和 AMD)提供的硬件虚拟化技术。
- Intel VT-d 和 AMD-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 无法启动。
解决办法
- 重新编译WSL2内核,使其支持虚拟化
- 舍弃WSL2,直接使用VMware
- 我目前使用的是先舍弃WSL2,过段时间再试试编译WSL2的内核
- 如果要编译WSL2的内核,参考一下博客:在 WSL2 上获得近乎完整的 Linux 体验 - Pan Xiao’s Blog (ddupan.top)
安装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
另外,确保你的系统有多个处理器核心,这样你可以分配一些给你的虚拟机,并且仍然有足够的处理能力提供给宿主机。
使用如下命令检查
egrep
允许使用更复杂的正则表达式来匹配文本-c
选项用于计数匹配行的数量。也就是说,这个选项会返回匹配模式的行数。'(vmx|svm)'
:这是一个正则表达式模式,表示匹配包含vmx
或svm
的行。vmx
是 Intel 虚拟化技术(VT-x)的标识符。svm
是 AMD 虚拟化技术(AMD-V)的标识符|
是正则表达式中的“或”操作符,表示匹配vmx
或svm
中的任意一个。/proc/cpuinfo
:- 这是一个虚拟文件,包含有关系统 CPU 的信息。
cpuinfo
文件包含每个逻辑 CPU 的信息,例如型号、核心数、缓存等
1 | egrep -c '(vmx|svm)' /proc/cpuinfo |
输出结果应该要大于零,我这边输出结果会为0。意味着虚拟机无法检测到虚拟化扩展。具体解决问题查看下方
问题一
然后重新输入检查指令,最后返回下图所示
安装与配置
- 检查没问题后就可以进行安装
Qemu
和KVM
,安装完成后重新启动系统
1 | sudo apt install qemu qemu-kvm virt-manager bridge-utils |
- 启动过后需要配置环境:为了使 Qemu 工作,你必须 将你的用户加入两个组:
libvirt-kvm
和libvirt
。
1 | sudo useradd -g $USER libvirt |
- 接下来启用并启动
libvirt
服务:
1 | sudo systemctl enable libvirtd.service && sudo systemctl start libvirtd.service |
- 这样就没有问题了
安装qemu指令汇总
1 | sudo apt install qemu-user # 安装qemu用户者模式 |
qemu安装Linux
- 从系统菜单栏中打开
虚拟机管理器
- 建议还是有命令,用虚拟系统管理器安装会比较卡
- 点击文件——>新建虚拟机
- 然后选择本地安装介质,然后再点击
forward
- 接下来需要添加ISO文件。如果本地有ISO文件,那么就选择你的ISO文件进行,选择好后点击
Forward
- 如果本地没有ISO文件建议下载一个ISO文件
- 这里推荐使用轻量级的Linux,这样不会太占资源下载 - Bodhi Linux
- 然后配置内存和存储,使用ubuntu配置
- 除了磁盘空间,CPU 和内存等系统资源只在 VM 中运行操作系统时使用。
- 然后为虚拟机起一个名字,然后点击完成
- 这样就使用qemu创建好了虚拟机,使用图形化界面的qemu创建虚拟机没涉及到指令。这里建议还是利用指令来一遍,具体查看
拓展一
。剩下的就是虚拟机的内部安装了
Qemu中启用共享文件夹
- 将宿主机的现有目录与虚拟机共享
- 通过 Qemu 中的虚拟机设置添加一个共享文件系统
- 在虚拟机中挂载文件系统
- 从系统菜单中打开虚拟机管理器,选择虚拟机,并点击
打开
按钮来管理控制台
- 然后点击“信息”按钮,选择“内存“,然后启用共享内存,选择后先点右下方的
Apply
要不然接下来的操作会报错
- 然后点击”添加硬件”按钮,选择“文件系统”选项
- 在文件系统选项中做以下工作
- 在“源路径”部分添加一个你想要共享的目录的路径(宿主机)
- 在“目标路径”部分添加该目录的名称(名称会在虚拟机中显示)
- 然后点击完成
- 这里在出现了一个问题,也就是驱动程序下方有个感叹号,具体解决看下方
问题二
- 完成后启动虚拟机
- 在虚拟机中,打开终端,使用下面的语法来挂载共享目录
问题
- 记录一下出现的问题
问题一
- 输入
egrep -c '(vmx|svm)' /proc/cpuinfo
时,虚拟机无法检测到虚拟化扩展。 - 原因:虚拟机设置中的虚拟化
Intel VT-x
没有开启
- 然后在开启这个的时候有出现问题,说宿主机不支持虚拟化。
- 但是宿主机能使用VMware,而且我在宿主机还安装了WSL。这说明宿主机是支持虚拟化的。
- 通过排查得知应该把控制面板->程序里面的虚拟机平台这个选项关闭
- 原因:“虚拟机平台”(Virtual Machine Platform)是 Windows 的一项功能,支持 Hyper-V 的部分功能。虽然不是完整的 Hyper-V,但它可能与 VMware 的虚拟化功能冲突。
问题二
- 在共享文件设置的时候出现问题
- 原因:在勾选内存共享时没有点击应用
拓展
拓展一
- 使用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 | qemu-img create -f qcow2 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 | qemu-system-x86_64 \ |
- 等下次再启动虚拟机就不用加入iso文件了,下面的命令换了一个版本的Linux
1 | qemu-system-x86_64 \ |
qemu-user
- 前面的内容都是qemu-System的模式,现在来介绍一下qemu的user模式
- 以在amd64的Linux环境下,运行一个riscv架构的程序
- 先安装
qemu-user
模式,sudo apt install qemu-user
- 然后直接使用
qemu-riscv64 ./elf
即可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!
评论