libguestfs-tools 虚拟机磁盘管理工具学习

发布于:2025-07-25 ⋅ 阅读:(23) ⋅ 点赞:(0)

libguestfs-tools 介绍

libguestfs 官网地址:https://libguestfs.org/

libguestfs 是一套用于访问和修改虚拟机(VM)磁盘镜像的工具 。您可以使用它来 查看和编辑虚拟机中的文件, 编写对虚拟机的更改脚本, 监控磁盘使用/空闲统计 , 创建虚拟机 ,P2V, V2V,执行备份、克隆虚拟机、构建虚拟机、格式化磁盘、调整磁盘大小等更多操作。

libguestfs 可以访问几乎任何可想象的磁盘镜像 。它可以安全地访问——无需 root 权限,并有多层防御机制来抵御恶意磁盘镜像。它可以访问远程机器上的磁盘镜像或 CD/USB 驱动器上的磁盘镜像。它可以访问 VMware 和 Hyper-V 等专有系统。

所有这些功能都可以通过一个可脚本化的 shell 称为 guestfish,或一个交互式救援 shellvirt-rescue 来使用。

libguestfs-tools安装

[root@kvm2 ~]# yum -y install libguestfs-tools libguestfs-tools-c
  • libguestfs-tools:提供了基本的虚拟机磁盘管理功能
  • libguestfs-tools-c:提供了更高级的工具和库

查看这两个包分别提供了什么工具

[root@kvm1 ~]# rpm -qa|grep libguestfs-tools
libguestfs-tools-c-1.40.2-28.module_el8.5.0+821+97472045.x86_64
libguestfs-tools-1.40.2-28.module_el8.5.0+821+97472045.noarch
[root@kvm1 ~]# rpm -ql libguestfs-tools-c-1.40.2-28.module_el8.5.0+821+97472045.x86_64 | grep /usr/bin
/usr/bin/guestfish					# 管理磁盘的交互式 Shell;可以用来直接操作虚拟机的磁盘映像,执行各种磁盘操作,如分区、格式化、挂载、文件操作等。
/usr/bin/guestmount					# 将虚拟机的磁盘映像挂载到宿主机的文件系统中;方便直接访问虚拟机中的文件,而无需启动虚拟机,支持多种虚拟机磁盘镜像文件.qcow2、.vmdk 等
/usr/bin/guestunmount				# 卸载由 guestmount 挂载的虚拟机磁盘映像;确保安全地卸载挂载点,避免数据损坏。
/usr/bin/virt-alignment-scan		# 扫描虚拟机磁盘映像中的分区对齐问题;帮助优化磁盘性能,避免由于分区未对齐导致的性能问题。
/usr/bin/virt-builder				# 快速创建预配置的虚拟机磁盘映像;用于快速部署虚拟机,支持多种操作系统模板。
/usr/bin/virt-builder-repository	# 管理 virt-builder 的模板仓库;用于更新和管理可用的操作系统模板。
/usr/bin/virt-cat					# 查看虚拟机中的文件内容;用于快速查看虚拟机内部的文件,而无需挂载磁盘。
/usr/bin/virt-copy-in				# 将文件从宿主机复制到虚拟机磁盘映像中;用于向虚拟机中添加文件或目录。
/usr/bin/virt-copy-out				# 将文件从虚拟机磁盘映像中复制到宿主机;用于从虚拟机中提取文件或目录。
/usr/bin/virt-customize				# 对虚拟机磁盘映像进行自定义操作;支持多种操作,如安装软件包、修改配置文件等。
/usr/bin/virt-df					# 查看虚拟机磁盘的使用情况;类似于 df 命令,但用于虚拟机磁盘映像。
/usr/bin/virt-diff					# 比较虚拟机磁盘映像中的文件差异;用于检测虚拟机磁盘映像之间的文件变化。
/usr/bin/virt-edit					# 编辑虚拟机中的文件;用于直接修改虚拟机内部的文件内容。
/usr/bin/virt-filesystems			# 列出虚拟机磁盘映像中的文件系统;用于查看虚拟机中的分区和文件系统信息。
/usr/bin/virt-format				# 格式化虚拟机磁盘映像;用于创建新的文件系统或重新格式化现有磁盘。
/usr/bin/virt-get-kernel			# 提取虚拟机中的内核文件;用于获取虚拟机的内核文件,便于分析或备份。
/usr/bin/virt-index-validate		# 验证 virt-builder 的模板索引文件;确保模板索引文件的完整性和正确性。
/usr/bin/virt-inspector				# 检测虚拟机的操作系统和配置信息;用于获取虚拟机的详细信息,如操作系统类型、版本、安装的软件包等。
/usr/bin/virt-log					# 查看虚拟机的日志文件;用于获取虚拟机的系统日志,便于故障排查。
/usr/bin/virt-ls					# 列出虚拟机中的目录内容;类似于 ls 命令,但用于虚拟机磁盘映像。
/usr/bin/virt-make-fs				# 创建一个新的文件系统映像;用于创建新的文件系统,例如用于备份或测试。
/usr/bin/virt-rescue				# 启动一个救援 Shell,用于修复损坏的虚拟机磁盘映像;在虚拟机无法启动时,用于修复文件系统或恢复数据。
/usr/bin/virt-resize				# 调整虚拟机磁盘映像的大小;用于扩展或缩小虚拟机磁盘映像的大小。
/usr/bin/virt-sparsify				# 将虚拟机磁盘映像转换为稀疏文件格式;于优化磁盘映像的存储,减少文件大小。
/usr/bin/virt-sysprep				# 清理虚拟机磁盘映像,使其可用于克隆;用于删除敏感信息、清理日志文件、重置网络配置等。
/usr/bin/virt-tail					# 查看虚拟机中的文件尾部内容;类似于 tail 命令,但用于虚拟机磁盘映像。
/usr/bin/virt-tar-in				# 将 将 tar 包从宿主机解压到虚拟机磁盘映像中;用于批量添加文件到虚拟机。
/usr/bin/virt-tar-out				# 将虚拟机中的目录打包为 tar 文件;用于从虚拟机中提取目录并打包。
[root@kvm1 ~]# rpm -ql libguestfs-tools-1.40.2-28.module_el8.5.0+821+97472045.noarch | grep /usr/bin
/usr/bin/virt-win-reg				# 是一个用于操作 Windows 虚拟机注册表的工具,属于 libguestfs-tools 工具集的一部分。它主要用于导出和合并 Windows 注册表项,而无需启动虚拟机

