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.0
和 centos7.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