创建一个qcow2格式的镜像ubuntu.qcow2,大小为20G
qemu-img create -f qcow2 ubuntu.qcow2 20G
创建虚拟机:
qemu-kvm -smp 2 -m 1024 -hda ubuntu.qcow2 -cdrom ubuntu.iso
将镜像文件从qcow2格式转换为raw格式,因为fdisk不能直接查看qcow2格式的文件,所以需要将其转换成raw。mount同样也不能挂载qcow2格式镜像:
qemu-img convert -O raw ubuntu.qcow2 ubuntu.raw
查看镜像文件的分区:
losetup -f ubuntu.raw
losetup -a
/dev/loop2: [0811]:13897300 (~/kvm/image/ubuntu1204.qcow2)
fdisk -l /dev/loop2
Disk /dev/loop2: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00074114
Device Boot Start End Blocks Id System
/dev/loop2p1 * 2048 18874367 9436160 83 Linux
/dev/loop2p2 18876414 20969471 1046529 5 Extended
/dev/loop2p5 18876416 20969471 1046528 82 Linux swap / Solaris
挂载ubuntu.raw镜像的一个分区
方法一:
mount -o loop ubuntu.raw /mnt #直接挂载会不行
mount: you must specify the filesystem type
mount -o loop,offset=1048576 ubuntu1204.raw /mnt #使用第一分区的偏移量2048*512=1048576挂载,成功
方法二:
kpartx -av ubuntu.raw
add map loop4p1 (252:0): 0 18872320 linear /dev/loop4 2048
add map loop4p2 (252:1): 0 2 linear /dev/loop4 18876414
add map loop4p5 : 0 2093056 linear /dev/loop4 18876416
mount /dev/mapper/loop4p1 /mnt #挂载第一分区
输出第一分区到镜像文件
dd if=/dev/mapper/loop4p1 of=ubuntusda1.raw
此时的分区镜像文件可以直接挂载:
mount ubuntusda1.raw /mnt
注意这种操作只有对raw格式的镜像文件可行,qcow2格式不可通过mount挂载。
使用guestfs对虚拟机镜像进行操作
guestfish --ro - i -a ubuntu.qcow2
进入guestfish的交互界面,可以执行:
ls / :查看/目录下面的文件
download file: 下载虚拟机镜像中的文件到本地磁盘中
inspect-os:指令获取该镜像中包含的操作系统版本
inspect-get-arch /dev/sda:获取虚拟机系统支持的CPU架构,如X86_64
guestfish支持的指令很丰富,功能齐全,可通过man guestfish查看。
Troubleshooting
1
guestfish --ro - i -a ubuntu.qcow2
libguestfs: error: /usr/bin/supermin-helper exited with error status 1.
解决方法:
update-guestfs-appliance