libguestfs-tools 工具实践

官网有给出每个工具的使用文档,在文档那一栏,并且你使用 man 也可以获取手册。
在这里插入图片描述

我准备了一台虚拟机用来测试


[root@kvm1 ~]# virsh list
 Id   Name        State
---------------------------
 1    centos7.0   running

[root@kvm1 ~]# virsh dumpxml centos7.0 | grep -A 10 '<disk type' |grep centos7.0
      <source file='/var/lib/libvirt/images/centos7.0.qcow2' index='2'/>

1. guestfish

在使用guestfish的时候需要注意:在运行的虚拟机上使用多个磁盘编辑工具时,可能会存在危险,可能导致磁盘损坏。在使用此命令之前,必须先关闭虚拟机,并且不能同时编辑磁盘映像。
若磁盘映像或虚拟机处于运行状态,请使用 --ro(只读)选项来安全地使用“guestfish”。如果同时进行其他操作,可能会出现奇怪或不一致的结果,但使用此选项则不会造成磁盘损坏。

关闭虚拟机

[root@kvm1 ~]# virsh destroy centos7.0

以只读的形式进入到磁盘映像

以只读的形式进入磁盘映像,即使对文件有修改,删除,在退出后磁盘映像会复原。 以非只读的方式进入被被修改后会永久生效。

[root@kvm1 ~]# guestfish --ro -a /var/lib/libvirt/images/centos7.0.qcow2  # 以只读的形式进入到磁盘映像
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> run					# 启动 guestfish 的文件系统操作环境,它会加载磁盘映像,并准备好后续的文件系统操作。
><fs> list-filesystems		# 列出磁盘映像中所有已识别的文件系统,每个分区的设备路径及其对应的文件系统类型。
/dev/sda1: xfs
/dev/sda2: xfs
><fs> mount /dev/sda1 /		# 将指定的分区挂载到指定的挂载点。
><fs> ls /
.vmlinuz-3.10.0-1160.el7.x86_64.hmac
System.map-3.10.0-1160.el7.x86_64
config-3.10.0-1160.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-ac503bb91fba4b0ca462cbc1cff97b8b.img
initramfs-3.10.0-1160.el7.x86_64.img
symvers-3.10.0-1160.el7.x86_64.gz
vmlinuz-0-rescue-ac503bb91fba4b0ca462cbc1cff97b8b
vmlinuz-3.10.0-1160.el7.x86_64
><fs> umount /
><fs> mount /dev/sda2 /
><fs> ls /
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
><fs> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
test:x:1000:1000::/home/test:/bin/bash

更多操作参考man 帮助。

2. guestmount

在运行中的虚拟机上以写入模式使用“guestmount”,或者与其它磁盘编辑工具同时使用时,可能会存在危险,可能导致磁盘损坏。在使用此命令之前,必须先关闭虚拟机,并且不能同时编辑磁盘映像。最好是使用--ro进入到磁盘映像。

[root@kvm1 ~]# guestmount -a /var/lib/libvirt/images/centos7.0.qcow2 -i /media
[root@kvm1 ~]# ls  /media/
config-3.10.0-1160.el7.x86_64  initramfs-0-rescue-ac503bb91fba4b0ca462cbc1cff97b8b.img  vmlinuz-0-rescue-ac503bb91fba4b0ca462cbc1cff97b8b
efi                            initramfs-3.10.0-1160.el7.x86_64.img                     vmlinuz-3.10.0-1160.el7.x86_64
grub                           symvers-3.10.0-1160.el7.x86_64.gz
grub2                          System.map-3.10.0-1160.el7.x86_64
[root@kvm1 ~]# mount | grep /media
/dev/fuse on /media type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
[root@kvm1 ~]# guestunmount /media/
[root@kvm1 ~]# mount | grep /media
  • -a:指定映像文件路径
  • -m:指定要挂载的分区设备名称

使用 umount 同样可以卸载。

通过上述可以看出将虚拟映像的 /boot分区挂载到了本机的 /medis,并且可读写,使用guestunmount 可以卸载分区,映像文件的设备名称是/dev/fuse

自动检测文件系统并挂载:

 [root@kvm1 ~]# guestmount  -a /var/lib/libvirt/images/centos7.0.qcow2 -i /media/ --ro
 [root@kvm1 /]# ls /media/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@kvm1 /]# mount | grep /media
/dev/fuse on /media type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0)

虽然权限上面写的还是rw,但是已经是只读系统,不能删除了。

