Skip to content

Instantly share code, notes, and snippets.

@fwqaaq
Last active December 1, 2023 10:09
Show Gist options
  • Save fwqaaq/e5f396abf3ea968d9dcb14f2666b2a83 to your computer and use it in GitHub Desktop.
Save fwqaaq/e5f396abf3ea968d9dcb14f2666b2a83 to your computer and use it in GitHub Desktop.
Qemu 基本操作

下载 qemu

# Ubuntu
apt install qemu-kvm qemu-utils
# Fedora
dnf install qemu-system-x86-core qemu-ui-gtk qemu-audio-pa qemu-device-usb-host qemu-img

qemu-img

  • 创建镜像文件
qemu-img create -f qcow2 image.qcow2 10G
# 创建大小为 10G 的 qcow2 格式镜像
  • 转换镜像格式
qemu-img convert -f raw -O qcow2 image.raw image.qcow2
# 将 raw 镜像转换为 qcow2 格式镜像

参考:https://support.huaweicloud.com/bestpractice-ims/ims_bp_0030.html

  • 查看镜像信息
qemu-img info image.qcow2
# 显示镜像文件的格式、虚拟大小、磁盘使用等信息。
  • 重新调整镜像大小
qemu-img resize image.qcow2 +5G
# 将镜像文件的大小增加 5G
  • 截断镜像文件
qemu-img convert -f qcow2 -O qcow2 -s image.qcow2 new.qcow2
# 基于 image 创建一个容量精确匹配当前用量的新镜像 new

qcow2 格式和 img格式的区别

  1. 镜像文件格式不同:qcow2 全称为 QEMU Copy On Write version 2,是 QEMU 开发的一种虚拟机磁盘镜像格式。img 通常指的是 raw 格式的虚拟机镜像,是一种最基本的磁盘镜像存储格式。
  2. 是否支持写时复制 qcow2 格式支持写时复制机制,因此可以实现镜像文件的压缩、加密等高级功能。raw 格式的 img 不支持写时复制,对镜像文件作的任何修改都会直接作用在源文件上。
  3. 镜像文件大小:qcow2 通过写时复制,可以只为写入的数据分配空间,因此文件的实际占用空间可能比虚拟大小小得多。img 文件占用空间和虚拟大小基本一致。
  4. I/O 性能:img 文件的 I/O 性能略高于 qcow2,因为不需要额外的写时复制操作。qcow2 需要进行写时复制,I/O 性能相对会稍差一些。
  5. 适用环境:qcow2 格式适用于需要频繁创建镜像、进行虚拟机快照等功能的环境。raw 格式简单高效,适合对 I/O 性能要求较高的场景。

dd 命令

dd 命令用于对镜像文件进行修改

dd if=bootloader.bin of=disk.img bs=512 count=1 conv=notrunc
dd if=yourfile.bin of=disk.img bs=512 seek=10 conv=notrunc

If 标识输入的文件路径,of 表示输出的文件路径,bs 表示每个块的大小(扇区大小),count 表示要复制多少块默认是 1,copy 表示复制的数据做转换的选项,seek 表示指定写入的偏移量(以块为单位),例如,bs=512 seek=10,那么偏移量就是 10*512 字节的偏移量

  • notrunc:不截断输出文件。
  • noerror:出现错误时不停止。默认情况下,如果 dd 在读取或写入过程中遇到错误,它将停止并显示错误消息。使用 noerror 参数可以使 dd 忽略错误并继续操作。
  • sync:用空字节填充输入文件中的每个不足 bs 字节的数据块。
  • fdatasync:在刷新输出数据前,先刷新文件的元数据。
  • fsync:在刷新输出数据和文件的元数据前,先刷新文件的元数据。
  • conv=ascii:将非 ASCII 字符转换为问号字符。
  • conv=ebcdic:将 ASCII 字符转换为 EBCDIC 字符。
  • conv=block:将输入文件中的每个 bs 字节块进行分块,分块时去掉任何尾部的空字节。
  • conv=unblock:将输入文件中的分块还原成未分块的形式,并在尾部添加空字节以达到 bs 字节大小。
  • conv=lcase:将输入数据中的大写字符转换为小写字符。
  • conv=ucase:将输入数据中的小写字符转换为大写字符。
  • conv=swab:交换每个输入数据块的第一字节和第二字节的位置。

在使用 dd 命令时,可以将多个 conv 参数值组合使用。例如,conv=notrunc,fdatasync 选项将禁用输出文件的截断,并在输出数据之前首先刷新文件的元数据。 qemu-system-x86_64 -drive format=raw,file=disk.img

启动命令

注意:以下命令在后续的启动中不需要使用 -cdrom(重新写入)

sudo qemu-system-x86_64 \
-machine type=q35,accel=kvm \
-device qemu-xhci \
-device usb-tablet -cpu host -rtc base=localtime \
-smp 4 -m 4G \
-hda debian12.qcow2 -cdrom debian-12.0.0-amd64-netinst.iso
  • -machine type=q35,accel=kvm: 指定虚拟机使用 Q35 芯片组,并启用 KVM 加速。
  • -device qemu-xhci: 添加一个 USB 3.0 主机控制器,使用 QEMU模 拟的 xHCI (eXtensible Host Controller Interface) 接口(SuperSpeed USB 标准)支持并与 USB 3.0 设备通信
  • -device usb-tablet: 启用 USB 支持,这通常用于使鼠标在宿主机和虚拟机之间无缝移动。
  • -cpu host:用宿主机的 CPU 来模拟虚拟机的 CPU。
  • -rtc base=localtime: 设置实时时钟(RTC)基于本地时区。这确保了虚拟机的时钟与宿主机同步。
  • -m 4G: 指定虚拟机内存为 4GB。
  • -smp 4: 指定虚拟机使用 4 个 CPU 核心。
  • -hda debian12.qcow2:指定虚拟硬盘的镜像文件。
  • -cdrom os.iso: 将镜像文件 os.iso 挂载到虚拟机的 CD-ROM 设备上,并将 CD-ROM 设置为启动设备。
  • -net user: 默认网络,为 NAT,不会主动暴露到公网(默认选项)

-boot 参数用于设置虚拟机的引导选项。以下是一些可能的 -boot 参数及其含义:

  • -boot c:从第一个 IDE 磁盘 (hd0) 中引导。这通常是引导一个硬盘镜像文件的常用方式。
  • -boot d:从第一个 IDE 光驱 (cdrom) 中引导。这通常用于引导光盘镜像文件。
  • -boot n:从第一个网络引导 (PXE) 设备中引导。这通常用于通过网络引导虚拟机。
  • -boot menu=on:在启动时显示一个启动菜单,允许用户选择从哪个设备引导。

参考:https://kkocdko.site/post/202208221154

gdb 调试

qemu-system-x86_64 -drive file=start.bin,format=raw -s -S 启动 qemu 远程调试
# 另一个终端
gdb
file start.bin //要调试的文件
b *0x7c00 // 断点,入口位置
target remote localhost:1234

如果是 lldb 只需要将最后一步改为 gdb-remote localhost:1234

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment