用 virt-manager, virsh 或其他工具可以选择把 KVM 或 Xen HVM 的虚拟机安装在一个镜像文件上,虽然因为性能的关系这种方式不推荐在生产环境使用,但是因为用起来非常简便,所以 VPSee 平时做实验或测试的时候会经常用这种方式存储虚拟机。上星期提到了 “挂载虚拟机镜像文件里的 LVM 逻辑分区”,那么如何挂载虚拟机镜像文件里的普通分区呢?这比挂载 LVM 逻辑分区要简单多了,不用算那个地址偏移量 offset,也不用 LVM 打交道。
和以前一样,首先用 losetup 工具把 centos.img 文件和 loop 设备映射起来,-f 参数用来找出下一个可用的 loop 设备:
# losetup -f /dev/loop0 # losetup /dev/loop0 /home/vpsee/centos.img
一个镜像文件里可能包含多个分区,所以不能简单 mount -o loop centos.img,我们需要把 centos.img 里面包含的每个分区映射出来后在一个一个挂载,所以需要一个工具来读分区表,kpartx 就是这样一个在特定设备上读取分区表并为每个分区创建映射的工具,-a 参数表示加入分区映射;-v 参数表示完成后输出结果:
# kpartx -av /dev/loop0 add map loop0p1 : 0 208782 linear /dev/loop0 63 add map loop0p2 : 0 1044225 linear /dev/loop0 208845 add map loop0p3 : 0 19711755 linear /dev/loop0 1253070
上面 loop0p1, loop0p2, loop0p3 分别映射到镜像文件里的3个分区里,可以通过 fdisk 来查看:
# fdisk -l /dev/loop0 Disk /dev/loop0: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/loop0p1 * 1 13 104391 83 Linux /dev/loop0p2 14 78 522112+ 82 Linux swap / Solaris /dev/loop0p3 79 1305 9855877+ 83 Linux
有了上面的映射以后就可以挂载 centos.img 里的普通逻辑分区了,我们这里只挂载 root 分区,root 分区在 loop0p3,挂载成功后用 ls 查看一下是否正确:
# ls -l /dev/mapper/ total 0 crw------- 1 root root 10, 63 Sep 24 11:34 control brw-r----- 1 root disk 253, 2 Oct 14 19:55 loop0p1 brw-r----- 1 root disk 253, 3 Oct 14 19:55 loop0p2 brw-r----- 1 root disk 253, 4 Oct 14 19:55 loop0p3 # mount /dev/mapper/loop0p3 /mnt # ls /mnt bin dev home lib64 media opt root selinux sys usr boot etc lib lost+found mnt proc sbin srv tmp var
使用完后,需要按顺序干净卸载:
# umount /mnt # kpartx -dv /dev/loop0 del devmap : loop0p1 del devmap : loop0p2 del devmap : loop0p3 # losetup -d /dev/loop0