[root@kvm1 /]# rm -rf  /media/opt/iperf-3.19
rm: cannot remove '/media/opt/iperf-3.19/.github/CONTRIBUTING.md': Read-only file system
rm: cannot remove '/media/opt/iperf-3.19/.github/ISSUE_TEMPLATE.md': Read-only file system
rm: cannot remove '/media/opt/iperf-3.19/.github/PULL_REQUEST_TEMPLATE.md': Read-only file system
rm: cannot remove '/media/opt/iperf-3.19/.github/workflows/test.yml': Read-only file system

3. virt-alignment-scan

检查分区是否对齐,对齐返回OK

[root@kvm1 /]# virt-alignment-scan -a /var/lib/libvirt/images/centos7.0.qcow2
/dev/sda1      1048576         1024K   ok
/dev/sda2    315621376         1024K   ok

4. virt-builder

制作镜像模板:不怎么使用!
可以参考:https://blog.csdn.net/qq_50247813/article/details/149576859

5. virt-cat

查看虚拟机内部的文件,无需虚拟机启动,可一次性打开多个文件
-d : 指定虚拟机名称
-a : 指定磁盘映像名称

[root@kvm1 ~]# virt-cat -d centos7.0 /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@kvm1 ~]# virt-cat -d centos7.0 /etc/redhat-release  /etc/os-release
CentOS Linux release 7.9.2009 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@kvm1 ~]# virt-cat -a /var/lib/libvirt/images/centos7.0.qcow2 /etc/redhat-release /etc/os-release
CentOS Linux release 7.9.2009 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

指定磁盘的的速度会快很多。

6. virt-copy-in 和 virt-copy-out

在运行中的虚拟机上使用“virt-copy-in”和“virt-copy-out”功能,或者与其它磁盘编辑工具同时使用,可能会带来危险,有可能导致磁盘损坏。在使用此命令之前,必须先关闭虚拟机,并且不能同时编辑磁盘映像文件。

virt-copy-in:将文件从宿主机复制到虚拟机。
virt-copy-out:将文件从虚拟机复制到宿主机。

-d: 指定虚拟机名称
-a:指定虚拟机的磁盘映像地址

[root@kvm1 opt]# virt-copy-out -d centos7.0 /etc ./
[root@kvm1 opt]# virt-copy-out -a /var/lib/libvirt/images/centos7.0.qcow2  /etc/passwd ./
[root@kvm1 opt]# echo "this is test aaa" > test.txt
[root@kvm1 opt]# virt-copy-in -d centos7.0 test.txt /opt
[root@kvm1 opt]# virt-cat -d centos7.0 /opt/test.txt
this is test aaa
[root@kvm1 opt]# echo "this is test bbb" > test.txt
[root@kvm1 opt]# virt-copy-in -a /var/lib/libvirt/images/centos7.0.qcow2 test.txt /opt
[root@kvm1 opt]# virt-cat -a /var/lib/libvirt/images/centos7.0.qcow2 /opt/test.txt
this is test bbb

复制的时候,好像不支持通配符。

7. virt-customize

必须关闭虚拟机后才能使用。

virt-customize 可以通过安装软件包、编辑配置文件等方式自定义虚拟机(磁盘映像)。
virt-customize 会直接修改客户机或磁盘映像。客户机必须处于关机状态。如果您想保留客户机现有的内容,必须先对磁盘进行快照、复制或克隆。

示例:
a. 在虚拟机中安装指定的软件包:

[root@kvm1 ~]# virt-customize -d centos7.0 --install vim
[   0.0] Examining the guest ...
[   9.2] Setting a random seed
[   9.3] Installing packages: vim
[  48.6] Finishing off

b. 设置root密码:

[root@kvm1 ~]# virt-customize -d centos7.0 --root-password password:123456	# 设置密码为123456
[   0.0] Examining the guest ...
[   9.8] Setting a random seed
[   9.9] Setting passwords
[  11.4] Finishing off

c. 关闭防火墙和selinux:
关闭防火墙:

[root@kvm1 ~]# virt-customize -d centos7.0 --run-command "systemctl stop firewalld"
[root@kvm1 ~]# virt-customize -d centos7.0 --run-command "systemctl disable firewalld"

关闭selinux:

[root@kvm1 ~]# virt-customize -d centos7.0 --run-command "sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config"
  • --run-command:在虚拟机执行命令

d. 设置虚拟机的时区:

[root@kvm1 ~]# virt-customize -d centos7.0 --timezone "Asia/Shanghai"  # 设置时区为亚洲上海

e. 注入 SSH 公钥:
将用户的 SSH 公钥注入到虚拟机中:

[root@kvm1 ~]# virt-customize -d centos7.0 --ssh-inject root:file:/root/.ssh/id_rsa.pub # 将本地的公钥注入到虚拟机root用户的authorized_keys文件中

f. 将本地文件上传到虚拟机中:
将本地的CentOS-Base.repo上传到虚拟机

[root@kvm1 ~]# virt-customize -d centos7.0 --upload /etc/yum.repos.d/CentOS-Base.repo:/etc/yum.repos.d/CentOS-Base.repo

8. virt-df

查看其 各分区/文件系统的已用/可用空间,不加参数默认显示所有虚拟机的分区使用情况,无需启动虚拟机。

[root@kvm1 ~]# virt-df
Filesystem                           1K-blocks       Used  Available  Use%
centos7.0:/dev/sda1                     303780     101320     202460   34%
centos7.0:/dev/sda2                   20653056    2015320   18637736   10%
centos7.0-clone:/dev/sda1               303780     101320     202460   34%
centos7.0-clone:/dev/sda2             20653056    1367068   19285988    7%
[root@kvm1 ~]# virt-df -a /var/lib/libvirt/images/centos7.0.qcow2

