跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 独立于超级管理程序的功能 / libguestfs
适用范围 SUSE Linux Enterprise Server 15 SP3

20 libguestfs

虚拟机由磁盘映像和定义文件构成。您可以手动访问和操作这些 Guest 组件(在常规超级管理程序进程外部),但这从本质上会给数据完整性造成危害和风险。libguestfs 是用于安全访问和修改虚拟机磁盘映像的一个 C 库和一组相应工具 — 这些操作在常规超级管理程序进程外部进行,却不会像手动编辑那样往往造成风险。

重要
重要

只有 AMD64/Intel 64 体系结构完全支持使用 libguestfs 工具。

20.1 VM Guest 操作概述

20.1.1 VM Guest 操作风险

磁盘映像和定义文件不过是 Linux 环境中另一种类型的文件,因此可以使用许多工具来访问、编辑这些文件以及向其中写入数据。如果正确使用,此类工具可成为 Guest 管理的重要组成部分。但是,即使是正确使用这些工具,也不一定能够杜绝风险。手动操作 Guest 磁盘映像时应考虑到如下风险:

  • 数据损坏:如果绕过虚拟化保护层,通过主机计算机或群集中的另一节点并发访问映像,可能会导致更改丢失或数据损坏。

  • 安全性:将磁盘映像挂载为循环设备需要 root 访问权限。如果映像不是循环挂载的,其他用户和进程就有可能可以访问磁盘内容。

  • 管理员错误:正确绕过虚拟化层需要对虚拟组件和工具有深入的了解。如果在做出更改后无法隔离映像或无法正确进行清理,可能会导致在恢复虚拟化控制后出现其他问题。

20.1.2 libguestfs 的设计用途

libguestfs C 库用于安全地创建、访问和修改虚拟机 (VM Guest) 磁盘映像。它还提供适用于 PerlPython、PHP(仅限 64 位计算机)和 Ruby 的其他语言绑定。libguestfs 无需 root 权限即可访问 VM Guest 磁盘映像,并提供多层防御机制来防范恶意磁盘映像。

libguestfs 提供许多用于访问和修改 VM Guest 磁盘映像与内容的工具。这些工具提供如下功能:查看和编辑 Guest 内部的文件、通过脚本对 VM Guest 进行更改、监视已用/可用磁盘空间统计信息、创建 Guest、执行 V2V 或 P2V 迁移、执行备份、克隆 VM Guest、格式化磁盘和调整磁盘大小。

警告
警告:最佳实践

切勿在实时虚拟机上使用 libguestfs 工具,这可能会导致 VM Guest 中发生磁盘损坏。libguestfs 工具会尝试阻止您这样做,但无法做到万无一失。

不过,大多数命令都具有 --ro(只读)选项。您可以使用此选项将命令关联到实时虚拟机。结果有时可能比较奇怪或不一致,但可以避免磁盘损坏的风险。

20.2 软件包安装

libguestfs 通过 4 个软件包提供:

  • libguestfs0:提供主 C 库

  • guestfs-data:包含启动映像时使用的设备文件(储存在 /usr/lib64/guestfs 中)

  • guestfs-tools:核心 guestfs 工具、手册页和 /etc/libguestfs-tools.conf 配置文件。

  • guestfs-winsupport:在 guestfs 工具中提供对 Windows 文件 Guest 的支持。仅当您需要处理 Windows Guest 时才需安装此软件包,例如,在将 Windows Guest 转换为 KVM 时。

要在系统上安装 guestfs 工具,请运行:

tux > sudo zypper in guestfs-tools

20.3 Guestfs 工具

20.3.1 修改虚拟机

guestfs-tools 软件包中的工具集用于访问和修改虚拟机磁盘映像。此功能通过用户所熟悉的、可提供内置保护措施来确保映像完整性的外壳界面提供。Guestfs 工具外壳会公开 guestfs API 的所有功能,并使用计算机上安装的软件包以及 /usr/lib64/guestfs 中的文件即时创建设备。

20.3.2 支持的文件系统和磁盘映像

Guestfs 工具支持各种文件系统,包括:

  • Ext2、Ext3、Ext4

  • Xfs

  • Btrfs

还支持多种磁盘映像格式:

  • raw

  • qcow2

警告
警告:不支持的文件系统

Guestfs 可能还支持 Windows* 文件系统(VFAT、NTFS)、BSD* 和 Apple* 文件系统,以及其他磁盘映像格式(VMDK、VHDX...)。但这些文件系统和磁盘映像格式在 SUSE Linux Enterprise Server 上不受支持。

20.3.3 virt-rescue

