Openstack 之 使用disk-image-builder(DIB)制作鏡像
上面左邊是我的個人微信,如需進一步溝通,請加微信。 右邊是我的公眾號“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)制作鏡像