查看指定虚拟机分区使用情况
-d: 指定虚拟机名称
-a: 指定磁盘映像路径

[root@kvm1 ~]# virt-df -a /var/lib/libvirt/images/centos7.0.qcow2
Filesystem                           1K-blocks       Used  Available  Use%
centos7.0.qcow2:/dev/sda1               303780     101320     202460   34%
centos7.0.qcow2:/dev/sda2             20653056    2015320   18637736   10%
[root@kvm1 ~]# virt-df -d centos7.0
Filesystem                           1K-blocks       Used  Available  Use%
centos7.0:/dev/sda1                     303780     101320     202460   34%
centos7.0:/dev/sda2                   20653056    2015320   18637736   10%

将输出重定向到CSV格式导出

[root@kvm1 ~]# virt-df --csv -a /var/lib/libvirt/images/centos7.0.qcow2  > disk_usage.csv
[root@kvm1 ~]# cat disk_usage.csv
VirtualMachine,Filesystem,1K-blocks,Used,Available,Use%
centos7.0.qcow2,/dev/sda1,303780,101320,202460,33.4
centos7.0.qcow2,/dev/sda2,20653056,2015320,18637736,9.8

9. virt-diff

“virt-diff”可列出两个虚拟机或磁盘映像中文件之间的差异。其常见应用场景是:先对虚拟机进行一段时间的运行,然后创建外部快照,接着运行该虚拟机,最后使用此工具来展示新虚拟机状态与旧快照之间的差异变化。
该工具能够从虚拟机或磁盘映像中找出文件名、文件大小、校验和、扩展属性、文件内容等方面的差异。
然而,它不会检查引导加载程序、分区之间的未使用空间或文件系统内的“隐藏”区域等。换句话说,它并非安全或取证工具。

使用方法:
virt-diff -d oldguest -D newguest :指定新旧的虚拟机名
virt-diff -a old.img -A new.img : 指定新旧虚拟机磁盘映像名称

实验一: 将centos7.0虚拟机克隆出一个新的虚拟机,并修改一下进行对比

克隆虚拟机时,必须关机或者挂起,使用virt-diff会以只读的方式比较,不需要虚拟机关机。

[root@kvm1 ~]# virsh list --all
 Id   Name        State
----------------------------
 -    centos7.0   shut off

[root@kvm1 ~]# virt-clone --original centos7.0 --auto-clone
[root@kvm1 ~]# virsh list --all
 Id   Name              State
----------------------------------
 -    centos7.0         shut off
 -    centos7.0-clone   shut off

centos7.0虚拟机 /root 目录下面添加一个文件进行对比

[root@kvm1 ~]# echo "this is test" > test.txt
[root@kvm1 ~]# virt-copy-in -d centos7.0 test.txt /root
[root@kvm1 ~]# virt-cat -d centos7.0  /root/test.txt
this is test

使用virt-diff 对比 centos7.0centos7.0-clone 两台虚拟机的差异。

[root@kvm1 ~]# virt-diff -d centos7.0 -D centos7.0-clone
- d 0550        247 /root
+ d 0550        231 /root
# changed: st_size
- - 0644         13 /root/test.txt

- d 0550 : - 代表旧盘 -d centos7.0
+ d 0550 : +代表新盘 -D centos7.0-clone

从上图可以看出旧盘多了一个/root/test.txt文件。

10. virt-edit

在运行中的虚拟机上使用“virt-edit”,或者与其他磁盘编辑工具同时使用,可能会很危险,有可能导致磁盘损坏。这
在使用此命令之前,虚拟机必须关闭,并且磁盘映像不得同时进行编辑。

virt-edit 是 libguestfs-tools 套件里的“离线编辑器”,能够在 不启动虚拟机 的情况下,直接打开并修改虚拟机(或磁盘镜像)内的任何文本文件,功能类似于在虚拟机里执行 vi / nano,但是不能创建文件

使用方法:
virt-edit -d <虚拟机名> <绝对路径>
virt-edit -a <磁盘文件> <绝对路径>

查看centos7.0 /root下面有哪些文件

[root@kvm1 ~]# virt-ls -d centos7.0 /root
.bash_history
.bash_logout
.bash_profile
.bashrc
.cshrc
.pki
.rediscli_history
.ssh
.tcshrc
anaconda-ks.cfg
redis-6.2.19
redis-6.2.19.tar.gz
test.txt
[root@kvm1 ~]# virt-cat -d centos7.0 /root/test.txt
this is test

virt-ls : 查看虚拟机目录文件,使用方法:virt-ls -d 虚拟机名称,virt-ls -a 磁盘目录名称。

修改test.txt文件并保存

[root@kvm1 ~]# virt-cat -d centos7.0  /root/test.txt
aaaaaaaaaaa
this is test

11. virt-filesystems

virt-filesystems 是 libguestfs 工具集中用于查看磁盘镜像或虚拟机内部文件系统、分区、逻辑卷(LVM)等信息的命令行工具,常用于脚本自动化、镜像分析或配合 virt-resize 等工具使用。

使用方法 virt-filesystems -d 虚拟机,virt-filesystems -a 磁盘路径

