如何使用Libguestfs工具在KVM虚拟机管理程序上挂载VM虚拟磁盘

时间:2020-02-23 14:30:57  来源:igfitidea点击:

我已经在Vanilla KVM虚拟机管理程序上管理多个虚拟机已有一段时间了。假设我们有一个要在管理程序上挂载其虚拟磁盘的VM,该如何处理?例如,重置root密码,检查某些文件,或者VM已被盗用,并且我们想对攻击源进行更多分析而又不将VM置于运行模式。

如何在KVM虚拟机管理程序上挂载VM虚拟磁盘

在我的设置中,我有一台装有KVM并运行许多VM的CentOS 7服务器。为了能够挂载VM虚拟磁盘,我们需要安装Libguestfs。

libguestfs是用于访问和修改虚拟机(VM)磁盘镜像的一组工具。我们可以将其用于:

查看和编辑guest虚拟机中的文件脚本编写VM更改监控磁盘使用/免费统计信息创建guest虚拟机P2VV2V执行备份等

在CentOS上安装libguestfs:

要在CentOS服务器上安装libguestfs,请运行:

sudo yum -y install libguestfs-tools

在Ubuntu/Debian上安装libguestfs

sudo apt-get -y install libguestfs-tools

在Arch Linux上安装libguestfs

首先在/etc/pacman.conf上启用AUR

$sudo vim /etc/pacman.conf

# Should have below lines
[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

然后更新Pacman数据库。

sudo pacman -Syy

使用AUR助手安装libguestfs工具。

sudo pacman -S yaourt
yaourt -S --noconfirm --needed libguestfs

使用libguestfs在KVM上挂载虚拟磁盘

现在,我们已经安装了libguestfs工具,我们可以其中安装VM的虚拟磁盘。建议在安装虚拟机之前先关闭它。写入正在运行的虚拟机的磁盘可能会导致磁盘损坏。建议我们使用只读访问,或者如果来宾正在运行guestfsd守护程序,请指定实时访问。在大多数libguestfs工具中,这些选项分别是ro或者live。

如果我们是virsh命令的新手,请查看以下文章:

virsh命令速查表来管理KVM来宾虚拟机

首先检查活动的虚拟机:

sudo virsh list

关闭有问题的VM:

sudo virsh shutdown <domain-name or ID>

然后挂载磁盘,

sudo guestmount -d <domain> -i /mnt/

例:

sudo guestmount -d centos7 -i /mnt/

确认安装成功:

# df -hT | egrep "/mnt"
/dev/fuse fuse 20G 3.9G 16G 20% /mnt

使用选项的说明

-d | domain:从libvirt guest虚拟机添加磁盘
-i |检查器:自动挂载文件系统

以下是可以与withguestmount命令一起使用的选项的完整列表。可从以下位置获得:

$guestmount --help

所有guestmount选项:

-a |--add image --> Add image
-c|--connect uri --> Specify libvirt URI for -d option
--dir-cache-timeout --> Set readdir cache timeout (default 5 sec)
-d |--domain --> Add disks from libvirt guest
--echo-keys --> Don't turn off echo for passphrases
--fd=FD --> Write to pipe FD when mountpoint is ready
--format[=raw|..] --> Force disk format for -a option
--fuse-help --> Display extra FUSE options
-i |--inspector --> Automatically mount filesystems 
--help --> Display help message and exit
--keys-from-stdin --> Read passphrases from stdin
--live --> Connect to a live virtual machine
-m |--mount dev[:mnt[:opts[:fstype]] --> Mount dev on mnt (if omitted, /)
--no-fork --> Don't daemonize
-n |--no-sync --> Don't autosync
-o |--option --> opt Pass extra option to FUSE
--pid-file --> filename Write PID to filename
-r |--ro --> Mount read-only
--selinux --> For backwards compat only does nothing
-v |--verbose --> Verbose messages
-V |--version --> Display version and exit
-w |--rw --> Mount read-write
-x |--trace --> Trace guestfs API calls

挂载正在运行的VM虚拟磁盘

对于正在运行的VM,我之前已经说过,我们必须使用liveflag将其作为roor挂载。

sudo guestmount --ro -d <domain> -i /mnt/

重置根密码示例:

生病了,我们将了解如何使用已安装的虚拟磁盘重置root密码。很好的usechrootcommand,这是一个用于运行带有特殊根目录的命令或者交互式shell的工具。

sudo chroot /mnt
passwd

设置密码并完成后卸载磁盘

sudo guestunmount  /mnt

启动VM并测试是否可以使用设置的密码进行身份验证。

sudo virsh start <domain>

卸载虚拟磁盘

如果已完成对已安装磁盘的处理,请通过运行以下命令将其卸载:

$sudo guestunmount mountpoint
E.g
$sudo guestunmount  /mnt

想要自动化KVM上的VM部署,请查看如何使用Terraform在KVM上配置VM