首页 » OpenStack系统架构设计实战 » OpenStack系统架构设计实战全文在线阅读

《OpenStack系统架构设计实战》2.9.4 创建镜像

关灯直达底部

OpenStack使用的镜像为AMI格式,又称裸机格式。只包含文件系统,与平常使用的镜像不一样,平常使用的镜像模拟的是整个硬盘。以KVM为例来说明如何建立一个AMI格式的镜像。首先建立一个平常使用的镜像,安装系统后,把ext4文件系统剥离出来,就是AMI格式的镜像。我们以Ubuntu的映像来举例。

1)下载要安装的Ubuntu版本。

$ wget http://releases.ubuntu.com/lucid/ubuntu-10.04.1-server-amd64.iso

2)创建一个10GB大小的“硬盘”(raw格式)。

$ kvm-img create -f raw ubuntu.img 10GFormatting /'ubuntu.img/', fmt=raw size=10737418240

3)使用刚才下载的Ubuntu“安装盘”和刚创建的“硬盘”引导启动系统,-vnc参数代表打开VNC访问,以便可以用其他机器远程登录到这个引导界面进行安装操作。

$ sudo kvm -m 511--cdrom ubuntu-10.04.1-server-amd64.iso -drive file=ubuntu.img,if=scsi,index=0 -boot d -net nic -net user -nographic -vnc :0

4)用vncviewer登录引导界面后按照屏幕的提示完成Ubuntu的安装工作(和在自己计算机上安装Ubuntu的过程一样)。需要注意的是,在分区阶段把10GB硬盘全部划分成一个ext4 root分区,不要创建多个分区,也不要创建swap区。

$ vncviewer 10.46.169.190 :0

5)安装完后退出(必要时终结KVM进程),按照下面命令启动刚刚安装好的虚拟机镜像ubuntu.img,如果出现“failed to find romfile“pxe-rtf8139.bin””的错误提示,可以通过安装kvm-pxe解决。

$ sudo kvm -m 511--drive file=ubuntu.img -boot c -nographic -vnc :0kvm: pci_add_option_rom: failed to find romfile /"pxe-rtl8139.bin/"$ sudo apt-get install kvm-pxe

6)再次用VNC登录虚拟机镜像,安装一些必要工具(因为这个镜像将会是模板,所以最好保持最小化,不要装多余的东西)。

$ vncviewer 10.46.169.190 :0$ sudo update$ sudo upgrade$ sudo apt-get install openssh-server cloud-init

7)70-persistent-net.rules会自动添加其他的网络接口,需要删除这个文件避免自动添加除了eth0以外的接口。删除后,系统基本就准备好了,关闭虚拟机。

$ sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules$ sudo shutdown -h now

8)调整Ubuntu镜像。

因为OpenStack只接受ext4文件系统格式的镜像,所以需要把上面创建的raw镜像(kvm-img create-f raw)转换成ext4镜像。下面的步骤用来找出镜像文件里面的分区起点是从哪里开始的。

$ sudo losetup -f ubuntu.img$ sudo losetup -a/dev/loop0: [fb00]:24117291 $ sudo fdisk -cul /dev/loop0Disk /dev/loop0: 10.7 GB, 10737418240 bytes255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectorsUnits = sectors of 1 * 511-= 511-bytesSector size (logical/physical): 511-bytes / 511-bytesI/O size (minimum/optimal): 511-bytes / 511-bytesDisk identifier: 0x000502e6Device BootStart EndBlocks Id System/dev/loop0p1 *2048 20969471 10483711- 83 Linux

上面最后一行的显示分区是从扇区(Sector)2048开始的,每个扇区是512字节,所以是从2048×512=1048576字节开始的。记住这个1048576,下面会用到。

卸载loop后从1048576字节开始挂载。

$ sudo losetup -d /dev/loop0$ sudo losetup -f -o 1048576 ubuntu.img$ sudo losetup -a/dev/loop0: [fb00]:24117291 , offset 1048576

把这整个分区复制到一个新文件,就是一个我们要的ext4文件系统镜像。

$ sudo dd if=/dev/loop0 of=ubuntutemplate.img20969472+0 records in20969472+0 records out10736369664 bytes (11 GB) copied, 107.455 s, 99.9 MB/s

用完loop后必须卸载。

$ sudo losetup -d /dev/loop0

挂载(mount)刚创建的ext4文件系统镜像,并修改分区加载表(/etc/fstab),注释或删除以前的,加上UUID=uec―rootfs一行,这是因为nova-compute在启动虚拟机时根据虚拟机的类型可能会修改磁盘的大小,这会导致磁盘的UUID无效,所以以uec-roots来标识分区。

$ sudo mount -o loop ubuntutemplate.img /mnt$ sudo vi /mnt/etc/fstab#UUID=1dc3a59e-faab-41ee-b231-3300163676bf / ext4 errors=remount-ro 0 1UUID=uec-roots / ext4 defaults 0 0

把内核(vmlinuz)和内存盘(initrd)文件复制出来,以便后面和虚拟机镜像一起发布到OpenStack云里。使用完虚拟机镜像后必须卸载(unmount)。

$ sudo cp /mnt/boot/vmlinuz-2.6.31-28-server /home/douglas/$ sudo cp /mnt/boot/initrd.img-2.6.31-28-server /home/douglas/$ sudo umount /mnt

把刚才的虚拟机镜像ubuntutemplate.img的文件系统标志改成uec-rootfs。

$ sudo tune2fs -L uec-rootfs ubuntutemplate.imgtune2fs 1.41.14 (21-Dec-2010)

Ubuntu镜像已经做好了,那么就可以发布到云里了。还需要3个东西:虚拟机的内核文件、虚拟机的内存盘文件和虚拟机镜像文件。

$ uec-publish-image -t image --kernel-file vmlinuz-2.6.31-28-server --ramdisk-file initrd.img-2.6.31-28-server amd64 ubuntutemplate.img blogbucketami-644208f3 blogbucket/ubuntutemplate.img.manifest.xml

作者系统中镜像如下:

[email protected]:~$ euca-describe-imagesIMAGE aki-12fe2610 blogbucket/vmlinuz-2.6.38-8-server.manifest.xml available public x86_64 kernel IMAGE ami-6217df26 ttybucket/ttylinux-uec-amd64-12.1_2.6.35-22_1.img. manifest.xmlavailable public i386machine aki-16cb8aa6 ari-2e6b3fd2IMAGE aki-16cb8aa6 ttybucket/ttylinux-uec-amd64-12.1_2.6.35-22_1-vmlinuz. manifest.xmlavailable publici386 kernel IMAGE ari-2e6b3fd1- ttybucket/ttylinux-uec-amd64-12.1_2.6.35-22_1-initrd. manifest.xml available publici386 ramdisk IMAGE aki-0abf52fb uecbucket/maverick-server-uec-amd64-vmlinuz-virtual. manifest.xmlavailable publici386 kernel IMAGE ami-644208f3 blogbucket/ubuntutemplate.img.manifest.xml untarring public x86_64 machine aki-12fe2610ari-765acbffIMAGE ari-765acbff blogbucket/initrd.img-2.6.38-8-server.manifest.xml available public x86_64 ramdiskIMAGE ami-03aebd2e uecbucket/maverick-server-uec-amd64.img.manifest.xml available public i386 machine aki-0abf52fb [email protected]:~$