virt-rescue 类似于救援 CD,但用于虚拟机,且无需提供 CD。virt-rescue 为用户提供救援外壳和一些简单的恢复工具,可用于检查和更正虚拟机或磁盘映像中的问题。

tux > virt-rescue -a sles.qcow2
Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / are the rescue appliance.
You need to mount the guest's partitions under /sysroot
before you can examine them. A helper script for that exists:
mount-rootfs-and-do-chroot.sh /dev/sda2

><rescue>
[   67.194384] EXT4-fs (sda1): mounting ext3 file system
using the ext4 subsystem
[   67.199292] EXT4-fs (sda1): mounted filesystem with ordered data
mode. Opts: (null)
mount: /dev/sda1 mounted on /sysroot.
mount: /dev bound on /sysroot/dev.
mount: /dev/pts bound on /sysroot/dev/pts.
mount: /proc bound on /sysroot/proc.
mount: /sys bound on /sysroot/sys.
Directory: /root
Thu Jun  5 13:20:51 UTC 2014
(none):~ #

您现在是以救援模式运行 VM Guest 的:

(none):~ # cat /etc/fstab
devpts  /dev/pts          devpts  mode=0620,gid=5 0 0
proc    /proc             proc    defaults        0 0
sysfs   /sys              sysfs   noauto          0 0
debugfs /sys/kernel/debug debugfs noauto          0 0
usbfs   /proc/bus/usb     usbfs   noauto          0 0
tmpfs   /run              tmpfs   noauto          0 0
/dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1 / ext3 defaults 1 1

20.3.4 virt-resize

virt-resize 用于调整虚拟机磁盘的大小(增大或减小其总体大小),以及调整其中包含的任何分区的大小,或删除这些分区。

过程 20.1︰ 扩展磁盘

完整的分步操作示例:如何扩展虚拟机磁盘

  1. 首先,在关闭虚拟机的情况下,确定此虚拟机上可用的分区大小:

    tux > virt-filesystems --long --parts --blkdevs -h -a sles.qcow2
    Name       Type       MBR  Size  Parent
    /dev/sda1  partition  83   16G   /dev/sda
    /dev/sda   device     -    16G   -
  2. virt-resize 无法执行就地磁盘修改 — 必须有足够的空间用于储存调整大小后的输出磁盘。使用 truncate 命令创建适宜大小的文件:

    tux > truncate -s 32G outdisk.img
  3. 使用 virt-resize 调整磁盘映像的大小。virt-resize 要求为输入映像和输出映像指定两个必需的参数:

    tux > virt-resize --expand /dev/sda1 sles.qcow2 outdisk.img
    Examining sles.qcow2 ...
    **********
    Summary of changes:
    
    /dev/sda1: This partition will be resized from 16,0G to 32,0G.  The
        filesystem ext3 on /dev/sda1 will be expanded using the 'resize2fs'
        method.
    
    **********
    Setting up initial partition table on outdisk.img ...
    Copying /dev/sda1 ...
    ◐ 84%
    ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒════════⟧ 00:03
    Expanding /dev/sda1 using the 'resize2fs' method ...
    
    Resize operation completed with no errors.  Before deleting the old
    disk, carefully check that the resized disk boots and works correctly.
  4. 确认是否已正确调整映像大小:

    tux > virt-filesystems --long --parts --blkdevs -h -a outdisk.img
    Name       Type       MBR  Size  Parent
    /dev/sda1  partition  83   32G   /dev/sda
    /dev/sda   device     -    32G   -
  5. 使用新磁盘映像启动 VM Guest,确认其运行正常,然后删除旧映像。

20.3.5 其他 virt-* 工具

某些 guestfs 工具可以简化管理任务 — 例如查看和编辑文件,或者获取有关虚拟机的信息。

20.3.5.1 virt-filesystems

此工具用于报告有关磁盘映像或虚拟机中的文件系统、分区和逻辑卷的信息。

tux > virt-filesystems -l -a sles.qcow2
Name       Type        VFS   Label  Size         Parent
/dev/sda1  filesystem  ext3  -      17178820608  -

20.3.5.2 virt-ls

virt-ls 可列出虚拟机或磁盘映像中的文件名、文件大小、校验和、扩展属性等信息。可以指定多个目录名,在这种情况下,每个目录的输出将会串联起来。要列出某个 libvirt Guest 中的目录,请使用 -d 选项指定 Guest 名称。对于磁盘映像,请使用 -a 选项。

