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