欢迎光临散文网 会员登陆 & 注册

[QEMU]磁盘映像

2022-07-19 09:57 作者:-小白之家-  | 我要投稿

QEMU 支持多种磁盘映像格式,包括可增长的磁盘映像(其大小随着非空扇区的写入而增加)、压缩和加密的磁盘映像。


创建磁盘映像的快速入门

您可以使用以下命令创建磁盘映像:

qemu-img create myimage.img mysize

其中 myimage.img 是磁盘映像文件名,mysize 是其大小(以千字节为单位)。您可以添加一个后缀以提供大小(以 MB 为单位)和一个后缀来表示 GB。MG

有关详细信息,请参阅调用文档。qemu-img


快照模式

如果使用该选项,则所有磁盘映像都被视为只读。写入扇区时,它们将写入 在 中创建的临时文件中。但是,您可以使用监视命令(或串行控制台中的 C-a s)强制写回原始磁盘映像。-snapshot/tmpcommit


虚拟机快照

VM 快照是整个虚拟机的快照,包括 CPU 状态、RAM、设备状态和所有可写磁盘的内容。要使用 VM 快照,必须至少有一个使用磁盘映像格式的不可移动和可写块设备。通常,此设备是第一个虚拟硬盘驱动器。qcow2

使用 monitor 命令创建新的 VM 快照或替换现有快照。除了每个快照的数字 ID 之外,还可以为其分配一个人类可读的名称。savevm

用于还原 VM 快照和删除 VM 快照。 列出了可用的快照及其相关信息:loadvmdelvminfo snapshots

(qemu) info snapshotsSnapshot devices: hdaSnapshot list (from hda):ID        TAG                 VM SIZE                DATE       VM CLOCK1         start                   41M 2006-08-06 12:38:02   00:00:14.9542                                 40M 2006-08-06 12:43:29   00:00:18.6333         msys                    40M 2006-08-06 12:44:04   00:00:23.514

VM 快照由 VM 状态信息(其大小显示在 中)和每个可写磁盘映像的快照组成。VM 状态信息存储在第一个不可移动和可写块设备中。磁盘映像快照存储在每个磁盘映像中。磁盘映像中快照的大小很难评估,也不会显示,因为关联的磁盘扇区在所有快照之间共享以节省磁盘空间(否则每个快照都需要所有磁盘映像的完整副本)。info snapshotsqcow2info snapshots

使用(不相关)选项(快照模式)时,始终可以制作 VM 快照,但一旦退出 QEMU,它们就会被删除。-snapshot

VM 快照当前具有以下已知限制:

  • 如果在快照完成后删除或插入可移动设备,则它们无法应对这些设备。

  • 一些设备驱动程序仍然具有不完整的快照支持,因此无法正确保存或还原其状态(尤其是 USB)。

磁盘映像文件格式

QEMU 支持许多映像文件格式,这些格式可以与 VM 以及任何工具(如 )一起使用。这包括首选格式 raw 和 qcow2,以及支持与较旧的 QEMU 版本或其他虚拟机管理程序兼容的格式。qemu-img

