使用虛擬機(jī)時(shí), 發(fā)現(xiàn)想要修改虛擬機(jī)中的文件非常麻煩, 需要啟動(dòng)虛擬機(jī), 然后再登錄進(jìn)去修改. 對(duì)于已經(jīng)關(guān)閉的虛擬機(jī), 為了修改一個(gè)文件而啟動(dòng), 非常耽誤時(shí)間. 對(duì)于一個(gè)無法啟動(dòng)的虛擬機(jī)(比如啟動(dòng)文件損壞), 則束手無策.
因此, 掌握在主機(jī)中掛載 Guest 的操作系統(tǒng)磁盤, 并修改其中的內(nèi)容的方法在某些時(shí)候會(huì)非常有用.
1. 掛載 Guest 操作系統(tǒng)磁盤的方法掛載 Guest 操作系統(tǒng)磁盤的方法主要有以下3種:
使用上述3種工具之前, 我先安裝了2個(gè) kvm 虛擬機(jī), 都是debian7.6 x86_64, 一個(gè)是普通分區(qū), 一個(gè)是LVM分區(qū). 2個(gè)系統(tǒng)的磁盤在默認(rèn)路徑中 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 - guestfish2.1 使用 guestfish 對(duì) 普通Guest的磁盤進(jìn)行一些基本的操作root@debian-113:~# apt-get install guestfish <-- 安裝 guestfish 工具包, 中途跳出一個(gè)選擇畫面, 選擇no root@debian-113:~# guestfish <-- 進(jìn)入 guestfish Welcome to guestfish, the libguestfs filesystem interactive shell for editing virtual machine filesystems. Type: 'help' for help on commands 'man' to read the manual 'quit' to quit the shell ><fs> add /var/lib/libvirt/images/debian7.6.img <-- 掛載 debian7.6的系統(tǒng)磁盤(非LVM分區(qū)) ><fs> launch <-- 啟動(dòng)Guest, 這里會(huì)慢一些, 如果有錯(cuò)誤, 參見下面的 *注1* 100% ?------------------? 00:00 ><fs> list-devices <-- 查看 Guest 中的磁盤 /dev/vda ><fs> sfdisk-l /dev/vda <-- 查看 Guest 中的磁盤分區(qū) Disk /dev/vda: 16644 cylinders, 16 heads, 63 sectors/track Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/vda1 * 2+ 5115- 5114- 2577408 83 Linux <-- 這個(gè)應(yīng)該是根分區(qū) / /dev/vda2 5117+ 16642- 11525- 5808129 5 Extended /dev/vda3 0 - 0 0 0 Empty /dev/vda4 0 - 0 0 0 Empty /dev/vda5 5117+ 5741- 624- 314368 82 Linux swap / Solaris /dev/vda6 5743+ 16642- 10899- 5492736 83 Linux <-- 這個(gè)應(yīng)該是home分區(qū) /home ><fs> mount /dev/vda6 / <-- 掛載 Guest 操作系統(tǒng)磁盤 ><fs> ls / <-- 顯示掛載的內(nèi)容, 就是Guest的 /home lost+found wangyubin # Guest磁盤上新建文件 ><fs> touch /wangyubin/guestfish <-- Guest的磁盤上新建一個(gè)文件 ><fs> vi /wangyubin/guestfish <-- 編輯這個(gè)文件, 輸入 test guestfish # 將Host上的hostname文件上傳到Guest的 /home/wangyubin/from-host ><fs> upload /etc/hostname /wangyubin/from-host # 卸載 Guest 的/home分區(qū), 重新掛載Guest的 / 分區(qū) ><fs> mounts /dev/vda6 ><fs> umount /dev/vda6 ><fs> mount /dev/vda1 / ><fs> 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 ><fs> download /etc/hostname /home/from-guest # 卸載Guest磁盤, 退出 guestfish ><fs> mounts /dev/vda1 ><fs> umount /dev/vda1 ><fs> quit
*注1* guestfish中, launch時(shí)出現(xiàn)錯(cuò)誤的解決方法: ><fs> 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 ><fs> quit root@debian:~# update-guestfs-appliance
2.2 驗(yàn)證 guestfish 對(duì)普通磁盤的修改結(jié)果1. HOST - 驗(yàn)證是否有 Guest的hostname文件, 并且內(nèi)容正確? root@debian-113:~# cat /home/from-guest <-- 內(nèi)容正確, 參見下面cat出的Guest上的hostname debian root@debian-113:~# cat /etc/hostname <-- Host的hostname內(nèi)容, 用于驗(yàn)證 from-host的內(nèi)容 debian-113
2. GUEST - 驗(yàn)證是否有新建的文件? 是否有 Host的hostname文件, 并且內(nèi)容正確? # virt-manager 啟動(dòng) guest之后, 登錄進(jìn)去執(zhí)行以下命令 root@debian:~# ls /home/wangyubin/ <-- 新建的文件和upload的文件都在 from-host guestfish root@debian:~# cat /home/wangyubin/from-host <-- 內(nèi)容正確, 參見上面cat出的Host上的hostname debian-113 root@debian:~# cat /home/wangyubin/guestfish <-- 新建的文件內(nèi)容正確 test guestfish root@debian:~# cat /etc/hostname <-- Guest的hostname內(nèi)容, 用于驗(yàn)證 from-guest的內(nèi)容 debian
2.3 使用 guestfish 對(duì) LVM分區(qū)的Guest磁盤進(jìn)行一些基本的操作root@debian-113:~# guestfish Welcome to guestfish, the libguestfs filesystem interactive shell for editing virtual machine filesystems. Type: 'help' for help on commands 'man' to read the manual 'quit' to quit the shell ><fs> add /var/lib/libvirt/images/debian7.6-lvm.img ><fs> launch ><fs> list-devices /dev/vda ><fs> sfdisk-l /dev/vda Disk /dev/vda: 16644 cylinders, 16 heads, 63 sectors/track Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System /dev/vda1 * 2+ 495- 494- 248832 83 Linux /dev/vda2 497+ 16642- 16145- 8136705 5 Extended /dev/vda3 0 - 0 0 0 Empty /dev/vda4 0 - 0 0 0 Empty /dev/vda5 497+ 16642- 16145- 8136704 8e Linux LVM <-- 這里看出是LVM ><fs> lvs <-- 查看LVM的邏輯卷 /dev/debian/home /dev/debian/root /dev/debian/swap_1 ><fs> mount /dev/debian/home / <-- 掛載 /home 對(duì)應(yīng)的LVM邏輯卷 ><fs> ls / lost+found wangyubin # Guest磁盤上新建文件 - 步驟同上面普通磁盤 ><fs> touch /wangyubin/guestfish-lvm <-- Guest的磁盤上新建一個(gè)文件 ><fs> vi /wangyubin/guestfish-lvm <-- 編輯這個(gè)文件, 輸入 test guestfish lvm # 將Host上的hostname文件上傳到Guest的 /home/wangyubin/from-host-lvm ><fs> upload /etc/hostname /wangyubin/from-host-lvm # 卸載 Guest 的/home分區(qū), 重新掛載Guest的 / 分區(qū) 都是LVM格式 ><fs> mounts /dev/debian/home ><fs> umount /dev/debian/home ><fs> lvs /dev/debian/home /dev/debian/root /dev/debian/swap_1 ><fs> mount /dev/debian/root / ><fs> 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 ><fs> download /etc/hostname /home/from-guest-lvm # 卸載Guest磁盤, 退出 guestfish ><fs> mounts /dev/debian/root ><fs> umount /dev/debian/root ><fs> quit
2.4 驗(yàn)證 guestfish 對(duì)LVM磁盤的修改結(jié)果1. HOST - 驗(yàn)證是否有 Guest的hostname文件, 并且內(nèi)容正確? root@debian-113:~# cat /home/from-guest-lvm <-- 內(nèi)容正確, 參見下面cat出的Guest上的hostname debian root@debian-113:~# cat /etc/hostname <-- Host的hostname內(nèi)容, 用于驗(yàn)證 from-host的內(nèi)容 debian-113
2. GUEST - 驗(yàn)證是否有新建的文件? 是否有 Host的hostname文件, 并且內(nèi)容正確? # virt-manager 啟動(dòng) guest之后, 登錄進(jìn)去執(zhí)行以下命令 root@debian:~# ls /home/wangyubin/ <-- 新建的文件和upload的文件都在 from-host-lvm guestfish-lvm root@debian:~# cat /home/wangyubin/from-host-lvm <-- 內(nèi)容正確, 參見上面cat出的Host上的hostname debian-113 root@debian:~# cat /home/wangyubin/guestfish-lvm <-- 新建的文件內(nèi)容正確 test guestfish lvm root@debian:~# cat /etc/hostname <-- Guest的hostname內(nèi)容, 用于驗(yàn)證 from-guest的內(nèi)容 debian
3. 方法2 - lomountlomount是Xen環(huán)境下的工具, 掛載Guest的操作系統(tǒng)磁盤時(shí)比guestfish要快很多, 但是不支持lvm. 由于沒有Xen的環(huán)境, 這里就不嘗試了.
4. 方法3 - kpartx首先, 安裝 kaprtx root@debian-113:~# apt-get install kpartx
4.1 使用 kpartx 對(duì) 普通分區(qū)的Guest磁盤進(jìn)行一些基本的操作root@debian-113:~# kpartx -av /var/lib/libvirt/images/debian7.6.img add map loop0p1 (254:0): 0 5154816 linear /dev/loop0 2048 <-- 這個(gè)是根分區(qū) / add map loop0p2 (254:1): 0 11616258 linear /dev/loop0 5158910 add map loop0p5 : 0 628736 linear 254:1 2 add map loop0p6 : 0 10985472 linear 254:1 630786 <-- 這個(gè)是分區(qū) /home # 掛載磁盤 root@debian-113:~# mount /dev/mapper/loop0p1 /mnt/ <-- *注2* root@debian-113:~# ll /mnt/ total 96 drwxr-xr-x 2 root root 4096 Sep 18 12:38 bin drwxr-xr-x 3 root root 4096 Sep 18 12:40 boot drwxr-xr-x 3 root root 4096 Sep 18 11:26 dev drwxr-xr-x 72 root root 4096 Sep 18 19:50 etc drwxr-xr-x 2 root root 4096 Sep 18 11:23 home lrwxrwxrwx 1 root root 30 Sep 18 11:27 initrd.img -> /boot/initrd.img-3.2.0-4-amd64 drwxr-xr-x 13 root root 4096 Sep 18 12:31 lib drwxr-xr-x 2 root root 4096 Sep 18 12:30 lib64 drwx------ 2 root root 16384 Sep 18 11:23 lost+found drwxr-xr-x 3 root root 4096 Sep 18 11:23 media drwxr-xr-x 2 root root 4096 Jun 12 05:07 mnt drwxr-xr-x 2 root root 4096 Sep 18 11:23 opt drwxr-xr-x 2 root root 4096 Jun 12 05:07 proc drwx------ 3 root root 4096 Sep 18 12:46 root drwxr-xr-x 2 root root 4096 Sep 18 12:45 run drwxr-xr-x 2 root root 4096 Sep 18 12:45 sbin drwxr-xr-x 2 root root 4096 Jun 10 2012 selinux drwxr-xr-x 2 root root 4096 Sep 18 11:23 srv drwxr-xr-x 2 root root 4096 Jul 15 2013 sys drwxrwxrwt 2 root root 4096 Sep 18 19:52 tmp drwxr-xr-x 10 root root 4096 Sep 18 11:23 usr drwxr-xr-x 11 root root 4096 Sep 18 11:23 var lrwxrwxrwx 1 root root 26 Sep 18 11:27 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64 # 卸載磁盤 root@debian-113:~# umount /mnt
*注2* kpartx 可以將Guest的磁盤掛載到主機(jī)的某個(gè)目錄下 (比如上述例子就是 /mnt), 不像 guestfish 只能將Guest的磁盤掛載到 / 因此, 對(duì)于 kpartx 來說, 不需要 download 和 upload 命令, 操作 Guest 磁盤中的文件就和掛載了U盤一樣.
4.2 使用 kpartx 對(duì) LVM分區(qū)的Guest磁盤進(jìn)行一些基本的操作root@debian-113:~# kpartx -av /var/lib/libvirt/images/debian7.6-lvm.img add map loop1p1 (254:4): 0 497664 linear /dev/loop1 2048 add map loop1p2 (254:5): 0 16273410 linear /dev/loop1 501758 add map loop1p5 : 0 16273408 linear 254:5 2 <-- 這是 lvm 分區(qū) root@debian-113:~# vgscan <-- 通過 lvm 相關(guān)命令查看 lvm分區(qū)信息 Reading all physical volumes. This may take a while... Found volume group "debian" using metadata type lvm2 root@debian-113:~# vgs <-- 通過 lvm 相關(guān)命令查看 lvm分區(qū)信息 VG #PV #LV #SN Attr VSize VFree debian 1 3 0 wz--n- 7.76g 0 root@debian-113:~# lvs <-- 通過 lvm 相關(guān)命令查看 lvm分區(qū)信息 LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert home debian -wi----- 5.06g root debian -wi----- 2.40g swap_1 debian -wi----- 300.00m root@debian-113:~# vgchange -ay debian <-- 激活lvm分區(qū) 3 logical volume(s) in volume group "debian" now active root@debian-113:~# mount /dev/debian/root /mnt/ <-- 掛載 lvm中的根分區(qū) / root@debian-113:~# ll /mnt/ total 96 drwxr-xr-x 2 root root 4096 Sep 18 12:53 bin drwxr-xr-x 2 root root 4096 Sep 18 11:28 boot drwxr-xr-x 3 root root 4096 Sep 18 11:31 dev drwxr-xr-x 73 root root 4096 Sep 18 20:54 etc drwxr-xr-x 2 root root 4096 Sep 18 11:28 home lrwxrwxrwx 1 root root 30 Sep 18 11:32 initrd.img -> /boot/initrd.img-3.2.0-4-amd64 drwxr-xr-x 13 root root 4096 Sep 18 12:43 lib drwxr-xr-x 2 root root 4096 Sep 18 12:42 lib64 drwx------ 2 root root 16384 Sep 18 11:28 lost+found drwxr-xr-x 3 root root 4096 Sep 18 11:28 media drwxr-xr-x 2 root root 4096 Jun 12 05:07 mnt drwxr-xr-x 2 root root 4096 Sep 18 11:28 opt drwxr-xr-x 2 root root 4096 Jun 12 05:07 proc drwx------ 3 root root 4096 Sep 18 13:08 root drwxr-xr-x 2 root root 4096 Sep 18 13:06 run drwxr-xr-x 2 root root 4096 Sep 18 13:06 sbin drwxr-xr-x 2 root root 4096 Jun 10 2012 selinux drwxr-xr-x 2 root root 4096 Sep 18 11:28 srv drwxr-xr-x 2 root root 4096 Jul 15 2013 sys drwxrwxrwt 2 root root 4096 Sep 18 20:17 tmp drwxr-xr-x 10 root root 4096 Sep 18 11:28 usr drwxr-xr-x 11 root root 4096 Sep 18 11:28 var lrwxrwxrwx 1 root root 26 Sep 18 11:32 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64 root@debian-113:~# umount /mnt <-- 卸載分區(qū)
5. 總結(jié)lomount 由于沒有環(huán)境, 沒有實(shí)驗(yàn). 對(duì)于 guestfish 和 kpartx來說, 感覺無論是速度還是易用性上, 都是 kpartx 勝出. |
|