如何使用Libguestfs工具在KVM虚拟机管理程序上挂载VM虚拟磁盘
我已经在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