tux > virt-ls -h -lR -a sles.qcow2 /var/log/
d 0755        776 /var/log
- 0640          0 /var/log/NetworkManager
- 0644        23K /var/log/Xorg.0.log
- 0644        23K /var/log/Xorg.0.log.old
d 0700        482 /var/log/YaST2
- 0644        512 /var/log/YaST2/_dev_vda
- 0644         59 /var/log/YaST2/arch.info
- 0644        473 /var/log/YaST2/config_diff_2017_05_03.log
- 0644       5.1K /var/log/YaST2/curl_log
- 0644       1.5K /var/log/YaST2/disk_vda.info
- 0644       1.4K /var/log/YaST2/disk_vda.info-1
[...]

20.3.5.3 virt-cat

virt-cat 命令行工具用于显示命名虚拟机(或磁盘映像)中存在的文件的内容。可以指定多个文件名,在这种情况下,这些文件名会串联到一起。每个文件名都必须是以根目录(“/”)开头的完整路径。

tux > virt-cat -a sles.qcow2 /etc/fstab
devpts /dev/pts devpts mode=0620,gid=5 0 0
proc   /proc    proc   defaults        0 0

20.3.5.4 virt-df

virt-df 命令行工具用于显示虚拟机文件系统上的可用空间。与其他工具不同,它不仅会显示分配给虚拟机的磁盘大小,而且还会查看磁盘映像内部以显示实际使用的空间量。

tux > virt-df -a sles.qcow2
Filesystem                           1K-blocks       Used  Available  Use%
sles.qcow2:/dev/sda1                  16381864     520564   15022492  4%

20.3.5.5 virt-edit

virt-edit 命令行工具能够编辑驻留在命名虚拟机(或磁盘映像)中的文件。

20.3.5.6 virt-tar-in/out

virt-tar-in 可将未压缩的 TAR 存档解压缩到虚拟机磁盘映像或命名的 libvirt 域中。virt-tar-out 可将虚拟机磁盘映像目录打包成 TAR 存档。

tux > virt-tar-out -a sles.qcow2 /home homes.tar

20.3.5.7 virt-copy-in/out

virt-copy-in 可将本地磁盘中的文件和目录复制到虚拟机磁盘映像或命名的 libvirt 域中。virt-copy-out 可从虚拟机磁盘映像或命名的 libvirt 域中复制文件和目录。

tux > virt-copy-in -a sles.qcow2 data.tar /tmp/
virt-ls -a sles.qcow2 /tmp/
.ICE-unix
.X11-unix
data.tar

20.3.5.8 virt-log

virt-log 可显示命名的 libvirt 域、虚拟机或磁盘映像的日志文件。如果安装了 guestfs-winsupport 软件包,virt-log 还可显示 Windows 虚拟机磁盘映像的事件日志。

tux > virt-log -a windows8.qcow2
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Events>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"><System><Provider Name="EventLog"></Provider>
<EventID Qualifiers="32768">6011</EventID>
<Level>4</Level>
<Task>0</Task>
<Keywords>0x0080000000000000</Keywords>
<TimeCreated SystemTime="2014-09-12 05:47:21"></TimeCreated>
<EventRecordID>1</EventRecordID>
<Channel>System</Channel>
<Computer>windows-uj49s6b</Computer>
<Security UserID=""></Security>
</System>
<EventData><Data><string>WINDOWS-UJ49S6B</string>
<string>WIN-KG190623QG4</string>
</Data>
<Binary></Binary>
</EventData>
</Event>

...

20.3.6 guestfish

guestfish 是用于检查和修改虚拟机文件系统的外壳和命令行工具。它使用 libguestfs 并公开 guestfs API 的所有功能。

用法示例:

tux > guestfish -a disk.img <<EOF
run
list-filesystems
EOF
guestfish

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: 'help' for help on commands
      'man' to read the manual
      'quit' to quit the shell

><fs> add sles.qcow2
><fs> run
><fs> list-filesystems
/dev/sda1: ext3
><fs> mount /dev/sda1 /
 cat /etc/fstab
devpts  /dev/pts          devpts  mode=0620,gid=5 0 0
proc    /proc             proc    defaults        0 0
sysfs   /sys              sysfs   noauto          0 0
debugfs /sys/kernel/debug debugfs noauto          0 0
usbfs   /proc/bus/usb     usbfs   noauto          0 0
tmpfs   /run              tmpfs   noauto          0 0
/dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1 / ext3 defaults 1 1

20.3.7 将物理机转换为 KVM Guest

Libguestfs 提供了可帮助您将 Xen 虚拟机或物理机转换为 KVM Guest 的工具。第 17 章 “Xen 到 KVM 的迁移指南中介绍了从 Xen 转换到 KVM 的方案。下一节将介绍一个特殊用例:将裸机转换为 KVM 计算机。

