1. 程式人生 > >Openstack 之 使用disk-image-builder(DIB)制作鏡像

Openstack 之 使用disk-image-builder(DIB)制作鏡像

lse ges org height smo 私有雲 程序 穩定 min

技術分享圖片 技術分享圖片

上面左邊是我的個人微信,如需進一步溝通,請加微信。 右邊是我的公眾號“Openstack私有雲”,如有興趣,請關註。


Openstack中的centos和ubuntu操作系統的鏡像可以直接從社區直接下載下來使用,但是總是感覺有問題,cloud-init初始化程序是通用的,啟動速度很慢,查了一下相關信息,發現是cloud-init進程會去訪問外網一個地址,感覺使用起來用戶體驗很差。手工制作鏡像是最符合實際使用需求的,想定制什麽樣的鏡像都可以,但是有些費時費力。這裏我嘗試使用自動化鏡像生成工具disk-image-builder(DIB)生成鏡像,這個工具可以很方便的生成fedora和ubuntu系列的linux操作系統,對於windows不支持。

DIB是一個OpenStack工具,可以從https://git.openstack.org/cgit/openstack/diskimage-builder/tree/或 https://pypi.python.org/pypi/diskimage-builder/0.1.38 下載 。

DIB使用chroot的環境來構建鏡像。目標是建立一個擁有Nova所需的所有組件的鏡像,如trove所需的數據庫鏡像,ironic所需的支持硬件裸機的鏡像。

操作記錄:


useradd -s /bin/bash -d /opt/stack stack
設置stack賬號密碼為“stack” ,切換到stack用戶執行:
su - stack
$ git clone https://git.openstack.org/openstack/diskimage-builder
使用visudo命令更改stack用戶的sudo權限與root一致,運行命令visudo之後,找到“root    ALL=(ALL)       ALL”,在其後面增加下面這行:
stack   ALL=(ALL)       ALL
$ cd diskimage-builder
$ sudo pip install -r requirements.txt
$ sudo python setup.py install
確保你已經安裝了qemu-img 和kpartx。如果沒有安裝,運行以下命令:
$ sudo yum install -y qemu kpartx

至此,安裝成功,使用 disk-image-create -h 查看該命令的使用方法


制作centos7鏡像:

export DIB_DEV_USER_USERNAME=centos   //初始用戶名centos
export DIB_DEV_USER_PASSWORD=centos   //初始密碼centos
export DIB_DEV_USER_PWDLESS_SUDO=YES   //允許sudo
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"   //cloud-init 的datasource是ConfigDrive, OpenStack
disk-image-create -a amd64 -t raw -o /opt/stack/images/centos7.raw centos7 vm  cloud-init-datasources devuser
註:-a amd64 64位操作系統,-t raw 裸格式,-o 文件路徑,centos7 rm cloud-init-datasources devuser 都是element ,與上面的環境變量相呼應,比如DIB_DEV_USER_USERNAME環境變量在devuser這個element中用到,DIB_CLOUD_INIT_DATASOURCES 在cloud-init-datasources 中用到。


然後上傳鏡像測試。

    $ vi admin-openrc.sh
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=    //你的實際openstack認證keystone地址 
export OS_INTERFACE=internal
export OS_IDENTITY_API_VERSION=3

上傳鏡像:

    $ openstack image create --disk-format raw --file /opt/stack/images/centos7.raw centos7-raw-628


後面通過web界面生成虛擬機實例進行驗證,主要驗證以下幾項:

1.主機名稱註入;

2.是否能根據flavor動態調整磁盤大小;

3.是否能註入密鑰;

註意,生成虛擬機的時候,需要選擇一個帶有DHCPagent的網絡,cloud-init在註入元數據的時候需要訪問地址169.254.169.254 ,這個地址的路由需要DHCPagent提供,否則,cloud-init訪問不到相關元數據,虛擬機生成會出現問題。從另一個角度看,也可以不選網絡,但是需要修改鏡像裏面cloud-init程序配置。


總結:

openstack的使用維護過程中,鏡像的制作和維護是一個重要內容,一般來說都有定制化的需求,比如需要更改yum源,定制安裝包,如果使用手工方法制作非常耗時,使用官網直接下載的鏡像不能做到定制,使用disk-image-builder可以大大提高制作鏡像的效率。

disk-image-builder的原理是把最初啟動虛擬機時安裝操作系統完成後的鏡像保存為base鏡像,基於該base鏡像掛載到本地,然後chroot到根分區,根據不同的定制需要增加不同的模塊,安裝完成後保存為特定格式的鏡像文件。

使用DIB還有一個優點,就是每次制作完成一個鏡像,比如centos7,第一次制作,會從網上下載基礎鏡像文件,第二次以及以後制作同一版本的鏡像時,直接使用原來下載下來的鏡像緩存文件,非常快。另外,如果網絡不穩定,還可以提前準備好基礎鏡像,然後後面指定本地文件作為基礎鏡像。

通過瀏覽element內的相關目錄和環境變量,發現有很多可以挖掘的東西,比如裏面有一個docker的element,可以從docker中生成鏡像。

對於openstack的ironic組件需要對硬件設備支持的鏡像,對trove組件需要用到數據庫鏡像,這些需求可以引入新的element實現,如果手工來制作這些鏡像,可以想象一下工作量是非常大的。

即使不用ironic組件和trove數據庫組件,我們也可以利用相關的element來生成數據庫鏡像或者支持硬件設備支持的鏡像,也可以輸出格式是iso的鏡像。

總之,通過豐富的element可以非常靈活高效的定制自己需要的鏡像,不管這個鏡像是給openstack用,還是直接制作成為iso鏡像刻錄成光盤裝機使用都可以。


Openstack 之 使用disk-image-builder(DIB)制作鏡像