|
使用虚拟机时, 发现想要修改虚拟机中的文件非常麻烦, 需要启动虚拟机, 然后再登录进去修改.
对于已经关闭的虚拟机, 为了修改一个文件而启动, 非常耽误时间.
对于一个无法启动的虚拟机(比如启动文件损坏), 则束手无策.
因此, 掌握在主机中挂载 Guest 的操作系统磁盘, 并修改其中的内容的方法在某些时候会非常有用.
1. 挂载 Guest 操作系统磁盘的方法
挂载 Guest 操作系统磁盘的方法主要有以下3种:
- guestfish : 支持lvm, 速度较慢
- lomount : 不支持lvm, 速度快
- kpartx : 支持lvm, 速度快
使用上述3种工具之前, 我先安装了2个 kvm 虚拟机, 都是debian7.6 x86_64, 一个是普通分区, 一个是LVM分区.
2个系统的磁盘在默认路径中
root@debian-113:~# ll /var/lib/libvirt/images
total 16777320
-rw------- 1 root root 8589934592 Sep 18 12:48 debian7.6.img
-rw------- 1 root root 8589934592 Sep 18 13:08 debian7.6-lvm.img
2. 方法1 - guestfish
2.1 使用 guestfish 对 普通Guest的磁盘进行一些基本的操作
root@debian-113:~# apt-get install guestfish mount /dev/vda1 /
> ls /
bin
boot
dev
etc
home
initrd.img
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz
# 将 Guest上的 hostname 文件下载到 Host的 /home/from-guest
> download /etc/hostname /home/from-guest
# 卸载Guest磁盘, 退出 guestfish
> mounts
/dev/vda1
> umount /dev/vda1
> quit
*注1* guestfish中, launch时出现错误的解决方法:
> launch
febootstrap-supermin-helper: ext2: parent directory not found: /lib: File not found by ext2_lookup
libguestfs: error: external command failed, see earlier error messages
> quit
root@debian:~# update-guestfs-appliance
2.2 验证 guestfish 对普通磁盘的修改结果
1. HOST - 验证是否有 Guest的hostname文件, 并且内容正确?
root@debian-113:~# cat /home/from-guest mounts
/dev/debian/home
> umount /dev/debian/home
> lvs
/dev/debian/home
/dev/debian/root
/dev/debian/swap_1
> mount /dev/debian/root /
> ls /
bin
boot
dev
etc
home
initrd.img
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz
# 将 Guest上的 hostname 文件下载到 Host的 /home/from-guest-lvm
> download /etc/hostname /home/from-guest-lvm
# 卸载Guest磁盘, 退出 guestfish
> mounts
/dev/debian/root
> umount /dev/debian/root
> quit
2.4 验证 guestfish 对LVM磁盘的修改结果
1. HOST - 验证是否有 Guest的hostname文件, 并且内容正确?
root@debian-113:~# cat /home/from-guest-lvm |
|
|