SUSE Linux Enterprise Server 尚不支持将物理机转换为 KVM 计算机。此功能仅发布为技术预览版。

转换某个物理机需要收集有关该物理机的信息,并将这些信息传输到转换服务器。要实现此目的,需在计算机上运行一个使用 virt-p2vkiwi 工具准备的实时系统。

过程 20.2︰ 使用 virt-p2v
  1. 使用以下命令安装所需的软件包:

    tux > sudo zypper in virt-p2v kiwi-desc-isoboot
    注意
    注意

    这些步骤将会阐述如何创建一个用于创建可引导 DVD 的 ISO 映像。或者,您也可以改为创建 PXE 引导映像;有关使用 KIWI 构建 PXE 映像的详细信息,请参见 man virt-p2v-make-kiwi

  2. 创建 KIWI 配置:

    tux > virt-p2v-make-kiwi -o /tmp/p2v.kiwi

    -o 定义在何处创建 KIWI 配置。

  3. 如果需要,请编辑生成的配置中的 config.xml 文件。例如,在 config.xml 中调整实时系统的键盘布局。

  4. 使用 kiwi 构建 ISO 映像:

    tux > kiwi --build /tmp/p2v.kiwi1 \
         -d /tmp/build2 \
         --ignore-repos \
         --add-repo http://URL/TO/SLE/REPOSITORIES3 \
         --type iso

    1

    存放上一步中生成的 KIWI 配置的目录。

    2

    KIWI 将用于存放生成的 ISO 映像及其他中间构建结果的目录。

    3

    使用 zypper lr -d 显示的软件包储存库的 URL。

    请对每个储存库使用一个 --add-repo 参数。

  5. 在 DVD 或 USB 记忆棒上刻录 ISO。使用此类媒体引导要转换的计算机。

  6. 系统启动后,会要求您提供转换服务器的连接细节。此服务器是装有 virt-v2v 软件包的计算机。

    如果网络设置比 DHCP 客户端更复杂,请单击配置网络按钮打开 YaST 网络配置对话框。

    单击测试连接按钮以转到向导的下一页。

  7. 选择要转换的磁盘和网络接口,并定义 VM 数据,例如分配的 CPU 数量和内存量,以及虚拟机名称。

    注意
    注意

    如果不定义这些数据,创建的磁盘映像默认将采用 raw 格式。可以在输出格式字段中输入所需格式来更改此格式。

    可通过两种方法生成虚拟机:使用 locallibvirt 输出。第一种方法会将虚拟机磁盘映像和配置放到输出储存字段中定义的路径。然后,可以通过 virsh 使用这些内容来定义由 libvirt 处理的新 Guest。第二种方法将使用放在输出储存字段所定义的池中的磁盘映像,来创建由 libvirt 处理的新 Guest。

    单击开始转换开始该过程。

20.4 查错

20.4.1 Btrfs 相关的问题

对包含 Btrfs 根分区(在 SUSE Linux Enterprise Server 中为默认设置)的映像使用 guestfs 工具时,以下错误消息可能会显示:

tux > virt-ls -a /path/to/sles12sp2.qcow2 /
virt-ls: multi-boot operating systems are not supported

If using guestfish '-i' option, remove this option and instead
use the commands 'run' followed by 'list-filesystems'.
You can then mount file systems you want by hand using the
'mount' or 'mount-ro' command.

If using guestmount '-i', remove this option and choose the
filesystem(s) you want to see by manually adding '-m' option(s).
Use 'virt-filesystems' to see what file systems are available.

If using other virt tools, multi-boot operating systems won't work
with these tools.  Use the guestfish equivalent commands
(see the virt tool manual page).

发生此问题通常是因为 Guest 中存在多个快照。在此情况下,guestfs 不知道要引导哪个快照。要强制使用某个快照,请按如下所示使用 -m 参数:

tux > virt-ls -m /dev/sda2:/:subvol=@/.snapshots/2/snapshot -a /path/to/sles12sp2.qcow2 /

20.4.2 环境

在 libguestfs 设备中对问题进行查错时,可以使用环境变量 LIBGUESTFS_DEBUG=1 来启用调试消息。要以类似于 guestfish 命令的格式输出每个命令/API 调用,请使用环境变量 LIBGUESTFS_TRACE=1

20.4.3 libguestfs-test-tool

libguestfs-test-tool 是一个测试程序,用于检查基本 libguestfs 功能是否正常工作。它会列显 guestfs 环境的大量诊断消息和细节,然后创建一个测试映像并尝试将其启动。如果它成功运行到完成时,则测试将近结束时应该会显示以下消息:

===== TEST FINISHED OK =====

20.5 更多信息