[root@kvm1 ~]# virt-filesystems -a /var/lib/libvirt/images/centos7.0.qcow2
/dev/sda1
/dev/sda2
[root@kvm1 ~]# virt-filesystems -d centos7.0 -l
Name       Type        VFS  Label  Size         Parent
/dev/sda1  filesystem  xfs  -      314572800    -
/dev/sda2  filesystem  xfs  -      21159215104  -
[root@kvm1 ~]# virt-filesystems --long --parts --blkdevs -h  -a /var/lib/libvirt/images/centos7.0.qcow2
Name       Type       MBR  Size  Parent
/dev/sda1  partition  83   300M  /dev/sda
/dev/sda2  partition  83   25G   /dev/sda
/dev/sda   device     -    25G   -
  • --long/l:长输出
  • --parts:显示分区
  • -h :长格式输出中的可读性良好的尺寸值
  • --blkdevs:列出虚拟机磁盘中的所有块设备,包括分区和逻辑卷。它会显示设备的名称、类型、大小等信息。

12. virt-format

这个在使用此命令之前,必须先关闭虚拟机,并且不能同时编辑磁盘映像文件。

将已有磁盘镜像(或磁盘设备)擦除并格式化为空白磁盘的命令。

常用选项:

选项 示例 说明
-a -a disk.qcow2 指定磁盘镜像或设备
--filesystem=ext4 --filesystem=ext4 在磁盘上创建指定类型的文件系统
--lvm --lvm=/dev/vg/lv 创建 LVM 逻辑卷
--label=ROOT --label=ROOT 设置文件系统标签
--format=qcow2 --format=qcow2 强制指定磁盘格式,避免自动检测

使用示例:

[root@kvm1 ~]# virt-filesystems -a /var/lib/libvirt/images/centos7.0-clone.qcow2 -l
Name       Type        VFS  Label  Size         Parent
/dev/sda1  filesystem  xfs  -      314572800    -
/dev/sda2  filesystem  xfs  -      21159215104  -
[root@kvm1 ~]# virt-format -a /var/lib/libvirt/images/centos7.0-clone.qcow2
[root@kvm1 ~]# virt-filesystems -a /var/lib/libvirt/images/centos7.0-clone.qcow2 -l
Name  Type  VFS  Label  Size  Parent

可以看出文件系统已经没有了,被格式化了。

创建ext4 文件系统并设置文件系统标签

[root@kvm1 ~]# virt-filesystems -a /var/lib/libvirt/images/centos7.0-clone.qcow2 -l
Name       Type        VFS   Label  Size         Parent
/dev/sda1  filesystem  ext4  ROOT   21474705920  -

virt-format 只是帮你把磁盘“擦干净”并打好文件系统标记,里面不会有文件,真正让虚拟机用起来的就是 virt-install --import 或 virt-manager 的“导入”功能。

13. virt-get-kernel

用来“不开机”就把虚拟机磁盘或 libvirt 域里的内核(vmlinuz)与 initramfs 提取出来**的小工具,常用于 PXE 启动、救援、内核版本确认等场景。

使用方法:
virt-get-kernel -a <磁盘镜像路径> [选项]
virt-get-kernel -d <虚拟机名称/UUID> [选项]

选项 示例 说明
-a /path/disk.qcow2 -a centos7.qcow2 指定磁盘镜像
-d vm-name -d centos7 指定 libvirt 域
--format qcow2 --format qcow2 强制磁盘格式
--output /dir --output /tftpboot 把文件统一存到指定目录
--machine-readable 输出机器可读格式,便于脚本解析
--colors 终端彩色输出

示例:将虚拟机的内核镜像和文件系统导出来

[root@kvm1 opt]# virt-get-kernel -d centos7.0
download: /boot/vmlinuz-3.10.0-1160.el7.x86_64 -> ./vmlinuz-3.10.0-1160.el7.x86_64
download: /boot/initramfs-3.10.0-1160.el7.x86_64.img -> ./initramfs-3.10.0-1160.el7.x86_64.img
[root@kvm1 opt]# ls
  initramfs-3.10.0-1160.el7.x86_64.img  vmlinuz-3.10.0-1160.el7.x86_64

默认是导出到当前目录,使用 --output 参数指定目录。

14. virt-inspector

必须在 关机或离线 状态下使用,否则会因磁盘锁报错

离线“透视”虚拟机磁盘镜像或 libvirt 域,无需启动虚拟机即可输出操作系统类型、内核版本、文件系统、挂载点、已安装应用、驱动程序等结构化信息 。

使用方法:
virt-inspector -a /path/vm.qcow2 [–xml] [–query] > report.xml
virt-inspector -d vmname [–xml] [–query] > report.xml

示例:

virt-inspector  -a /var/lib/libvirt/images/centos7.0.qcow2 > centos7.0.xml

输出内容太多了,只能放到文件里面了。

15. virt-log

必须关闭虚拟机才能查看日志。

virt-log 是 libguestfs-tools 里的命令行工具,用于离线查看虚拟机磁盘或 libvirt 域中的系统日志,支持 普通文本日志(如 /var/log/messages)和 systemd journal,无需启动虚拟机即可快速排查问题。

选项 说明
-d/--domain <vm> 直接读取 libvirt 客户机
-a/--add <file> 指定磁盘镜像
--format=qcow2/raw 强制磁盘格式
--key / --keys-from-stdin 如果磁盘加密,提供密钥
-v/-x 调试输出

示例:
直接查看虚拟机的全部日志,输出类似 /var/log/messages
内容过多不展示。

virt-log -d centos7.0

查找 DHCP 获取到的 IP