根据图像格式,可以将不同的选项传递给该选项并使用该选项。本节介绍每种格式及其支持的选项。qemu-img createqemu-img convert-o

  • raw

  • 原始磁盘映像格式。这种格式的优点是简单且易于导出到所有其他模拟器。如果您的文件系统支持漏洞(例如,在 Linux 上的 ext2 或 ext3 中,或在 Windows 上的 NTFS 中),则只有写入的扇区会保留空间。用于了解映像或 Unix/Linux 上使用的实际大小。qemu-img infols -ls

    支持的选项:

    • preallocation

    • 预分配模式(允许的值:、 、 )。 模式通过调用 来预分配映像空间。 模式通过将数据写入基础存储来预分配图像空间。此数据可能为零,也可能不为零,具体取决于存储位置。offfallocfullfallocposix_fallocate()full

  • qcow2

  • QEMU图像格式,最通用的格式。使用它来获得较小的映像(如果您的文件系统不支持孔,例如在Windows上),基于zlib的压缩和支持多个VM快照,则很有用。

    支持的选项:

    • 通过使用nodatacow挂载来禁用它,然后所有新创建的文件都将是NOCOW。

    • 对于空文件,请添加 NOCOW 文件属性。这就是此选项的作用。

    • nocow

    • 如果此选项设置为 ,将关闭文件的 COW。它仅在 btrfs 上有效,对其他文件系统没有影响。on

      托管 VM 映像文件时,Btrfs 的性能较低,当 VM 上的来宾也使用 btrfs 作为文件系统时,性能会更低。关闭 COW 是缓解这种不良性能的一种方法。通常有两种方法可以在 btrfs 上关闭 COW:

      注意:此选项仅对新文件或空文件有效。如果存在 COW 且已具有数据块的现有文件,则无法通过设置 将其更改为 NOCOW。可以发出检查NOCOW标志是否设置(大写字母“C”是NOCOW标志)。nocow=onlsattr filename

    • lazy_refcounts

    • 如果此选项设置为 ,则会推迟引用计数更新,以避免元数据 I/O 并提高性能。这特别有趣,因为它不会批量更新元数据。权衡是,在主机崩溃后,必须重建参考计数表,即在下一次打开时需要一个(自动),这可能需要一些时间。oncache=writethroughqemu-img check -r all

      仅当指定了 此选项时,才能启用此选项。compat=1.1

    • preallocation

    • 预分配模式(允许的值:、、、)。具有预分配元数据的映像最初较大,但当映像需要增长时,可以提高性能。 和预分配类似于相同的格式选项,但也设置了元数据。offmetadatafallocfullfallocfullraw

    • cluster_size

    • 更改 qcow2 群集大小(必须介于 512 和 2M 之间)。较小的簇大小可以改善图像文件大小,而较大的簇大小通常可以提供更好的性能。

    • encrypt.iter-time

    • 每个密钥槽用于 PBKDF 算法的时间量(以毫秒为单位)。缺省值为 。仅在 以下情况下使用。2000encrypt.format=luks

    • encrypt.hash-alg

    • 用于 PBKDF 算法的哈希算法的名称 默认为 。仅在 以下情况下使用。sha256encrypt.format=luks

    • encrypt.ivgen-hash-alg

    • 要与初始化向量生成器一起使用的哈希算法的名称(如果需要)。缺省值为 。仅在 以下情况下使用。sha256encrypt.format=luks

    • encrypt.ivgen-alg

    • 初始化向量生成器算法的名称。当前默认为 。仅在 以下情况下使用。plain64encrypt.format=luks

    • encrypt.cipher-mode

    • 要使用的加密模式的名称。当前默认为 。仅在 以下情况下使用。xtsencrypt.format=luks

    • encrypt.cipher-alg

    • 密码算法的名称和密钥长度。当前默认为 。仅在 以下情况下使用。aes-256encrypt.format=luks

    • encrypt.key-secret

    • 提供包含通行短语 () 或加密密钥 () 的对象的 ID。secretencrypt.format=luksencrypt.format=aes

    • AES-CBC 密码与基于扇区号的可预测初始化向量一起使用。这使得它容易受到选定的明文攻击,这些攻击可以揭示加密数据的存在。

    • 用户密码直接用作加密密钥。选择不当或密码短语较短将损害加密的安全性。

    • 如果密码被泄露,则无法更改密码以保护任何qcow图像中的数据。必须使用新文件中的不同加密密码来克隆文件。然后必须使用像shred这样的程序安全地擦除原始文件,尽管即使这在许多现代存储技术中也是无效的。

    • encrypt.format

    • 如果将其设置为 ,则请求使用 LUKS 格式对 qcow2 有效负载(不是 qcow2 标头)进行加密。用于解锁 LUKS 密钥槽的密码由参数给出。LUKS 加密参数可以使用其他参数进行调整。luksencrypt.key-secretencrypt.*

      如果设置为 ,则使用 128 位 AES-CBC 对映像进行加密。加密密钥由参数给出。这种加密格式被认为是现代密码学标准的缺陷,存在许多设计问题:aesencrypt.key-secret

      系统仿真器不再支持使用此选项。支持仅保留在命令行实用程序中,用于数据解放和与旧版QEMU的互操作性。应改用该格式。luks

    • encryption

    • 此选项已弃用,等效于encrypt.format=aes

    • backing_fmt

    • 基础映像的图像格式

    • backing_file

    • 基本映像的文件名(请参见子命令)create

    • compat

    • 确定要使用的 qcow2 版本。 使用传统的图像格式,自0.10以来,任何QEMU都可以读取。 启用只有 QEMU 1.1 及更高版本才能理解的图像格式扩展(这是默认设置)。其中包括零集群,这允许对稀疏图像进行高效的读取复制。compat=0.10compat=1.1

      • qed

      • 支持支持支持文件和压缩映像文件的旧 QEMU 映像格式(当您的文件系统或传输介质不支持孔时)。

        将 QED 图像转换为 qcow2 时,您可能需要考虑使用该选项来获得更类似于 QED 的行为。lazy_refcounts=on

        支持的选项:

        • table_size

        • 更改每个 L1/L2 表的簇数(必须为 1 到 16 之间的 2 次幂)。通常不需要更改此值,但此选项可以在用于性能基准测试之间进行更改。

        • cluster_size

        • 更改簇大小(必须在 4K 和 64K 之间为 2 的幂)。较小的簇大小可以改善图像文件大小,而较大的簇大小通常可以提供更好的性能。

        • backing_fmt

        • 支持文件的图像文件格式(可选)。如果由于格式没有标头而无法自动检测,则非常有用,就像某些 vhd/vpc 文件一样。

        • backing_file

        • 基本映像的文件名(请参见子命令)。create

      • qcow

      • 旧的QEMU映像格式,支持支持备份文件,压缩映像文件,加密和压缩。

        支持的选项:

        • encrypt.key-secret

        • 提供包含加密密钥 () 的对象的 ID。secretencrypt.format=aes

        • encrypt.format

        • 如果设置为 ,则使用 128 位 AES-CBC 对映像进行加密。加密密钥由参数给出。这种加密格式被认为是现代密码学标准的缺陷,遭受了以前针对图像格式列举的许多设计问题。aesencrypt.key-secretqcow2

          系统仿真器不再支持使用此选项。支持仅保留在命令行实用程序中,用于数据解放和与旧版QEMU的互操作性。

          需要本机加密的用户应将格式改为使用 。qcow2encrypt.format=luks

        • encryption

        • 此选项已弃用,等效于encrypt.format=aes

        • backing_file

        • 基本映像的文件名(请参见子命令)create

      • luks

      • LUKS v1 加密格式,与 Linux dm-crypt/cryptsetup 兼容

        支持的选项:

        • iter-time

        • 每个密钥槽用于 PBKDF 算法的时间量(以毫秒为单位)。缺省值为 。2000

        • hash-alg

        • 用于 PBKDF 算法的哈希算法的名称 默认为 。sha256

        • ivgen-hash-alg

        • 要与初始化向量生成器一起使用的哈希算法的名称(如果需要)。缺省值为 。sha256

        • ivgen-alg

        • 初始化向量生成器算法的名称。当前默认为 。plain64

        • cipher-mode

        • 要使用的加密模式的名称。当前默认为 。xts

        • cipher-alg

        • 密码算法的名称和密钥长度。当前默认为 。aes-256

        • key-secret

        • 提供包含通行短语的对象的 ID。secret

        • vdi

        • VirtualBox 1.1 兼容映像格式。

          支持的选项:

          • static

          • 如果此选项设置为 ,则使用元数据预分配创建映像。on

        • vmdk

        • VMware 3 和 4 兼容的映像格式。

          支持的选项:

          • subformat

          • 指定要使用的 VMDK 子格式。有效选项包括(默认)、、和 。monolithicSparsemonolithicFlattwoGbMaxExtentSparsetwoGbMaxExtentFlatstreamOptimized

          • hwversion

          • 指定 vmdk 虚拟硬件版本。如果指定了 hwversion,则无法启用 Compat6 标志。

          • compat6

          • 创建 VMDK 版本 6 映像(而不是版本 4)

          • backing_file

          • 基本映像的文件名(请参见子命令)。create

        • vpc

        • 与虚拟 PC 兼容的映像格式 (VHD)。

          支持的选项:

          • subformat

          • 指定要使用的 VHD 子格式。有效选项为(默认)和 。dynamicfixed

        • VHDX

        • Hyper-V 兼容映像格式 (VHDX)。

          支持的选项:

          • block_state_zero

          • 强制使用类型为“零”的有效载荷块。可以设置为(默认)或 。当设置为 时,新块将被创建为 ,这意味着解析器可以自由地为这些块返回任意数据。与 一起使用时,请勿设置为 。onoffoffPAYLOAD_BLOCK_NOT_PRESENToffqemu-img convertsubformat=dynamic

          • block_size

          • 块大小;最小 1 MB,最大 256 MB。0 表示根据图像大小自动计算。

          • log_size

          • 日志大小;最小 1 MB。

          • subformat

          • 指定要使用的 VHDX 子格式。有效选项为(默认)和 。dynamicfixed

        只读格式

        只读模式下支持更多磁盘映像文件格式。

        • bochs

        • 波克斯图像类型。growing

        • cloop

        • Linux 压缩循环映像,仅用于重用直接压缩的 CD-ROM 映像,例如在 Knoppix CD-ROM 中存在。

        • dmg

        • 苹果磁盘映像。

        • parallels

        • 并行磁盘映像格式。

        使用主机驱动器

        除了磁盘映像文件,QEMU 还可以直接访问主机设备。我们在这里描述QEMU版本>= 0.8.3的用法。

        Linux

        在 Linux 上,您可以直接使用主机设备文件名,而不是磁盘映像文件名,前提是您有足够的权限访问它。例如,用于访问 CDROM。/dev/cdrom

        • 光盘

        • 即使未加载 CDROM,也可以指定 CDROM 设备。QEMU具有特定的代码来检测CDROM的插入或拔出。支持客户机操作系统弹出 CDROM。目前仅支持数据 CD。

        • 软盘

        • 即使未加载软盘,也可以指定软盘设备。当前未准确检测到软盘移除(如果在未加载软盘时未执行软盘访问的情况下更改软盘,则客户机操作系统将认为加载了相同的软盘)。不推荐使用主机的软盘设备,在将来的版本中将删除对它的支持。

        • 硬盘

        • 可以使用硬盘。通常,必须指定整个磁盘(而不是 ),以便来宾操作系统可以将其视为分区磁盘。警告:除非您知道自己在做什么,否则最好只对硬盘进行只读访问,否则可能会损坏主机数据(使用命令行选项或相应地修改设备权限)。/dev/hdb/dev/hdb1-snapshot

        窗户

        • 光盘

        • 首选语法是驱动器号(例如 )。支持备用语法。 支持作为第一个 CDROM 驱动器的别名。d:\\.\d:/dev/cdrom

          目前没有特定的代码来处理可移动介质,因此最好使用 或 监视 命令来更改或弹出介质。changeeject

        • 硬盘

        • 硬盘可以与以下语法一起使用:其中 N 是驱动器号(0 是第一个硬盘)。\\.\PhysicalDriveN

          警告:除非您知道自己在做什么,否则最好只对硬盘进行只读访问,否则可能会损坏主机数据(使用命令行,以便将修改写入临时文件)。-snapshot

        Mac OS X

        /dev/cdrom是第一个 CDROM 的别名。

        目前没有特定的代码来处理可移动介质,因此最好使用 或 监视 命令来更改或弹出介质。changeeject

        虚拟 FAT 磁盘映像

        QEMU 可以从目录树自动创建虚拟 FAT 磁盘映像。要使用它,只需键入:

        qemu-system-x86_64 linux.img -hdb fat:/my_directory

        然后,您可以访问目录中的所有文件,而无需将它们复制到磁盘映像中或通过 SAMBA 或 NFS 导出它们。默认访问是只读的。/my_directory

        软盘可以通过以下选项进行模拟::floppy:

        qemu-system-x86_64 linux.img -fda fat:floppy:/my_directory

        读/写支持可用于测试(beta 阶段),具有以下选项::rw:

        qemu-system-x86_64 linux.img -fda fat:floppy:rw:/my_directory

        你永远不应该做什么:

        • 使用非 ASCII 文件名

        • 将“-snapshot”与“:rw:”一起使用

        • 期望它在加载vm'ing时工作

        • 写入主机系统上的 FAT 目录,同时使用客户机系统访问该目录

        NBD 访问

        QEMU 可以直接访问使用网络块设备协议导出的块设备。

        qemu-system-x86_64 linux.img -hdb nbd://my_nbd_server.mydomain.org:1024/

        如果 NBD 服务器位于同一主机上,则可以使用 unix 套接字而不是 inet 套接字:

        qemu-system-x86_64 linux.img -hdb nbd+unix://?socket=/tmp/my_socket

        在这种情况下,必须使用以下命令导出块设备:qemu-nbd

        qemu-nbd --socket=/tmp/my_socket my_disk.qcow2

        使用 允许在多个来宾之间共享磁盘:qemu-nbd

        qemu-nbd --socket=/tmp/my_socket --share=2 my_disk.qcow2

        然后,您可以将其与两个来宾一起使用:

        qemu-system-x86_64 linux1.img -hdb nbd+unix://?socket=/tmp/my_socket qemu-system-x86_64 linux2.img -hdb nbd+unix://?socket=/tmp/my_socket

        如果使用命名导出(自 NBD 2.9.18 起受支持,或者使用 QEMU 自己的嵌入式 NBD 服务器),则必须在 URI 中指定导出名称:nbd-server

        qemu-system-x86_64 -cdrom nbd://localhost/debian-500-ppc-netinst qemu-system-x86_64 -cdrom nbd://localhost/openSUSE-11.1-ppc-netinst

        自 QEMU 1.3 起,NBD 的 URI 语法一直受支持。还提供了另一种语法。以下是旧语法的一些示例:

        qemu-system-x86_64 linux.img -hdb nbd:my_nbd_server.mydomain.org:1024 qemu-system-x86_64 linux2.img -hdb nbd:unix:/tmp/my_socket qemu-system-x86_64 -cdrom nbd:localhost:10809:exportname=debian-500-ppc-netinst

        iSCSI LUN

        iSCSI 是一种流行的协议,用于通过计算机网络访问 SCSI 设备。

        QEMU 可以使用两种不同的方式使用 iSCSI 设备。

        第一种方法是在主机上装载 iSCSI LUN,并使其与主机上的任何其他普通 SCSI 设备一样显示,然后从 QEMU 以 /dev/sd 设备的形式访问此设备。如何执行此操作因主机操作系统而异。

        第二种方法涉及使用内置于 QEMU 中的 iSCSI 发起程序。这提供了一种机制,无论您在哪个主机操作系统上运行 QEMU,其工作方式都相同。本节将介绍将 iSCSI 与 QEMU 一起使用的第二种方法。

        在 QEMU 中,iSCSI 设备使用特殊的 iSCSI URL 进行描述。网址语法:

        iscsi://[<username>[%<password>]@]<host>[:<port>]/<target-iqn-name>/<lun>

        用户名和密码是可选的,仅当使用 CHAP 身份验证进行访问控制设置目标时,才使用用户名和密码。或者,也可以通过环境变量设置用户名和密码,使其不显示在进程列表中:

        export LIBISCSI_CHAP_USERNAME=<username>export LIBISCSI_CHAP_PASSWORD=<password>iscsi://<host>/<target-iqn-name>/<lun>

        可以通过特殊选项设置各种与会话相关的参数,这些参数可以在通过“-readconfig”提供的配置文件中设置,也可以直接在命令行上设置。

        如果未指定启动器名称,qemu 将使用默认名称 'iqn.2008-11.org.linux-kvm[:<uuid>'],其中 <uuid> 是虚拟机的 UUID。如果未指定 UUID,qemu 将使用 'iqn.2008-11.org.linux-kvm[:<name>'],其中 <name> 是虚拟机的名称。

        设置登录到目标时要使用的特定启动器名称:

        -iscsi initiator-name=iqn.qemu.test:my-initiator

        控制要与目标协商的标头摘要类型:

        -iscsi header-digest=CRC32C|CRC32C-NONE|NONE-CRC32C|NONE

        这些也可以通过配置文件进行设置:

        [iscsi]  user = "CHAP username"  password = "CHAP password"  initiator-name = "iqn.qemu.test:my-initiator"  # header digest is one of CRC32C|CRC32C-NONE|NONE-CRC32C|NONE  header-digest = "CRC32C"

        设置目标名称允许对不同的目标使用不同的选项:

        [iscsi "iqn.target.name"]  user = "CHAP username"  password = "CHAP password"  initiator-name = "iqn.qemu.test:my-initiator"  # header digest is one of CRC32C|CRC32C-NONE|NONE-CRC32C|NONE  header-digest = "CRC32C"

        如何使用配置文件设置 iSCSI 配置选项:

        cat >iscsi.conf <<EOF [iscsi]  user = "me"  password = "my password"  initiator-name = "iqn.qemu.test:my-initiator"  header-digest = "CRC32C" EOF qemu-system-x86_64 -drive file=iscsi://127.0.0.1/iqn.qemu.test/1 \  -readconfig iscsi.conf

        如何在环回上设置一个简单的 iSCSI 目标并通过 QEMU 访问它:此示例演示如何使用 Linux STGT 软件目标设置具有一个 CDROM 和一个磁盘的 iSCSI 目标。此目标在基于红帽的系统上作为包“scsi-target-utils”可用。

        tgtd --iscsi portal=127.0.0.1:3260 tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.qemu.test tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 \    -b /IMAGES/disk.img --device-type=disk tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 2 \    -b /IMAGES/cd.iso --device-type=cd tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL qemu-system-x86_64 -iscsi initiator-name=iqn.qemu.test:my-initiator \  -boot d -drive file=iscsi://127.0.0.1/iqn.qemu.test/1 \  -cdrom iscsi://127.0.0.1/iqn.qemu.test/2

        GlusterFS 磁盘映像

        GlusterFS是一个用户空间分布式文件系统。

        您可以使用以下命令从 GlusterFS 磁盘映像引导:

        尿道里:

        qemu-system-x86_64 -drive file=gluster[+TYPE]://[HOST}[:PORT]]/VOLUME/PATH                             [?socket=...][,file.debug=9][,file.logfile=...]

        JSON:

        qemu-system-x86_64 'json:{"driver":"qcow2",                         "file":{"driver":"gluster",                                  "volume":"testvol","path":"a.img","debug":9,"logfile":"...",                                  "server":[{"type":"tcp","host":"...","port":"..."},                                            {"type":"unix","socket":"..."}]}}'

        胶酯是协议。

        TYPE 指定用于连接到 gluster 管理守护程序 (glusterd) 的传输类型。有效的传输类型是 tcp 和 unix。在 URI 形式中,如果未指定传输类型,则假定 tcp 类型。

        HOST 指定给定卷的卷文件规范所在的服务器。这可以是主机名或 ipv4 地址。如果传输类型为 unix,则不应指定 HOST 字段。相反,套接字字段需要填充unix域套接字的路径。

        PORT 是 glusterd 正在侦听的端口号。这是可选的,如果未指定,则默认为端口 24007。如果传输类型为 unix,则不应指定 PORT。

        VOLUME 是包含磁盘映像的 gluster 卷的名称。

        PATH 是驻留在 gluster 卷上的实际磁盘映像的路径。

        debug 是 gluster 协议驱动程序的日志记录级别。调试级别为 0-9,其中 9 是最详细的,0 表示无调试输出。默认级别为 4。Gluster 源中定义的当前日志记录级别为 0 - 无、1 - 紧急、2 - 警报、3 - 严重、4 - 错误、5 - 警告、6 - 通知、7 - 信息、8 - 调试、9 - 跟踪

        logfile是一个命令行选项,用于提及日志文件路径,这有助于记录到指定的文件,也有助于持久化gfapi日志。默认值为 stderr。

        您可以使用以下命令创建 GlusterFS 磁盘映像:

        qemu-img create gluster://HOST/VOLUME/PATH SIZE

        例子

        qemu-system-x86_64 -drive file=gluster://1.2.3.4/testvol/a.img qemu-system-x86_64 -drive file=gluster+tcp://1.2.3.4/testvol/a.img qemu-system-x86_64 -drive file=gluster+tcp://1.2.3.4:24007/testvol/dir/a.img qemu-system-x86_64 -drive file=gluster+tcp://[1:2:3:4:5:6:7:8]/testvol/dir/a.img qemu-system-x86_64 -drive file=gluster+tcp://[1:2:3:4:5:6:7:8]:24007/testvol/dir/a.img qemu-system-x86_64 -drive file=gluster+tcp://server.domain.com:24007/testvol/dir/a.img qemu-system-x86_64 -drive file=gluster+unix:///testvol/dir/a.img?socket=/tmp/glusterd.socket qemu-system-x86_64 -drive file=gluster+rdma://1.2.3.4:24007/testvol/a.img qemu-system-x86_64 -drive file=gluster://1.2.3.4/testvol/a.img,file.debug=9,file.logfile=/var/log/qemu-gluster.log qemu-system-x86_64 'json:{"driver":"qcow2",                         "file":{"driver":"gluster",                                  "volume":"testvol","path":"a.img",                                  "debug":9,"logfile":"/var/log/qemu-gluster.log",                                  "server":[{"type":"tcp","host":"1.2.3.4","port":24007},                                            {"type":"unix","socket":"/var/run/glusterd.socket"}]}}' qemu-system-x86_64 -drive driver=qcow2,file.driver=gluster,file.volume=testvol,file.path=/path/a.img,                                     file.debug=9,file.logfile=/var/log/qemu-gluster.log,                                     file.server.0.type=tcp,file.server.0.host=1.2.3.4,file.server.0.port=24007,                                     file.server.1.type=unix,file.server.1.socket=/var/run/glusterd.socket

        安全外壳 (ssh) 磁盘映像

        您可以使用 ssh 协议访问位于远程 ssh 服务器上的磁盘映像:

        qemu-system-x86_64 -drive file=ssh://[USER@]SERVER[:PORT]/PATH[?host_key_check=HOST_KEY_CHECK]

        使用属性的替代语法:

        qemu-system-x86_64 -drive file.driver=ssh[,file.user=USER],file.host=SERVER[,file.port=PORT],file.path=PATH[,file.host_key_check=HOST_KEY_CHECK]

        ssh 是协议。

        用户是远程用户。如果未指定,则尝试本地用户名。

        服务器指定远程 ssh 服务器。可以使用任何 ssh 服务器,但它必须实现 sftp-server 协议。大多数Unix/Linux系统应该在不需要任何额外配置的情况下工作。

        PORT 是 sshd 正在侦听的端口号。默认情况下,使用标准 ssh 端口 (22)。

        PATH 是磁盘映像的路径。

        可选的 HOST_KEY_CHECK 参数控制如何检查远程主机的密钥。默认值为使用本地文件。设置此选项可关闭已知主机检查。或者,您可以检查主机密钥是否与特定指纹匹配。指纹可以以 、 或格式提供,但是,强烈建议仅使用 ,因为其他选项在现代标准下被认为是不安全的。指纹值必须以十六进制编码字符串的形式给出:yes.ssh/known_hostsnomd5sha1sha256sha256

        host_key_check=sha256:04ce2ae89ff4295a6b9c4111640bdcb3297858ee55cb434d9dd88796e93aa795

        键字符串可以选择在每对十六进制数字之间包含“:”分隔符。

        该文件包含 base64 编码的主机密钥。这些可以使用以下命令转换为QEMU所需的格式:$HOME/.ssh/known_hosts

        $ for key in `grep 10.33.8.112 known_hosts | awk '{print $3}'`  do    echo $key | base64 -d | sha256sum  done  6c3aa525beda9dc83eadfbd7e5ba7d976ecb59575d1633c87cd06ed2ed6e366f  -  12214fd9ea5b408086f98ecccd9958609bd9ac7c0ea316734006bc7818b45dc8  -  d36420137bcbd101209ef70c3b15dc07362fbe0fa53c5b135eba6e6afa82f0ce  -

        请注意,每个主机可以存在多个密钥,每个密钥具有不同的密钥密码。需要注意选择与 QEMU 将与远程服务器协商的密码相匹配的密钥指纹。

        当前,必须使用 ssh 代理完成身份验证。将来可能会支持其他身份验证方法。

        注: 许多 ssh 服务器不支持 -style 操作。ssh 驱动程序不能保证磁盘刷新请求得到遵守,如果远程服务器或网络在写入期间出现故障,这会导致磁盘损坏的风险。当不支持时,驱动程序将打印警告:fsyncfsync

        warning: ssh server ssh.example.com:22 does not support fsync

        使用足够新版本的libssh和OpenSSH,是受支持的。fsync

        NVMe 磁盘映像

        NVM Express (NVMe) 存储控制器可由 QEMU 中的用户空间驱动程序直接访问。这绕过了主机内核文件系统和块层,同时保留了QEMU块层功能,例如块作业,I / O限制,映像格式等。磁盘 I/O 性能通常高于使用线程池或 linux-aio。-drive file=/dev/sda

        一旦启动,控制器将由QEMU进程专用。为了能够在主机上的多个 VM 和其他应用程序之间共享存储,请使用基于文件的协议。

        在启动 QEMU 之前,请将主机 NVMe 控制器绑定到主机 vfio-pci 驱动程序。例如:

        # modprobe vfio-pci # lspci -n -s 0000:06:0d.0 06:0d.0 0401: 1102:0002 (rev 08) # echo 0000:06:0d.0 > /sys/bus/pci/devices/0000:06:0d.0/driver/unbind # echo 1102 0002 > /sys/bus/pci/drivers/vfio-pci/new_id # qemu-system-x86_64 -drive file=nvme://HOST:BUS:SLOT.FUNC/NAMESPACE

        使用属性的替代语法:

        qemu-system-x86_64 -drive file.driver=nvme,file.device=HOST:BUS:SLOT.FUNC,file.namespace=NAMESPACE

        主机:总线:插槽。FUNC 是 NVMe 控制器在主机上的 PCI 设备地址。

        命名空间是 NVMe 命名空间编号,从 1 开始。

        磁盘映像文件锁定

        默认情况下,QEMU 会尝试保护映像文件免受意外并发访问,只要块协议驱动程序和主机操作系统支持该文件即可。如果多个 QEMU 进程(包括 QEMU 仿真器和实用程序)尝试打开具有冲突访问模式的同一映像,则除第一个进程之外,其他所有进程都将出现错误。

        此功能目前由 Linux 上的文件协议支持,具有开放文件描述符 (OFD) 锁定 API,并且可以配置为在 POSIX 主机不支持 Linux OFD 锁定时回退到 POSIX 锁定。

        若要显式启用映像锁定,请在文件协议驱动程序选项中指定“locking=on”。如果无法锁定 OFD,则将打印警告并使用 POSIX 锁定 API。在这种情况下,由于POSIX锁定API的缺点,在执行热插拔和阻止作业时,存在锁定将无声丢失的风险。

        QEMU 在共享存储迁移期间透明地处理锁切换。对于多个虚拟机之间的共享虚拟磁盘映像,应使用“share-rw”设备选项。

        默认情况下,来宾对其磁盘映像具有独占写入访问权限。如果来宾可以安全地与其他写入器共享磁盘映像,则可以使用该参数。仅当客户机正在运行协调磁盘访问以避免损坏的软件(如群集文件系统)时,这才是安全的。-device ...,share-rw=on

        请注意,share-rw=on 仅声明来宾共享磁盘的能力。某些 QEMU 功能(如映像文件格式)需要对磁盘映像进行独占写入访问,这不受 share-rw=on 选项的影响。

        或者,可以通过“锁定=关闭”块设备选项完全禁用锁定。在命令行中,该选项通常采用“file.locking=off”的形式,因为协议驱动程序通常作为格式驱动程序下的“file”子级放置。例如:

        -blockdev driver=qcow2,file.filename=/path/to/image,file.locking=off,file.driver=file

        要检查映像锁定是否处于活动状态,请检查主机上“lslocks”命令的输出,并查看 QEMU 进程对映像文件是否持有锁。QEMU 实例可以锁定多个字节,其中每个字节都反映由正在运行的块驱动程序获取或保护的特定权限。

        筛选器驱动程序

        QEMU 支持多个筛选器驱动程序,这些驱动程序不存储任何数据,但执行一些附加任务,挂接 io 请求。

        • preallocate

        • 预分配筛选器驱动程序旨在插入到格式和协议节点之间,并在写入文件末尾时预分配一些额外空间(扩展协议文件)。这对于分配缓慢的文件系统非常有用。

          支持的选项:

          • prealloc-size

          • 预分配多少(以字节为单位),默认为128M。

          • prealloc-align

          • 在预分配时,将文件长度与此值(以字节为单位)对齐,默认值为 1M。


        [QEMU]磁盘映像的评论 (共 条)

        分享到微博请遵守国家法律