[zz]為 OpenStack Nova 製作 Ubuntu 映象

weixin_33816946發表於2012-02-15

最近超級忙,被 Mesh Potato 的專案折騰的不行,發現只要什麼東西沾上 “分散式、叢集” 這些東西事情就變得格外複雜,一臺 Asterisk 伺服器做 VoIP 容易,n 臺 Asterisk 伺服器做叢集就不容易;一臺 Xen/KVM 伺服器做虛擬機器容易,n 臺 Xen/KVM 伺服器做雲端計算就不是那麼容易。上星期我們介紹了在 Ubuntu 上安裝和配置 OpenStack Nova,今天來進一步介紹如何在 OpenStack Nova 環境裡製作虛擬機器模板(映象)以及建立虛擬機器執行例項(以 Ubuntu 為例子)。為了和我們平時說的 “VMware/Xen/KVM/VirtualBox 虛擬機器” 區分開,VPSee 在這裡把在 OpenStack Nova、OpenNebula 這樣的雲端計算平臺上執行的虛擬機器稱為 “雲虛擬機器”。簡單說在 OpenStack Nova 平臺上執行一個 ubuntu 虛擬機器的流程是:先製作一個 ubuntu 虛擬機器映象(模板),然後再以這個映象為模板來建立 ubuntu 虛擬機器(例項)。

安裝 Ubuntu 映象

首先下載要安裝的 ubuntu 版本:

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

建立一個 10GB 大小的 “硬碟”(raw 格式):

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

使用剛才下載的 ubuntu “安裝盤” 和剛建立的 “硬碟” 引導啟動系統,為了簡單起見,VPSee 在這裡使用 kvm 虛擬技術,避開 xen 繁瑣的配置。-vnc 引數代表開啟 vnc 訪問,以便可以用其他機器遠端登入到這個引導介面進行安裝操作:

$ sudo kvm -m 512 -cdrom ubuntu-10.04.2-server-amd64.iso \
-drive file=ubuntu.img -boot d -nographic -vnc :0

用 vncviewer 登入引導介面後按照螢幕的提示完成 ubuntu 的安裝工作(和在自己電腦上安裝 ubuntu 過程一樣)。需要注意的是在分割槽階段把 10GB 硬碟全部劃分成一個 ext4 root 分割槽,不要建立多個分割槽也不要建立 swap 區:

$ vncviewer 172.16.39.111:5900

安裝完後退出(必要時 kill 掉 kvm 程式),按照下面命令啟動剛剛安裝好的虛擬機器映象 ubuntu.img,如果出現 failed to find romfile “pxe-rtf8139.bin” 的錯誤提示可以通過安裝 kvm-pxe 解決:

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

$ sudo apt-get install kvm-pxe

再次用 vnc 登入虛擬機器映象,安裝一些必要工具(因為這個映象將會是模板,所以最好保持最簡最小化,不要亂裝東西):

$ vncviewer 172.16.39.111:5900

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install openssh-server cloud-init

70-persistent-net.rules 會自動新增其他的網路介面,需要刪除這個檔案避免自動新增除了 eth0 以外的介面。刪除後系統基本就準備好了,關閉虛擬機器:

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

$ sudo shutdown -h now

調整 Ubuntu 映象

因為 OpenStack 只接受 ext4 檔案系統格式的映象,所以需要把上面建立的 raw 映象(kvm-img create -f raw)轉換成 ext4 映象。下面的步驟用來找出映象檔案裡面的分割槽起點是從哪裡開始的:

$ sudo losetup -f ubuntu.img
$ sudo losetup -a
/dev/loop0: [fb00]:24117291 (/home/vpsee/ubuntu.img)

$ sudo fdisk -cul /dev/loop0

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000502e6

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        2048    20969471    10483712   83  Linux

上面最後一行顯示分割槽是從扇區(sector)2048開始的,每個扇區是512個位元組,所以是從 2048 x 512 = 1048576個位元組開始的。記住這個1048576,下面會用到。

解除安裝 loop 後重新從1048576位元組開始掛載:

$ sudo losetup -d /dev/loop0

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

把這整個分割槽拷貝到一個新檔案就是一個我們要的 ext4 檔案系統映象:

$ sudo dd if=/dev/loop0 of=ubuntutemplate.img
20969472+0 records in
20969472+0 records out
10736369664 bytes (11 GB) copied, 107.455 s, 99.9 MB/s

用完 loop 後記得解除安裝:

$ sudo losetup -d /dev/loop0

