简单介绍下OpenStack支持的镜像和现状。
现成的镜像
virtual machine image
A virtual machine image is a single file which contains a virtual disk that has a bootable operating system installed on it
- raw
- 最简单的格式。kvm和xen都支持
- 不支持snapshots
- qcow2
- 全称: QEMU copy-on-write version 2,通常被kvm使用。
- 比raw小
- 支持snapshots
- AMI/AKI/ARI
- Amazon EC2支持
- AMI (Amazon Machine Image),是raw格式
- AKI (Amazon Kernel Image),是一个kernel文件,即_vmlinuz_
- ARI (Amazon Ramdisk Image),是启动时加载的ramdisk文件,即_initrd_
- vmdk
- vdi
- VirtualBox使用的格式,openstack不直接支持vdi格式,需要将其转换为其他格式才行。
- vhd
- vhdx
- 比vhd更先进的格式,支持更大的磁盘大小,防止宕机后数据丢失的问题。
- ovf
- 全称是:Open Virtualization Format,是虚拟机的packaging format,一个ovf package可以包含多个image files, .ovf xml文件定义了metadata
- openstack不支持ovf package,必须从ovf中提取出image才行。
- iso
- 是被格式化为read-only ISO 9660的文件系统,被用作CD和DVD,iso包含可启动的操作系统,所有也可以视为一个虚拟机image
The container format indicates whether the virtual machine image is in a file format that also contains metadata about the actual virtual machine
image制作的注意事项
- 禁用不必要的服务(例如cups,postfix,sendmail,gnome界面进程等)
- 默认运行级别不要设置为5
- MAC地址不要写死
- ssh server要自启动
- 禁用防火墙(可以使用openstack安全组来控制instance的访问,instance的防火墙会导致排除问题困难)
- boot时resize partitions
- boot时从openstack metadata service获取ssh public key,放在本地
- 保证image将boot log写在console上(在grub配置中加入 console=ttyS0)
NBD(Network Block Device)
https://en.wikipedia.org/wiki/Network_block_device
NBD是一个device,但内容不是本地提供的,而是远程提供的,通常nbd都是用于访问远程机器的一个storage device。
NBD分为server和client。在client主机上,有个内核模块会控制这个device,每当一个程序去访问这个device,内核模块就会转发到server端,通常server端都是userspace的一个程序,例如qemu-nbd。
举个例子:在一台linux上,如果想要修改本地一个qcow2格式的image,可以使用qemu-nbd命令将image的分区映射到nbd device上,此时qemu-nbd是作为server端的程序,一旦往nbd device上写东西的话,本地linux kernel模块就会转发给qemu-nbd,让qemu-nbd程序去处理,这样就达到了修改image内容的目的。
loop device
loop device是一个device,与NBD不同的是:内容是本地的一个file,而不是远程的device
Mount a qcow2 image
qemu-nbd - QEMU Disk Network Block Device Server: Export QEMU disk image using NBD protocol
qemu-nbd -c /dev/nbd0 imageName
执行后,会出现/dev/nbd0p1、/dev/nbd0p2、/dev/nbd0p3,分别对应vm中的不同分区
vm_156e3:/dsx01/instances/instance-00000064 # l /dev/nbd*
brw-rw---- 1 root disk 43, 0 Oct 15 15:57 /dev/nbd0
brw-rw---- 1 root disk 43, 1 Oct 15 15:57 /dev/nbd0p1
brw-rw---- 1 root disk 43, 2 Oct 15 15:57 /dev/nbd0p2
brw-rw---- 1 root disk 43, 3 Oct 15 15:57 /dev/nbd0p3
可以直接mount虚拟机的某个分区: mount /dev/nbd0p1 /mnt
,可以自行修改。
修改结束后,先umount /mnt
,然后执行qemu-nbd -d /dev/nbd0
,此时/dev/nbd0p1、/dev/nbd0p2、/dev/nbd0p3会消失。
注意: 如果image中带有LVM,在qemu-nbd之后必须执行vgscan
和vgchange -ay
命令,让LVM的分区暴露成可以mount的设备,umount之后,先vgchange -an
,然后再qemu-nbd -d
Mount a raw image (with LVM)
kpartx
命令的作用:读device中的分区表,将扫描出的分区映射到device上。
losetup -f
找一个空闲的设备losetup /dev/loop2 cirros-0.3.4-x86_64-disk.raw
关联image- 查看一下/dev/loop0中是否有分区
vm_156e3:~/xiexianbin_cn # kpartx -av /dev/loop0
add map loop0p1 (253:7): 0 64260 linear /dev/loop0 16065
- 如果其中有分区的话,那么会有新设备:
/dev/mapper/loop0p1
- 可以mount该分区:
mount /dev/mapper/loop0p1 /mnt
- mount后就可以进行操作
- 如果image中使用了LVM,则需要执行
vgscan
和vgchange -ay
- 结束先
umount /mnt
,然后kpartx -d /dev/loop0
,然后losetup -d /dev/loop0
image格式间转换
qemu-img convert
命令可以在不同格式间转换。例如:从qcow2转换成raw格式
qemu-img convert -f qcow2 -O raw cirros-0.3.4-x86_64-disk.img.bak cirros-0.3.4-x86_64-disk.raw