[root@kvm1 opt]# virt-log -d centos7.0 | grep 'dhclient.*bound to'
Jul 11 05:33:23 192 dhclient[734]: bound to 192.168.25.188 -- renewal in 894 seconds.
Jul 11 05:33:46 192 dhclient[1445]: bound to 192.168.25.188 -- renewal in 899 seconds.
Jul 11 05:48:45 192 dhclient[1445]: bound to 192.168.25.188 -- renewal in 867 seconds.
Jul 11 06:03:12 192 dhclient[1445]: bound to 192.168.25.188 -- renewal in 860 seconds.
Jul 11 06:17:33 192 dhclient[1445]: bound to 192.168.25.188 -- renewal in 858 seconds.
Jul 11 06:31:51 192 dhclient[1445]: bound to 192.168.25.188 -- renewal in 807 seconds.

16. virt-make-fs

用来把目录或 tar 归档快速打包成一个可直接挂载的磁盘镜像文件。与 mkisofs、mksquashfs 类似,但它支持 ext2/3/4、NTFS、vfat、minix 等可写文件系统,方便把大量只读数据导入虚拟机

基本语法:
virt-make-fs [选项] <输入目录或 tar> <输出镜像>

常用选项

选项 说明
--type=ext4 指定文件系统类型(ext2/3/4、ntfs、vfat、xfs …)
--format=qcow2 输出 qcow2 镜像(默认 raw)
--size=+100M 显式指定镜像大小,可 + 号自动扩容
--label=DATA 设置卷标
--partition=gpt 同时创建 GPT 分区表(而非整个盘做 fs)

示例:
创建qcow2 镜像文件

[root@kvm1 opt]# ls mydata/
initramfs-3.10.0-1160.el7.x86_64.img  vmlinuz-3.10.0-1160.el7.x86_64
[root@kvm1 opt]# virt-make-fs --format=qcow2 --type=ext4 --label=DATA ./mydata data.qcow2
[root@kvm1 opt]# ls
 data.qcow2  mydata
 [root@kvm1 opt]# qemu-img info data.qcow2
image: data.qcow2
file format: qcow2
virtual size: 28.2 MiB (29577216 bytes)
disk size: 28.6 MiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
[root@kvm1 opt]# virt-filesystems -a data.qcow2  -l
Name      Type        VFS   Label  Size      Parent
/dev/sda  filesystem  ext4  DATA   29577216  -

挂载到宿主机:

[root@kvm1 opt]# virt-filesystems -a data.qcow2  -l
Name      Type        VFS   Label  Size      Parent
/dev/sda  filesystem  ext4  DATA   29577216  -
[root@kvm1 opt]# guestmount -a data.qcow2 -m /dev/sda /media/
[root@kvm1 opt]# ls /media/
initramfs-3.10.0-1160.el7.x86_64.img  lost+found  vmlinuz-3.10.0-1160.el7.x86_64
[root@kvm1 opt]# guestmount -a data.qcow2 -m /dev/sda /media/
[root@kvm1 opt]# guestunmount  /media/

将data.qcow2映像添加到虚拟机:

cat > data.xml <<'EOF'
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/opt/data.qcow2'/>   
  <target dev='vdb' bus='virtio'/>
</disk>
EOF
  • vdb :挂载到虚拟机的磁盘名称
    把它挂到正在运行的虚拟机(热插):

    [root@kvm1 opt]# virsh attach-device centos7.0 data.xml --live --config
    Device attached successfully
    
    [root@kvm1 opt]# virsh domif
    domifaddr      domif-getlink  domiflist      domif-setlink  domifstat      domiftune
    [root@kvm1 opt]# virsh domblklist centos7.0
     Target   Source
    ---------------------------------------------------
     vda      /var/lib/libvirt/images/centos7.0.qcow2
     vdb      /opt/data.qcow2
     sda    
    
  • --live : 立即生效(热插)

  • --config: 下次启动也自动保留

在虚拟机里面挂载测试:

[root@iperf3-server ~]# mount /dev/vdb /mnt
[root@iperf3-server ~]# ls /mnt/
initramfs-3.10.0-1160.el7.x86_64.img  vmlinuz-3.10.0-1160.el7.x86_64
lost+found

挂载后可以看到文件。

17. virt-rescue

在运行中的虚拟机上以写入模式使用“virt-rescue”,或者与其他磁盘编辑工具同时使用,可能会很危险,有可能导致磁盘损坏。
在使用此命令之前,必须关闭虚拟机,并且磁盘映像不得同时进行编辑。
如果磁盘映像或虚拟机可能是活动的,请使用 --ro(只读)选项安全地使用“virt-rescue”。如果与其他更改同时运行,您可能会看到奇怪或不一致的结果,但使用此选项不会损坏磁盘。

virt-rescue 是 libguestfs 工具集中的“虚拟机急救盘”。它把目标磁盘镜像(或关机后的虚拟机)启动到一个 临时的救援 Linux Shell 中,让你可以用常规的 Linux 命令来:

  • 修改 root 密码
  • 修复 fstab、grub、网络配置
  • fsck 文件系统
  • 拷贝文件进/出虚拟机
  • 杀掉挖矿/木马进程等

常用启动方式:

场景 命令示例
按虚拟机名称 virt-rescue -d vm1 -i
按磁盘镜像 virt-rescue -a /var/lib/libvirt/images/vm1.qcow2 -i
只读试验 virt-rescue -d vm1 -i --ro
需要网络 virt-rescue -d vm1 -i --network
  • -i / --inspector 自动探测并挂载所有分区到 /sysroot;不加则需手动挂载。
  • --ro 任何改动退出即丢弃,适合先“看而不改”。