掛載(mount)剛建立的 ext4 檔案系統映象,並修改分割槽載入表(/etc/fstab),註釋或刪除以前的,加上 UUID=uec-rootfs 一行:

$ sudo mount -o loop ubuntutemplate.img /mnt

$ sudo vi /mnt/etc/fstab
#UUID=1dc3a59e-faab-41ee-b232-3300163676bf / ext4 errors=remount-ro 0 1
UUID=uec-rootfs                           / ext4 defaults          0 0

把核心(vmlinuz)和記憶體盤(initrd)檔案拷貝出來以便後面和虛擬機器映象一起釋出到OpenStack 雲裡。使用完虛擬機器映象後記得解除安裝(unmount):

$ sudo cp /mnt/boot/vmlinuz-2.6.32-28-server /home/vpsee/
$ sudo cp /mnt/boot/initrd.img-2.6.32-28-server /home/vpsee/

$ sudo umount /mnt

把剛才的虛擬機器映象 ubuntutemplate.img 的檔案系統標誌改成 ‘uec-rootfs’:

$ sudo tune2fs -L uec-rootfs ubuntutemplate.img
tune2fs 1.41.14 (22-Dec-2010)

釋出 Ubuntu 映象

好了,ubuntu 映象已經做好了,現在可以釋出到雲裡了,需要3個東西,虛擬機器的核心檔案、虛擬機器的記憶體盤檔案和虛擬機器映象檔案:

$ uec-publish-image -t image --kernel-file vmlinuz-2.6.32-28-server \
--ramdisk-file initrd.img-2.6.32-28-server amd64 ubuntutemplate.img mybucket
ami-00000006	mybucket/ubuntutemplate.img.manifest.xml

等待一段時間後出現 ami-00000006 mybucket/ubuntutemplate.img.manifest.xml 表示我們剛製作的 ubuntu 映象已經正式釋出到雲裡,以後就可以以這個映象為模板來快速生成虛擬機器例項(instance)。可以通過 euca-describe-images 來檢視:

$ euca-describe-images

IMAGE	aki-00000001	mybucket/vmlinuz-2.6.32-28-server.manifest.xml		availablpublic		x86_64	kernel
IMAGE	ari-00000002 	mybucket/initrd.img-2.6.32-28-server.manifest.xml		available	public		x86_64	ramdisk
IMAGE	ami-00000003	mybucket/ubuntutemplate.img.manifest.xml		untarring	public		x86_64	machine	aki-00000001	ari-00000002

第一個 Ubuntu 虛擬機器例項

有了 ubuntu 映象(模板)以後我們就可以以這個 “映象” 為模板來為雲端計算使用者建立 n 個 ubuntu 虛擬機器(作業系統)例項,不過在執行例項之前需要 key:

$ euca-add-keypair mykey > mykey.priv
$ chmod 600 mykey.priv 

$ euca-describe-keypairs
KEYPAIR	mykey	76:7d:93:88:a0:e5:3e:5d:4b:62:cd:85:c5:23:7a:05

$ euca-run-instances -k mykey -t m1.tiny ami-00000003
RESERVATION	r-n0lpdme5	vpseecloud	default
INSTANCE	i-00000001	ami-00000003			scheduling	mykey (vpseecloud, None)	0		m1.tin2011-05-20T14:00:34Z	unknown zone

上面使用 euca-run-instances 建立一個例項後可以用 nova-manage 命令看到:

$ sudo nova-manage vm list
instance   node            type       state      launched            image        kernel       ramdisk       project    user       zone       index
i-00000001 node01           launching  None                3            1            2             vpseecloud    vpsee       None       0

還記得上篇:在 Ubuntu 上安裝和配置 OpenStack Nova 的建立網路部分嗎?可以看看現在的雲裡面 IP 分配情況:

$ sudo nova-manage network list
network           	netmask        	start address  	DNS
192.168.3.0/25    	255.255.255.128	192.168.3.3    	None

剛才用 euca-run-instances 啟動的一個 ubuntu 虛擬機器例項的 IP 就是從 192.168.3.3 開始的,所以 ssh 登入這個 IP 就登上了我們的第一個雲虛擬機器:)

$ ssh 192.168.3.3
vpsee@i-00000001:~$

想製作 CentOS 虛擬機器映象的話可以看:為 OpenStack Nova 製作 CentOS 映象;想製作 Windows 虛擬機器映象的話可以看:為 OpenStack Nova 製作 Windows 映象

相關文章