QEMU 支持将主机上的磁盘、目录或 ISO 镜像挂载到虚拟机,并可以提供读写权限。本文将介绍几种常见的方式来实现这一目标。

1. 挂载本地磁盘分区到虚拟机

要将本地磁盘分区(如 /dev/sda1)挂载到虚拟机,可以使用 -drive 选项。

示例命令

qemu-system-i386 -hda linux32.qcow2 -m 1024 -drive file=/dev/sda1,format=raw,if=virtio

参数解释

  • file=/dev/sda1: 指定你要挂载的本地磁盘分区(例如 /dev/sda1)。
  • format=raw: 指定本地磁盘的格式为原始格式。
  • if=virtio: 使用 Virtio 磁盘接口以获得更高的性能。

注意:直接挂载本地磁盘时需要使用 root 权限,并要小心操作以防止数据损坏。


2. 挂载本地目录作为虚拟磁盘 (VirtFS)

QEMU 提供了 VirtFS(Virtual File System)功能,它允许将本地目录挂载到虚拟机中,并提供读写权限。

2.1 启动 QEMU 并挂载本地目录

假设你要将主机上的目录 /path/to/share 挂载到虚拟机的 /mnt/shared 目录,可以使用以下命令:

qemu-system-i386 -hda linux32.qcow2 -m 1024 \
    -virtfs local,id=shared_folder,path=/path/to/share,security_model=mapped,mount_tag=host_share

参数解释

  • -virtfs local: 启用 VirtFS。
  • id=shared_folder: 设置 VirtFS 设备的标识符。
  • path=/path/to/share: 主机上要共享的本地目录路径。
  • security_model=mapped: 使用 mapped 安全模型,允许虚拟机用户映射到主机用户,并提供读写权限。
  • mount_tag=host_share: 设置在虚拟机中挂载时使用的标记。

2.2 在虚拟机中挂载目录

在虚拟机中启动后,使用以下命令挂载共享目录:

sudo mount -t 9p -o trans=virtio host_share /mnt/shared

参数解释

  • -t 9p: 使用 9p 文件系统挂载。
  • trans=virtio: 使用 Virtio 作为传输方式。
  • host_share: 这是在 QEMU 启动时定义的 mount_tag
  • /mnt/shared: 虚拟机中要挂载的目标目录。

3. 挂载本地 ISO 镜像并提供读写权限

如果你想挂载一个本地的 ISO 镜像作为虚拟机的磁盘,可以使用如下命令:

qemu-system-i386 -hda linux32.qcow2 -m 1024 -cdrom /path/to/disk.iso

ISO 镜像读写问题

ISO 镜像通常是只读的。如果需要读写功能,可以将 ISO 镜像的内容提取到虚拟磁盘文件中,使用类似 qcow2 格式并允许读写。

创建并挂载可读写的虚拟磁盘

首先,创建一个可读写的虚拟磁盘:

qemu-img create -f qcow2 writable_disk.qcow2 5G

然后,挂载该磁盘到虚拟机:

qemu-system-i386 -hda linux32.qcow2 -m 1024 -drive file=writable_disk.qcow2,format=qcow2

小结

  • 挂载本地磁盘:使用 -drive file=/dev/sdX 来将本地磁盘分区映射到虚拟机。
  • 挂载本地目录:使用 VirtFS 功能通过 -virtfs 来挂载本地目录,并在虚拟机中使用 9p 协议挂载。
  • 挂载本地 ISO 镜像:可以通过 -cdrom 来加载 ISO 镜像,但这是只读的。如需读写,建议使用虚拟磁盘文件。

通过以上方式,你可以根据需要在虚拟机中访问并使用主机的存储资源,并提供读写权限。