简单介绍下 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
VHDX
VHDX (Virtual Hard Disk v2) 是微软推出的下一代虚拟硬盘格式,用于 Hyper-V 和 Docker 等虚拟化平台,相比旧的 VHD 格式,它支持更大的容量(高达 64 TB)、更好的性能和电源故障恢复能力,能存储虚拟机操作系统、应用和数据,提供动态扩展和快照功能,是现代虚拟化环境推荐的虚拟磁盘标准。
windows 转 qcow2 https://gist.github.com/omerfsen/cdd540cc32fa20406d47af43082c6a39