讀古今文學網 > OpenStack系統架構設計實戰 > 2.9.4 創建鏡像 >

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

作者系統中鏡像如下:

douglas@ubuntu:~$ 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 douglas@ubuntu:~$