手動制作Openstack鏡像
本文以制作Centos7.2鏡像為例,詳細介紹制作鏡像的步驟,該鏡像上傳到Openstack Glance中,相對于官方鏡像,增加如下幾個功能:
- 支持密碼注入功能(nova boot時通過--admin-pass參數指定設置初始密碼)
- 支持根分區自動調整(根分區自動調整為flavor disk大小,而不是原始鏡像分區大小)
- 支持動態修改密碼(使用nova set-password命令可以修改管理員密碼)
本文制作鏡像的宿主機操作系統為Ubuntu14.04,開啟了VT功能(使用kvm-ok命令驗證)并安裝了libvirt系列工具,包括virsh、virt-manager、libguestfs-tools等。
1.下載鏡像
直接訪問官方鏡像地址下載,注意選擇中國的鏡像源,相對國外鏡像下載速率比較快,進入后選擇版本為7.2.1511,在isos目錄下下載x86_64的Minimal鏡像,如果網速不給力,最好不要選擇下載Netinstall鏡像,因為這會在安裝時聯網下載大量的軟件包,重新安裝時需要重新下載這些軟件包,浪費大量的時間。
2.創建虛擬機
首先需要創建一個qcow2格式鏡像文件,用于作為虛擬機的磁盤,大小10G足矣。
- qemu-img create -f qcow2 centos.qcow2 10G # create disk image
使用以下腳本快速創建并啟動虛擬機:
- NAME=centos
- ROOT_DISK=centos.qcow2
- CDROM=`pwd`/CentOS-7-x86_64-Minimal-1511.iso
- sudo virt-install --virt-type kvm --name $NAME --ram 1024 \
- --disk $ROOT_DISK,format=qcow2 \
- --network network=default \
- --graphics vnc,listen=0.0.0.0 --noautoconsole \
- --os-type=linux --os-variant=rhel7 \
- --cdrom=$CDROM
啟動完成后,使用vnc client連接,個人認為直接使用virt-manager或者virt-viewer更直接方便。
3. 安裝OS
進入虛擬機控制臺可以看到Centos的啟動菜單,選擇Install Centos 7,繼續選擇語言后將進入INSTALLION SUMMARY,其中大多數配置默認即可,SOFTWARE SELECTION選擇Minimal Install,INSTALLATION DESTINATION需要選擇手動配置分區,我們只需要一個根分區即可,不需要swap分區,文件系統選擇ext4,存儲驅動選擇Virtio Block Device,如圖:
配置完成后就可以開始安裝了,在CONFIGURATION中設置root臨時密碼,自己記住即可,制作完后cloud-init將會重新設置root初始密碼。
大約幾分鐘后,即可自動完成安裝配置工作,最后點擊右下角的reboot重啟退出虛擬機。
4. 配置OS
安裝好系統后,還需要進行配置才能作為glance鏡像使用。首先需要啟動虛擬機(雖然上一步執行的是reboot,但貌似并不會自動啟動):
- sudo virsh start centos
客戶的云主機需要支持root ssh遠程登錄,因此需要開啟root遠程ssh登錄功能,修改配置文件/etc/ssh/sshd_config并修改PermitRootLogin值為yes,重啟ssh服務生效:
- sudo systemctl restart sshd
接下來的所有操作均通過宿主機ssh登錄到虛擬機執行,這樣方便復制(默認終端不和宿主機共享粘貼緩沖區)。
為了加快安裝速度,建議配置本地軟件源倉庫,若沒有本地鏡像倉庫,則選擇國內的軟件源,會相對官網的速度下載要快,提高執行效率。
- mv my_repo.repo /etc/yum.repos.d/
hypervisor通過發送對應的信號、事件等到虛擬機中,虛擬機根據接收的信號或者事件執行相應的操作,比如關機、重啟等。虛擬機需要開啟acpid(Advanced Configuration and Power Interface event daemon)服務,關于acpid的更多資料,參考Arch文檔中關于acpid的介紹以及使用。為了開啟該服務,首先需要安裝acpid服務,并設置開機自啟動:
- yum install -y acpid
- systemctl enable acpid
為了方便調試排錯,虛擬機需要打開boot日志功能,并指定console,這樣nova console-log才能獲取虛擬機啟動時的日志。修改配置文件/etc/default/grub,設置GRUB_CMDLINE_LINUX為:
- GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"
Openstack動態修改root密碼以及密鑰,需要虛擬機內部安裝agent程序,agent會創建一個虛擬串行字符設備,用于和外部qemu通信,qemu通過這個虛擬字符設備向agent發送事件指令,agent接收事件并執行相應的指令完成用戶功能,更多關于qemu-guest-agent請參考官方文檔。ISO鏡像中默認沒有預安裝agent,我們需要手動安裝qemu-guest-agent:
- yum install -y qemu-guest-agent
配置qemu-ga,修改/etc/sysconfig/qemu-ga,配置內容為:
- TRANSPORT_METHOD="virtio-serial"
- DEVPATH="/dev/virtio-ports/org.qemu.guest_agent.0"
- LOGFILE="/var/log/qemu-ga/qemu-ga.log"
- PIDFILE="/var/run/qemu-ga.pid"
- BLACKLIST_RPC=""
- FSFREEZE_HOOK_ENABLE=0
虛擬機需要從metadata服務中獲取元數據,比如啟動時的主機名、初始化密碼等,為了使虛擬機能夠和外部的metadata service通信,需要禁用默認的zeroconf route:
- echo "NOZEROCONF=yes" >> /etc/sysconfig/network
最后安裝cloud-init,cloud-init是虛擬機第一次啟動時執行的腳本,主要負責從metadata服務中拉取配置信息,完成虛擬機的初始化工作,比如設置主機名、初始化密碼以及注入密鑰等。我們通常會實現自己的cloud-init,用來完成虛擬機的一些定制化初始化工作,如果沒有自己的cloud-init,直接從官方源下載即可。
- # yum install -y cloud-init-0.7.6-bzr1.el7.centos.noarch.rpm
- yum install -y cloud-init
虛擬機制作鏡像時指定了根分區大小(比如我們設置為10GB),為了使虛擬機能夠自動調整為flavor disk指定的根磁盤大小,即自動擴容, 我們需要安裝glowpart(老版本叫growroot)并完成以下配置:
- yum update -y
- yum install -y epel-release
- yum install -y cloud-utils-growpart.x86.64
- rpm -qa kernel | sed 's/^kernel-//' | xargs -I {} dracut -f /boot/initramfs-{}.img {}
自此,鏡像基本制作完成了,最后執行關機操作。
- /sbin/shutdown -h now
5.清理工作
在宿主機上運行以下命名,移除宿主機信息,比如mac地址等。
- virt-sysprep -d centos # cleanup tasks such as removing the MAC address references
最后,刪除虛擬機,因為鏡像已經制作完成,可以上傳到glance了。
- virsh undefine centos # 刪除虛擬機
6.上傳鏡像
鏡像制作完成,上傳centos.qcow2到glance服務中,如果使用ceph作為存儲后端,為了提高上傳速度(使用glance上傳走的http方式,必然很慢),我們需要另辟蹊徑,我們只使用glance創建實例記錄,并不使用glance上傳鏡像,而是借用ceph rbd的import操作實現鏡像上傳,包括以下幾個步驟:
- 使用qemu-img轉換qcow2格式為raw格式。
- qemu-img convert -f qcow2 -O raw centos.qcow2 centos.raw
- 使用glance create創建一條鏡像記錄并記錄ID(不需要指定文件路徑以及其他屬性,只是占個坑)
- glance image-create
- 使用ceph import鏡像并設置快照(glance實現)
- rbd --pool=glance_images import centos.raw --image=$IMAGE_ID --new-format --order 24
- rbd --pool=glance_images --image=$IMAGE_ID --snap=snap snap create
- rbd --pool=glance_images --image=$IMAGE_ID --snap=snap snap protect
- 使用glance命令設置鏡像的location url:
- FS_ROOT=`ceph -s | grep cluster | awk '{print $2}'`
- glance location-add --url rbd://$FS_ROOT/glance_images/$IMAGE_ID/snap $IMAGE_ID
- 完善鏡像信息,比如name等其他屬性:
- glance image-update --name="centos-7.2-64bit" --disk-format=raw --container-format=bare
- # 配置qemu-ga
- glance image-update --property hw_qemu_guest_agent=yes $IMAGE_ID
- # ... 其他屬性配置
務必設置property的hw_qemu_guest_agent=yes,否則libvert啟動虛擬機時不會生成qemu-ga配置項,導致虛擬機內部的qemu-ga由于找不到對應的虛擬串行字符設備而啟動失敗,提示找不到channel。
7.驗證
首先使用創建的鏡像啟動一臺新云主機(終于叫云主機,不叫虛擬機了==),如果使用nova CLI工具,需要傳遞--admin-pass參數并指定密碼,并指定flavor,要求disk大小為20GB。如果使用Openstack dashborad創建,需要簡單配置下dashborad使其支持配置云主機密碼面板,如圖:
創建成功后進入控制臺,使用root賬號以及設置的新密碼,如果使用創建時設置的密碼登錄成功,說明注入密碼成功。
接下來運行以下命令檢查磁盤是否自動調整大小:
- lsblk
- df -h
如圖:
鏡像原始根分區大小為10GB,如果lsblk顯示vda大小為20GB,說明文件系統自動識別了磁盤大小。如果df顯示/dev/sda1size為20GB,說明根分區自動完成了擴容操作。
接下來測試動態修改密碼,由于默認dashboard頁面沒有實現修改密碼面板功能,我們需要在后臺操作。
首先使用nova list獲取云主機ID,然后調用nova set-password命令修改密碼:
- nova set-password $ID
重復輸入兩次新的密碼,如果執行成功,不會有任何輸出。
回到終端,退出之前的登錄,然后使用新的密碼重新登錄,如果登錄成功,則說明動態修改密碼成功!
若以上其中一個步驟失敗,則說明鏡像制作失敗,請檢查以上步驟是否疏漏。
【本文是51CTO專欄作者“付廣平”的原創文章,如需轉載請通過51CTO獲得聯系】