只有 AMD64/Intel 64 体系结构完全支持使用 libguestfs 工具。
19.1 VM Guest 操作概述 #
19.1.1 VM Guest 操作风险 #
磁盘映像和定义文件不过是 Linux 环境中另一种类型的文件,因此可以使用许多工具来访问、编辑这些文件以及向其中写入数据。如果正确使用,此类工具可成为 Guest 管理的重要组成部分。但是,即使是正确使用这些工具,也不一定能够杜绝风险。手动操作 Guest 磁盘映像时应考虑到如下风险:
数据损坏:如果绕过虚拟化保护层,通过主机计算机或群集中的另一节点并发访问映像,可能会导致更改丢失或数据损坏。
安全性:将磁盘映像挂载为循环设备需要 root 访问权限。如果映像不是循环挂载的,其他用户和进程就有可能可以访问磁盘内容。
管理员错误:正确绕过虚拟化层需要对虚拟组件和工具有深入的了解。如果在做出更改后无法隔离映像或无法正确进行清理,可能会导致在恢复虚拟化控制后出现其他问题。
19.1.2 libguestfs 的设计用途 #
libguestfs C 库用于安全地创建、访问和修改虚拟机 (VM Guest) 磁盘映像。它还提供适用于 Perl、Python、PHP(仅限 64 位计算机)和 Ruby 的其他语言绑定。libguestfs 无需 root 权限即可访问 VM Guest 磁盘映像,并提供多层防御机制来防范恶意磁盘映像。
libguestfs 提供许多用于访问和修改 VM Guest 磁盘映像与内容的工具。这些工具提供如下功能:查看和编辑 Guest 内部的文件、通过脚本对 VM Guest 进行更改、监视已用/可用磁盘空间统计信息、创建 Guest、执行 V2V 或 P2V 迁移、执行备份、克隆 VM Guest、格式化磁盘和调整磁盘大小。
切勿在实时虚拟机上使用 libguestfs 工具,这可能会导致 VM Guest 中发生磁盘损坏。libguestfs 工具会尝试阻止您这样做,但无法做到万无一失。
但是,大多数命令都具有 --ro
(只读)选项。使用此选项可以在实时虚拟机上运行命令。结果可能比较奇怪或不一致,但可以避免磁盘损坏的风险。
19.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 工具,请运行:
>
sudo
zypper in guestfs-tools
19.3 Guestfs 工具 #
19.3.1 修改虚拟机 #
guestfs-tools 软件包中的工具集用于访问和修改虚拟机磁盘映像。此功能通过用户所熟悉的、可提供内置保护措施来确保映像完整性的外壳界面提供。Guestfs 工具外壳会公开 guestfs API 的所有功能,并使用计算机上安装的软件包以及 /usr/lib64/guestfs
中的文件即时创建设备。
19.3.2 支持的文件系统和磁盘映像 #
Guestfs 工具支持多种文件系统,包括:
Ext2、Ext3、Ext4
Xfs
Btrfs
还支持多种磁盘映像格式:
raw
qcow2
Guestfs 可能还支持 Windows* 文件系统(VFAT、NTFS)、BSD* 和 Apple* 文件系统,以及其他磁盘映像格式(VMDK、VHDX...)。但这些文件系统和磁盘映像格式在 SUSE Linux Enterprise Server 上不受支持。
19.3.3 virt-rescue
#
virt-rescue
类似于救援 CD,但用于虚拟机,且无需提供 CD。virt-rescue 为用户提供救援外壳和多种简单的恢复工具,可用于检查和更正虚拟机或磁盘映像中的问题。
>
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
19.3.4 virt-resize
#
virt-resize
用于调整虚拟机磁盘的大小(增大或减小其总体大小),以及调整其中包含的任何分区的大小,或删除这些分区。
完整的分步操作示例:如何扩展虚拟机磁盘
首先,在关闭虚拟机的情况下,确定此虚拟机上可用的分区大小:
>
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 -virt-resize
无法执行就地磁盘修改 — 必须有足够的空间用于存储调整大小后的输出磁盘。使用truncate
命令创建适当大小的文件:>
truncate -s 32G outdisk.img使用
virt-resize
调整磁盘映像的大小。virt-resize
要求为输入映像和输出映像指定两个必需的参数:>
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.确认是否已正确调整映像大小:
>
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 -使用新磁盘映像启动 VM Guest,确认其运行正常,然后删除旧映像。
19.3.5 其他 virt-* 工具 #
某些 guestfs 工具可以简化管理任务 — 例如查看和编辑文件,或者获取有关虚拟机的信息。
19.3.5.1 virt-filesystems
#
此工具用于报告有关磁盘映像或虚拟机中的文件系统、分区和逻辑卷的信息。
>
virt-filesystems -l -a sles.qcow2
Name Type VFS Label Size Parent
/dev/sda1 filesystem ext3 - 17178820608 -
19.3.5.2 virt-ls
#
virt-ls
可列出虚拟机或磁盘映像中的文件名、文件大小、校验和、扩展属性等信息。可以指定多个目录名,在这种情况下,每个目录的输出将会串联起来。要列出某个 libvirt Guest 中的目录,请使用 -d
选项指定 Guest 名称。对于磁盘映像,请使用 -a
选项。
>
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
[...]
19.3.5.3 virt-cat
#
virt-cat
命令行工具用于显示命名虚拟机(或磁盘映像)中存在的文件的内容。可以指定多个文件名,在这种情况下,这些文件名会串联到一起。指定每个文件名时,必须提供以根目录 (/
) 开头的绝对路径。
>
virt-cat -a sles.qcow2 /etc/fstab
devpts /dev/pts devpts mode=0620,gid=5 0 0
proc /proc proc defaults 0 0
19.3.5.4 virt-df
#
virt-df
命令行工具用于显示虚拟机文件系统上的可用空间。与其他工具不同,它不仅会显示分配给虚拟机的磁盘大小,而且还会查看磁盘映像内部以显示使用的空间量。
>
virt-df -a sles.qcow2
Filesystem 1K-blocks Used Available Use%
sles.qcow2:/dev/sda1 16381864 520564 15022492 4%
19.3.5.5 virt-edit
#
virt-edit
命令行工具能够编辑驻留在命名虚拟机(或磁盘映像)中的文件。
19.3.5.6 virt-tar-in/out
#
virt-tar-in
可将未压缩的 TAR 存档解压缩到虚拟机磁盘映像或命名的 libvirt 域中。virt-tar-out
可将虚拟机磁盘映像目录打包成 TAR 存档。
>
virt-tar-out -a sles.qcow2 /home homes.tar
19.3.5.7 virt-copy-in/out
#
virt-copy-in
可将本地磁盘中的文件和目录复制到虚拟机磁盘映像或命名的 libvirt 域中。virt-copy-out
可从虚拟机磁盘映像或命名的 libvirt 域中复制文件和目录。
>
virt-copy-in -a sles.qcow2 data.tar /tmp/>
virt-ls -a sles.qcow2 /tmp/ .ICE-unix .X11-unix data.tar
19.3.5.8 virt-log
#
virt-log
可显示命名的 libvirt 域、虚拟机或磁盘映像的日志文件。如果安装了软件包 guestfs-winsupport,则 virt-log 还可显示 Windows 虚拟机磁盘映像的事件日志。
>
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>
...
19.3.6 guestfish
#
guestfish
是用于检查和修改虚拟机文件系统的外壳和命令行工具。它使用 libguestfs 并公开 guestfs API 的所有功能。
用法示例:
>
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
19.3.7 将物理机转换为 KVM Guest #
Libguestfs 提供了可帮助您将 Xen 虚拟机或物理机转换为 KVM Guest 的工具。第 16 章 “Xen 到 KVM 的迁移指南”中介绍了从 Xen 转换到 KVM 的方案。下一节将介绍一个特殊用例:将裸机转换为 KVM 计算机。
SUSE Linux Enterprise Server 尚不支持将物理机转换为 KVM 计算机。此功能仅发布为技术预览版。
转换某个物理机需要收集有关该物理机的信息,并将这些信息传输到转换服务器。要实现此目的,需在计算机上运行一个使用 virt-p2v
和 KIWI 工具准备的实时系统。
使用以下命令安装所需的软件包:
>
sudo
zypper in virt-p2v kiwi-desc-isoboot注意这些步骤将会阐述如何创建一个 ISO 映像用于创建可引导 DVD。或者,您也可以改为创建 PXE 引导映像;有关使用 KIWI 构建 PXE 映像的详细信息,请参见
man virt-p2v-make-kiwi
。创建 KIWI 配置:
>
virt-p2v-make-kiwi -o /tmp/p2v.kiwi-o
定义在何处创建 KIWI 配置。如果需要,请编辑生成的配置中的
config.xml
文件。例如,在config.xml
中调整实时系统的键盘布局。使用
kiwi
构建 ISO 映像:>
kiwi --build /tmp/p2v.kiwi1 \ -d /tmp/build2 \ --ignore-repos \ --add-repo http://URL/TO/SLE/REPOSITORIES3 \ --type iso在 DVD 或 USB 记忆棒上刻录 ISO。使用此类媒体引导要转换的计算机。
系统启动后,请输入转换服务器的连接细节。此服务器是装有
virt-v2v
软件包的计算机。如果网络设置比 DHCP 客户端更复杂,请单击
按钮打开 YaST 网络配置对话框。单击
按钮以转到向导的下一页。选择要转换的磁盘和网络接口,并定义 VM 数据,例如分配的 CPU 数量和内存量,以及虚拟机名称。
注意如果不定义这些数据,创建的磁盘映像默认将采用 raw 格式。可以在 字段中输入所需格式来更改此格式。
可通过两种方法生成虚拟机:使用 local 或 libvirt 输出。第一种方法将虚拟机磁盘映像和配置放到 字段中定义的路径。然后,可以通过
virsh
使用这些内容来定义由 libvirt 处理的新 Guest。第二种方法使用放在 字段所定义的池中的磁盘映像,来创建由 libvirt 处理的新 Guest。单击
开始该过程。
19.4 查错 #
19.4.1 Btrfs 相关的问题 #
对包含 Btrfs 根分区(在 SUSE Linux Enterprise Server 中为默认设置)的映像使用 guestfs 工具时,以下错误消息可能会显示:
>
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
参数:
>
virt-ls -m /dev/sda2:/:subvol=@/.snapshots/2/snapshot -a /path/to/sles12sp2.qcow2 /
19.4.2 环境 #
在 libguestfs 设备中对问题进行查错时,可以使用环境变量 LIBGUESTFS_DEBUG=1 来启用调试消息。要以类似于 guestfish 命令的格式输出每个命令/API 调用,请使用环境变量 LIBGUESTFS_TRACE=1。
19.4.3 libguestfs-test-tool
#
libguestfs-test-tool
是一个测试程序,用于检查基本 libguestfs 功能是否正常工作。它会列显 guestfs 环境的大量诊断消息和细节,然后创建一个测试映像并尝试将其启动。如果它成功运行到完成时,则测试将近结束时应该会显示以下消息:
===== TEST FINISHED OK =====