示例:
由于自动挂载fstab设置错误,会导致无法进入系统,这个时候就可以使用virt-rescue 进入到救援模式进行检查修改。

救援系统基于 BusyBox,工具精简,可用 --network 在线安装额外包

[root@kvm1 ~]# virt-rescue -d centos7.0 -i		
Formatting '/tmp/libguestfsRHzNPu/overlay1.qcow2', fmt=qcow2 size=4294967296 backing_file=/var/tmp/.guestfs-0/appliance.d/root backing_fmt=raw cluster_size=65536 lazy_refcounts=off refcount_bits=16
[    0.000000] ACPI BIOS Error (bug): A valid RSDP was not found (20210105/tbxfroot-210)
[    0.125844] usbserial: usb_serial_init - registering generic driver failed
[    0.126025] usbserial: usb_serial_init - returning with error -19
supermin: mounting /proc
supermin: ext2 mini initrd starting up: 5.1.19 glibc
insmod: init_module: nfit.ko: No such device
Starting /init script ...
[/usr/lib/tmpfiles.d/systemd.conf:11] Unknown group 'utmp'.
[/usr/lib/tmpfiles.d/systemd.conf:22] Unknown group 'systemd-journal'.
[/usr/lib/tmpfiles.d/systemd.conf:23] Unknown group 'systemd-journal'.
starting version 239 (239-51.el8_5.2)
/init: line 116: echo: write error: Invalid argument
/init: line 116: echo: write error: Invalid argument
mdadm: No arrays found in config file or automatically
/init: line 142: lvmetad: command not found
mdadm: No arrays found in config file or automatically
/init: line 152: ldmtool: command not found
lvm_system_dir = /tmp/lvm

------------------------------------------------------------

Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / (root) are the rescue appliance.
You have to mount the guest’s partitions under /sysroot
before you can examine them.

><rescue>
The virt-rescue escape key is ‘^]’.  Type ‘^] h’ for help.

><rescue> chroot /sysroot			# 将/sysroot设置为 / 目录

重置root密码:

这种方式重置密码,只适合centos系

><rescue> echo "123456" | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
><rescue> touch /.autorelabel	
><rescue> exit		# 退出/sysroot
exit
><rescue> exit	# 退出救援模式
exit

virt-rescue: Syncing the disk now before exiting ...

Rebooting.
[  376.293288] reboot: Restarting system

18. virt-resize

将旧镜像中的文件系统扩充到新镜像中, 用于调整虚机磁盘大小。虚拟机必须关机。

使用方法:

 virt-resize [--resize /dev/sdaN=[+/-]<size>[%]]
	          [--expand /dev/sdaN] [--shrink /dev/sdaN]
	          [--ignore /dev/sdaN] [--delete /dev/sdaN] [...] indisk outdisk

示例:
扩展虚拟机磁盘:
将旧的磁盘镜像文件改名:

[root@kvm1 ~]# cd /var/lib/libvirt/images/
[root@kvm1 images]# mv centos7.0.qcow2 centos7.0.qcow2.bak

创建新的磁盘文件,使用之前的名称:

[root@kvm1 ~]#  qemu-img create -f qcow2 centos7.0.qcow2 40G
[root@kvm1 ~]#  qemu-img info  centos7.0.qcow2
image: centos7.0.qcow2
file format: qcow2
virtual size: 40 GiB (42949672960 bytes)
disk size: 196 KiB		
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

扩展分区:
将旧的磁盘映像文件复制到新的磁盘映像:
查看旧的磁盘映像的分区,复制到新映像时指定扩展分区:

[root@kvm1 images]# virt-filesystems --long --parts --blkdevs -h -a centos7.0.qcow2.bak
Name       Type       MBR  Size  Parent
/dev/sda1  partition  83   300M  /dev/sda
/dev/sda2  partition  83   25G   /dev/sda
/dev/sda   device     -    25G   -

将旧的磁盘映像复制到新的磁盘映像,并扩容 sda2分区:

[root@kvm1 images]# virt-resize --expand /dev/sda2 centos7.0.qcow2.bak centos7.0.qcow2
[   0.0] Examining centos7.0.qcow2.bak
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 24.7G to 39.7G.  The
filesystem xfs on /dev/sda2 will be expanded using the ‘xfs_growfs’
method.

**********
[   4.8] Setting up initial partition table on centos7.0.qcow2
[   6.0] Copying /dev/sda1
[   6.8] Copying /dev/sda2
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[  33.6] Expanding /dev/sda2 using the ‘xfs_growfs’ method

Resize operation completed with no errors.  Before deleting the old disk,
carefully check that the resized disk boots and works correctly.

登录虚拟机查看:

[root@centos7 ~]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  909M     0  909M   0% /dev
tmpfs          tmpfs     919M     0  919M   0% /dev/shm
tmpfs          tmpfs     919M   17M  903M   2% /run
tmpfs          tmpfs     919M     0  919M   0% /sys/fs/cgroup
/dev/vda2      xfs        40G  1.5G   39G   4% /
/dev/vda1      xfs       297M  125M  173M  42% /boot
tmpfs          tmpfs     184M     0  184M   0% /run/user/0

19. virt-sparsify

使用命令前,必须先关闭虚拟机,并且不能同时编辑磁盘映像。

Virt-sparsify 是一款能够将虚拟机磁盘(或任何磁盘映像)转换为“稀疏”(即“薄分配”)状态的工具。这意味着磁盘映像内的可用空间可以重新转换为主机上的可用空间。
通过消除磁盘镜像中的空洞(未使用的空间),virt-sparsify 可以显著减小镜像文件的大小,便于存储和传输。

