首页 > 代码库 > 虚拟机镜像相关操作

虚拟机镜像相关操作

创建一个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


虚拟机镜像相关操作