概述
libguestfs是一组使用于硬件虚拟化中旨在用于访问及修改磁盘映像的C语言库和配套工具。此工具可查看并编辑由libvirt所管理的虚拟机及其内部文件、为虚拟机撰写脚本、创建虚拟机等。
libguestfs几乎可访问任意类型的文件系统,包括:所有已知类型的Linux文件系统(ext2/3/4、XFS、btrfs等等)、任意类型的Windows 文件系统(VFAT及NTFS)、任意类型的macOS及BSD文件系统、LVM2卷宗管理、MBR及GPT磁盘分区、未格式化的硬盘、qcow2、VirtualBox VDI、VMWare VMDK、Hyper-V VHD/VHDX、文件、本地设备、CD/DVD ISO、SD卡或通过FTP、HTTP、SSH、iSCSI、NBD、GlusterFS、Ceph、Sheepdog等程序远程管理。libguestfs无需root权限。
libguestfs的功能由guestfish外壳(Shell)提供。若虚拟机无法启动,则可使用援救外壳virt-rescue进行修复。现有工具将普通的Unix命令作为样板使用,如工具virt-cat及virt-tar。
libguestfs-tools工具常用命令介绍
1,首先确认libguestfs-tools工具是否安装
代码语言:javascript复制[root@kvm-node1 ~]# yum install libguestfs-tools
[root@kvm-node1 ~]# rpm -qa|grep libguestfs-tools
libguestfs-tools-1.40.2-10.el7.noarch
libguestfs-tools-c-1.40.2-10.el7.x86_64
[root@kvm-node1 ~]#
[root@kvm-node1 ~]# vir
virsh virt-diff virt-log virt-tail
virt-alignment-scan virt-edit virtlogd virt-tar-in
virt-builder virt-filesystems virt-ls virt-tar-out
virt-builder-repository virt-format virt-make-fs virt-viewer
virt-cat virt-get-kernel virt-manager virt-what
virt-clone virt-host-validate virt-pki-validate virt-win-reg
virt-copy-in virt-index-validate virt-rescue virt-xml
virt-copy-out virt-inspector virt-resize virt-xml-validate
virt-customize virt-install virt-sparsify
virt-df virtlockd virt-sysprep
命令格式:-d采用域名的方式,-a是直接获取磁盘文件方式
代码语言:javascript复制virt-df [--options] -d domname
virt-df [--options] -a disk.img [-a disk.img ...]
2,virt-cat命令,查看虚拟机内部文件,类似于cat(开关机都可以)
代码语言:javascript复制[root@kvm-node1 ~]# virt-cat -d vm01 /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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
3,virt-edit命令,编辑虚拟机内部的文件,类似于vi编辑器(注意:虚拟机必须处于关机状态)
代码语言:javascript复制[root@kvm-node1 ~]# virt-edit -d node01 /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
4,virt-df命令,查看虚拟机内部的磁盘使用情况,类似于df -h命令,(开关机都可以)
代码语言:javascript复制[root@kvm-node1 ~]# virt-df -h vm01
Filesystem Size Used Available Use%
vm01:/dev/sda1 497M 146M 351M 30%
vm01:/dev/centos/root 10G 1.7G 8.3G 18%
[root@kvm-node1 ~]# virsh list --all
Id Name State
----------------------------------------------------
14 win10 running
34 vm01 running
- node01 shut off
- node02 shut off
- node03 shut off
5,virt-filesystems命令,也是查看磁盘的使用情况,和virt-df命令类似(开关机都可以)
代码语言:javascript复制[root@kvm-node1 ~]# virt-filesystems -d vm01
/dev/sda1
/dev/centos/root
6,virt-copy-out命令,直接复制虚拟机里面的磁盘文件到本地磁盘上,类似于cp命令,分为拷贝文件和拷贝目录:
代码语言:javascript复制#拷贝虚拟机vm01中的磁盘文件到本地目录/opt下(拷贝文件)
[root@kvm-node1 ~]# virt-copy-out -d vm01 /etc/passwd /opt
#拷贝虚拟机vm01中的目录/opt目录到本地/opt下(拷贝目录)
[root@kvm-node1 ~]# virt-copy-out -d vm01 /opt /opt
#验证
[root@kvm-node1 ~]# ls /opt/
opt passwd rh
7,直接读取磁盘文件中的内容
代码语言:javascript复制[root@kvm-node1 opt]# virt-copy-out -a /kvm/img/vm01.qcow2 /etc/sysconfig/network-scripts/ifcfg-ens3 /opt/111/
[root@kvm-node1 opt]# cat /opt/111/ifcfg-ens3
# Generated by dracut initrd
NAME="ens3"
DEVICE="ens3"
ONBOOT=yes
NETBOOT=yes
UUID="40339ace-a4a9-4a8a-abf8-0b956713e628"
IPV6INIT=yes
BOOTPROTO=dhcp
TYPE=Ethernet
8,virt-copy-in命令,直接虚拟化平台上本地磁盘到虚拟机磁盘上,类似于cp (虚拟机必须处于关机状态,开机验证)
代码语言:javascript复制[root@kvm-node1 opt]# virt-copy-in -d vm01 /opt/passwd /mnt/
[root@kvm-node1 opt]# virsh start vm01
Domain vm01 started
登录虚拟机验证
代码语言:javascript复制[root@kvm-node1 opt]#virsh console vm01
[root@localhost mnt]# ls
passwd
[root@localhost mnt]# pwd
/mnt
如果出现报错:"/usr/bin/virt-copy-in: line 19: exec: guestfish: not found"原因是没有安装guestfish造成的,可以先安装执行此命令yum install guestfish -y
案例分享
kvm虚拟机忘记root密码、修改root密码
1、宿主机安装kvm管理工具libguestfs-tools
代码语言:javascript复制yum install libguestfs-tools
2、查看宿主机上所有的kvm虚拟机
代码语言:javascript复制virsh list --all
3、执行virt-edit命令需要停掉虚拟机
代码语言:javascript复制virsh shutdown vm01
4、通过virt-edit命令可以直接在宿主机修改kvm虚拟机的 /etc/shadow文件,
代码语言:javascript复制virt-edit vm01 /etc/shadow
- 替换密码串,密码串可以从已知密码的linux系统中复制替换
- openssl 生成密码
openssl passwd -1 -salt 'hello' '123456'
注意:"123456"不是密码而是密码的长度
5、重启kvm虚拟机验证密码
代码语言:javascript复制virsh start vm01