示例:
生成一个1G的预分配文件:

[root@kvm1 opt]# qemu-img create -f qcow2 -o preallocation=full old.qcow2 1G
Formatting 'old.qcow2', fmt=qcow2 size=1073741824 cluster_size=65536 preallocation=full lazy_refcounts=off refcount_bits=16
[root@kvm1 opt]# du -sh old.qcow2
1.1G    old.qcow2

消除磁盘镜像中的空洞(未使用的空间):

如果文件比较大,删除速度会很慢。

# virt-sparsify --compress old.qcow2 new.qcow2
[   0.0] Create overlay file in /tmp to protect source disk
[   0.1] Examine source disk
[   4.7] Copy to destination and make sparse
[   5.1] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.

Create overlay file in /tmp to protect source disk这一步是在 /tmp 目录中创建一个覆盖文件(overlay file),用于保护源磁盘文件。覆盖文件的作用是确保在操作过程中,源磁盘文件不会被直接修改,从而保证源文件的安全性。virt-sparsify 会在这个覆盖文件上进行操作,而不是直接在源文件上操作,如果 /tmp 空间不足可以https://b.cloud.189.cn/s/BjqyM3NRvyQ3指定目录

  • --compress:压缩输出格式

查看效果:

[root@kvm1 opt]# du -sh new.qcow2
196K    new.qcow2

20. virt-sysprep

在使用此命令之前,必须先关闭虚拟机,并且不能同时编辑磁盘映像。

Virt-sysprep 可以重置或取消配置虚拟机,以便能够从中创建克隆副本。此过程中的步骤包括删除 SSH 主机密钥、删除持久网络 MAC 配置以及删除用户账户。Virt-sysprep 还可以对虚拟机进行自定义设置,例如添加 SSH 密钥、用户或标志。每个步骤都可以根据需要启用或禁用。
Virt-sysprep 会直接对虚拟机或磁盘映像进行修改。虚拟机必须先关闭。如果您希望保留虚拟机中的现有内容,则必须先进行快照、复制或克隆磁盘操作。

virt-sysprep 操作请移步到我的另一篇文章:https://blog.csdn.net/qq_50247813/article/details/149390096

21. virt-tail

虚拟机必须关机

用于跟踪(尾随)指定虚拟机(或磁盘映像)中“文件”的内容。它与普通的“tail -f”命令类似。
可以提供多个文件名,此时每个文件名都会单独列出。每个文件名都必须是完整的路径,从根目录开始(以“/”开头)。
该命令会一直运行,直到:
· 用户按下 Ctrl+C 键,或者接收到中断信号。
· 所列出的文件在访客电脑中均未找到,或者这些文件都被删除了。
· 出现了无法修复的错误。

示例:

#  virt-tail -d centos7.0 /var/log/messages
--- /var/log/messages ---

Jul 22 17:35:50 centos7 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-55.el7" x-pid="875" x-info="http://www.rsyslog.com"] start
Jul 22 17:35:50 centos7 systemd: Started System Logging Service.
Jul 22 17:35:50 centos7 systemd: Reached target Multi-User System.
Jul 22 17:35:50 centos7 systemd: Starting Update UTMP about System Runlevel Changes...
Jul 22 17:35:50 centos7 systemd: Started Update UTMP about System Runlevel Changes.
Jul 22 17:35:50 centos7 systemd: Startup finished in 736ms (kernel) + 1.662s (initrd) + 38.695s (userspace) = 41.094s.
Jul 22 17:37:20 centos7 qemu-ga: info: guest-shutdown called, mode: powerdown
Jul 22 17:37:20 centos7 systemd: Started Delayed Shutdown Service.
Jul 22 17:37:20 centos7 systemd-shutdownd: Shutting down at Tue 2025-07-22 17:37:20 CST (poweroff)...
Jul 22 17:37:20 centos7 systemd-shutdownd: Creating /run/nologin, blocking further logins...

22. virt-tar-in

在运行中的虚拟机上使用“virt-tar-in”功能,或者与其它磁盘编辑工具同时使用时,可能会存在风险,有可能导致磁盘损坏。在使用此命令之前,必须先关闭虚拟机,并且不能同时编辑磁盘映像。

“virt-tar-in”会将未压缩的 tar(只归档未压缩) 文件解压到虚拟机磁盘映像或指定的 libvirt 域中。
第一个参数是归档文件。使用“-”可从标准输入读取该归档文件。第二个参数是需要解压到的绝对目标目录。

示例:

[root@kvm1 opt]# ls
mydata.tar.gz

mydata.tar.gz解压到虚拟机中:

[root@kvm1 opt]# zcat  mydata.tar.gz | virt-tar-in -d centos7.0  - /home
[root@kvm1 opt]# virt-ls  -d centos7.0 /home
mydata

23. virt-tar-out

virt-tar-out”将虚拟机的磁盘映像目录打包成一个 tar 文件。第一个参数是虚拟机目录的绝对路径。第二个参数是要写入的 tar 文件。使用“-”则表示将内容写入标准输出。

示例:

[root@kvm1 opt]# virt-ls  -d centos7.0 /root
.bash_history
.bash_logout
.bash_profile
.bashrc
.cshrc
.tcshrc
[root@kvm1 opt]# virt-tar-out -d centos7.0 /root root.tar
[root@kvm1 opt]# ls
root.tar

网站公告

今日签到

点亮在社区的每一天
去签到