将这一切结合在一起
消化 QEMU 所提供的所有内容可能具有挑战性。不要害怕。使用越多,感觉越舒服。要知道,我们所经历的信息是很多的。如果你已经走到了这一步,请拍拍自己的后背!花点时间熟悉QEMU。当你准备好了,继续阅读。
如果您阅读本文并认为我在某处犯了错误,或者您希望我触及特定主题,请这样做。欢迎任何类型的反馈(好的或坏的)!
现在,可能很难确切地知道从哪里开始。我们如何真正开始使用 QEMU?这就是你现在可能遇到的问题。让我们一起回答这个问题以及更多问题。
-
其它相关教程
linux程序设计与安全开发
-
恶意软件开发
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
-
USB过滤(更新完成)
-
-
游戏安全(更新中)
-
-
ios逆向
-
-
windbg
-
-
还有很多免费教程(限学员)
-
-
-
更多详细内容添加作者微信
-
-
如何实际使用QEMU?
简单的答案:转到此存储库的文件夹并开始使用那里的脚本。/Machines
长答案:首先问问自己:“我真的需要 QEMU 还是简单的 VM?根据答案,要么使用 VM(例如 VirtualBox),要么开始配置 QEMU 机器。让我解释一下其余的。
自检
QEMU 很酷,是完成工作的好工具。但是,它不是一个简单快速的虚拟机。不要误会我的意思,如果您配置,它可以是 VM。但是你花在这件事上的时间还不如花在做其他事情上,比如真正把事情做好。所以,问问自己“我真的需要使用 QEMU 吗?
提醒一下,QEMU 是学习新事物的绝佳工具。因此,上述问题不适用于冒险家 ❤
设计
现在,在那次无聊的 AF 谈话之后,让我们开始工作吧。在配置部分,我们已经看到 QEMU 有很多选项需要配置。这很棒。这意味着您可以拥有满足您大部分(如果不是全部)需求的机器。
在您立即开始使用 QEMU 之前,请考虑并设计您希望您的机器成为什么样子。我在这里只能提供一些指导,而不是要遵循的实际步骤。考虑这些事情(按顺序):
-
操作系统/内核:您要使用哪个操作系统?(例如 GNU/Linux、Windows、你自己的?!
-
要模拟的系统:您需要哪种系统?(例如 i368、x86_64、ARM、AARC64、PowerPC)
-
机器类型: 您的目标机器是什么?(例如 Raspi3、virt、q35、pc、custom)
-
要使用的 CPU:是否要覆盖计算机的 CPU?(例如 host、EPYC、Skylake、Cortex-A72)
-
核心数: 您需要多少个 CPU 内核?(例如 2、4、8)
-
内存大小:要分配的内存量。(例如 512MiB、4GiB、16GiB)
-
要使用的设备:I/O、显示、存储等(例如 virtio-kbd、qxl-vga、nvme)
-
网络需求:您的网络需求是什么?(例如简单的互联网接入、自定义 VLAN)
虽然上面的列表并没有涵盖所有内容,但它是开始设计 QEMU 机器的好方法。请记住,QEMU 是一种工具(也是学习新事物的好方法)。所以,决定你的需求,然后开始设计!
这些是我在使用 QEMU 做某事之前通常遵循的步骤。这完全是个人的,您可能会遵循不同的方法>.<
配置
在考虑了您想要从 QEMU 机器中获得什么之后,您只需运行一系列 和 即可启动您的 QEMU 机器。但是,我和许多其他人强烈建议您创建启动脚本。它不需要是异国情调和“专业”的东西。只需在那里写下您的命令并从终端启动它。commands
arguments
启动脚本
我听到你问:“争论太多了。我应该先写哪一个?问题是,这并不重要。您可以指定最后一个或第一个。QEMU不在乎。但!我建议你先输入最一般的,最后输入其他的。让我给你一个示例脚本。-cpu
#/usr/bin/env bash
qemu-system-x86_64 -machine virt -cpu virt -m 4G -device usb-kbd -device usb-mouse
您可以看到我首先指定了该选项,因为它是一个更通用的选项。然后,我指定要使用的 size 和 s 等内容。我建议你也这样做,因为它更直观、更易于理解。-machine
-memory
-device
一个更好的方法是定义 shell 变量。与其把所有东西都塞进一个巨大的命令中,不如使用变量。下面是一个示例。
#/usr/bin/env bash
MACHINE="-machine virt"
CPU="-cpu virt"
MEMORY="-m 4G"
DEVICES="-device usb-kbd -device usb-mouse"
qemu-system-x86_64 ${MACHINE} ${CPU} ${MEMORY} ${DEVICES} $*
看到我在变量中定义了所有内容。这样,我就可以定义一个新的或更改我的大小,而无需修改 giant-ass launch 命令。请注意,最后一个参数是一个特殊的 shell 变量,它将所有命令行参数作为单个字符串传递给 QEMU。(例如,在 中,将计算为-device
-m
$*
./launch_qemu.sh <args>
$*
<args>
)
同样,这是我配置 QEMU 并创建启动脚本时所做的。这是个人的,您可能想使用其他东西。完全没关系!尽情狂欢。
我希望您使用启动脚本和 shell 变量的原因是这样的。请看下面的命令:
#/usr/bin/env bash
/Applications/UTM.app/Contents/XPCServices/QEMUHelper.xpc/Contents/MacOS/QEMULauncher.app/Contents/MacOS/QEMULauncher /Applications/UTM.app/Contents/Frameworks/qemu-aarch64-softmmu.framework/Versions/A/qemu-aarch64-softmmu -L /Applications/UTM.app/Contents/Resources/qemu -S -qmp tcp:127.0.0.1:4000,server,nowait -nodefaults -vga none -spice unix=on,addr=/Users/BestUserNameLeft/Library/Group Containers/WDNLXAD4W8.com.utmapp.UTM/C6D43025-8BF5-4B87-A5F5-A8155C6B9DBE.spice,disable-ticketing=on,image-compression=off,playback-compression=off,streaming-video=off,gl=off
-device virtio-ramfb -cpu host -smp cpus=4,sockets=1,cores=4,threads=1
-machine virt, -accel hvf -accel tcg,thread=multi,tb-size=1536 -drive if=pflash,format=raw,unit=0,file=/Applications/UTM.app/Contents/Resources/qemu/edk2-aarch64-code.fd,readonly=on -drive if=pflash,unit=1,file=/Users/BestUserNameLeft/Library/Containers/com.utmapp.UTM/Data/Documents/Windows.utm/Images/efi_vars.fd
-boot menu=on -m 6144 -device intel-hda -device hda-duplex -name Windows -device nec-usb-xhci,id=usb-bus -device usb-tablet,bus=usb-bus.0 -device usb-mouse,bus=usb-bus.0
-device usb-kbd,bus=usb-bus.0 -device qemu-xhci,id=usb-controller-0 -chardev spicevmc,name=usbredir,id=usbredirchardev0 -device usb-redir,chardev=usbredirchardev0,id=usbredirdev0,bus=usb-controller-0.0 -chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=usb-controller-0.0 -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2,bus=usb-controller-0.0 -device nvme,drive=drive0,serial=drive0,bootindex=0
-drive if=none,media=disk,id=drive0,file=/Users/BestUserNameLeft/Library/Containers/com.utmapp.UTM/Data/Documents/Windows.utm/Images/windows-11-arm64.qcow2,discard=unmap,detect-zeroes=unmap -device usb-storage,drive=cdrom0,removable=true,bootindex=1,bus=usb-bus.0 -drive if=none,media=cdrom,id=cdrom0 -device virtio-net-pci,mac=9E:E1:25:9D:E7:99,netdev=net0 -netdev vmnet-bridged,id=net0,ifname=en0 -device virtio-serial -device virtserialport,chardev=vdagent,name=com.redhat.spice.0 -
chardev spicevmc,id=vdagent,debug=0,name=vdagent -device virtserialport,chardev=charchannel1,id=channel1,name=org.spice-space.webdav.0 -chardev spiceport,name=org.spice-space.webdav.0,id=charchannel1 -uuid C6D43025-8BF5-4B87-A5F5-A8155C6B9DBE -rtc base=localtime -device virtio-rng-pci
这太疯狂了吧?!这是 UTM 使用的默认 QEMU 命令。它看起来很复杂,很难理解。是的,它是有效的,因为它是单行的。但是,人类很难理解和改变某些东西。这就是为什么你,希望是一个人,需要有一个易于理解的启动脚本。
顺便说一句,UTM是一件了不起的事情。您可以使用它非常轻松地创建纯 QEMU 机器。这是了解 QEMU 机器如何配置复杂的好方法!
至于你,我创建了一些我个人使用的示例启动脚本。查看文件夹以探索它们!有一个供您用作快速入门。反馈总是不胜感激💚!/Machines
README
快捷方式和键绑定
QEMU 定义了一些快捷方式来控制来宾计算机。以下是我发现的一些有用的方法。
当使用显示窗口启动时,QEMU 会在任务栏上提供一些基本控件。请务必检查一下。
-
释放鼠标(仅显示): GNU/Linux & Windows:, macOS:
CTRL + ALT + G
control + option + G
-
切换到访客(仅限显示): GNU/Linux & Windows:, macOS:
CTRL + ALT + 1
control + option + 1
-
切换到 QEMU 显示器(仅显示):GNU/Linux & Windows:, macOS:
CTRL + ALT + 2
control + option + 2
-
在访客和QEMU监视器之间切换(仅限):所有系统:然后
-nographic
CTRL + A
C
-
端接机器(仅限): 所有系统:然后
-nographic
CTRL + A
X
QEMU Monitor 是 QEMU 提供的一项了不起的功能。这是一个面向开发人员的高级主题。出于这个原因,我不会在这里解释。也许在这条路上我会......如果您真的很好奇,请查看官方文档 QEMU Monitor。
VM-1 示例:ArchLinux
ArxhLinux 是一个简单而轻量级的 Linux 发行版,它遵循其软件包的滚动发布模型。1. 官方 wiki 有一个很棒的安装指南,我建议任何有兴趣的人至少查看一下。
我将解释如何在我的 ArchLinux 主机 (/w) 上构建一个非常简单的 QEMU ArxhLinux x86_64 虚拟机。这不是一个循序渐进的教程,您可以随时偏离。Intel i5 6600K
这台机器可以作为 基本的 shell 脚本找到。
/Machines
步骤 1 — 获取安装映像
“最佳”的地方是 Arch Linux 的下载页面。
或者使用:wget
$ wget https://geo.mirror.pkgbuild.com/iso/2023.06.01/archlinux-2023.06.01-x86_64.iso
第 2 步 — 设计 QEMU 机器
以下是我决定使用的基本机器规格:
-
机器:
q35
-
处理器:
host
-
vCORE:
2
-
加速器:
KVM
-
内存:
4G
-
UEFI/BIOS:
edk2
-
输入/O:
usb-ehci, usb-kbd, usb-mouse
-
网络(前端):
virtio-net-device
-
网络(后端):
user
-
存储:
nvme
-
显示:,
virtio-gpu
-
声音:和
intel-hda
hda-duplex
-
驱动器-1:(用于安装映像)
cdrom
-
驱动器 2:大小(用于存储)
qcow2
32G
nvme
第 3 步 — 启动机器
为了简化起见,我将定义一些路径变量。和 是 UEFI 固件和变量文件。(例如)。这是您从步骤 1 获取的安装映像。是您使用 创建的磁盘映像。在运行以下命令之前,不要忘记定义这些变量。EFI_FLASH_PATH
EFI_VARS_PATH
/usr/share/edk2-ovmf/x64/QEMU.fd
ISO_PATH
DISK_PATH
qemu-img
运行以下命令(如果不想显示,则追加):-nographic
$ qemu-system-x86_64 -machine q35 -cpu host -smp 2 -accel kvm -m 4G -drive if=pflash,format=raw,readonly=on,file=${EFI_FLASH_PATH} -drive if=pflash,format=raw,file=${EFI_VARS_PATH} -device usb-ehci -device usb-kbd -device usb-mouse -device virtio-net-device,netdev=net0 -netdev user,id=net0 -device nvme,drive=hd0,serial=super-fast-boi -device virtio-gpu,xres=1280,yres=720 -device intel-hda -drive id=cd0,media=cdrom,file=${ISO_PATH} -drive id=hd0,if=none,format=qcow2,file=${DISK_PATH}
常见问题1: 无法访问 KVM 内核模块:没有这样的文件或目录
当您的主机未加载 KVM 内核模块时,会出现此错误。这有多种原因:
-
a) Linux 内核不是用 KVM 构建的。
-
b) 或未在 UEFI 设置中启用。
Intel VT-x
AMD-V
-
c) 您的 CPU 不支持硬件虚拟化。
要解决此问题,请参阅硬件加速(可选)。
常见问题2: 显示 UEFI shell 而不是 OS/引导加载程序
首次启动固件设置的 QEMU 计算机时,设置可能不正确。这可能会导致您可能不需要的引导顺序(例如,OS/Bootloader 无法启动)。要正确设置 UEFI 固件设置,请在第一个启动屏幕(又名 TianaCore 屏幕)期间按下。或者,如果使用该选项,则键入到 UEFI shell。EDK2
ESC
exit
-nographic
在 UEFI 固件设置屏幕上,您可以自定义启动顺序或直接启动驱动器。随意探索设置,您可能会发现一些对您有用的东西。
VM-2 示例:macOS
创建 QEMU macOS 客户机有点棘手。我远不足以实现它。还有法律依据,因为 Apple VM 仅在 Parallels 和 XCode 虚拟机上受支持。2 因此,我不会亲自解释如何做到这一点。虽然,这样做是很有可能的。
查看 Dhiru Kholia 令人惊叹的 GitHub 存储库.
https://github.com/kholia/OSX-KVM
了解如何使用 KVM 在 QEMU 上运行 macOS。这是一部有趣的作品。
原文始发于微信公众号(安全狗的自我修养):QEMU ELI5 — 第 8 部分,实践和示例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论