OpenStack 镜像介绍

发布时间: 更新时间: 总字数:1580 阅读时间:4m 作者: IP上海 分享 网址

简单介绍下 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

image disk formats

  • 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
    • VMware’s ESXi 使用的格式
  • vdi
    • VirtualBox 使用的格式,openstack 不直接支持 vdi 格式,需要将其转换为其他格式才行。
  • vhd
    • Microsoft Hyper-V 使用的格式
  • 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

Container formats

The container format indicates whether the virtual machine image is in a file format that also contains metadata about the actual virtual machine

  • bare
  • ovf
  • aki
  • ari
  • ami

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 之后必须执行vgscanvgchange -ay命令,让 LVM 的分区暴露成可以 mount 的设备,umount 之后,先vgchange -an,然后再qemu-nbd -d

Mount a raw image (with LVM)

kpartx命令的作用:读 device 中的分区表,将扫描出的分区映射到 device 上。

  1. losetup -f 找一个空闲的设备
  2. losetup /dev/loop2 cirros-0.3.4-x86_64-disk.raw 关联 image
  3. 查看一下/dev/loop0 中是否有分区
vm_156e3:~/xiexianbin_cn # kpartx -av /dev/loop0
add map loop0p1 (253:7): 0 64260 linear /dev/loop0 16065
  1. 如果其中有分区的话,那么会有新设备: /dev/mapper/loop0p1
  2. 可以 mount 该分区: mount /dev/mapper/loop0p1 /mnt
  3. mount 后就可以进行操作
  4. 如果 image 中使用了 LVM,则需要执行vgscanvgchange -ay
  5. 结束先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

本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics