OpenStack 雲主機鏡像製作

目錄

鏡像支持功能

  • 支持密碼注入功能(注:通過 nova boot --admin-pass 指令設置初始密碼)。
  • 支持動態修改密碼(注:通過 nova set-password 指令重設密碼)。
  • 支持根分區大小(根據 Flavor 系統盤參數)自動調整。
  • 支持配置初始化(SSH key、hostname 等)。

手動製作

啓動虛擬機環境

  1. 下載 ISO 鏡像文件:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-minimal.iso

  2. 生成 QCOW2 文件

qemu-img create -f qcow2 centos8.2.qcow2 10G
  1. 創建並啓動虛擬機:
sudo virt-install --virt-type kvm --name centos8.2 \ 
    --ram 1024 \ 
    --disk centos8.2.qcow2,format=qcow2 \ 
    --network network=default \ 
    --graphics vnc,listen=0.0.0.0 --noautoconsole \ 
    --os-type=linux --os-variant=rhel8 \ 
    --cdrom=CentOS-8.2.2004-x86_64-minimal.iso
  1. 安裝操作系統:使用 VNC 或者使用 virt-manager、virt-viewer 連接圖形化安裝界面。注:只分配 / 根分區。

配置虛擬機環境

需要首先對虛擬機進行一系列的配置,然後才能作爲 OpenStack 雲主機的鏡像使用。

  1. 配置支持 SSH 遠程登錄。
systemctl enable sshd
  1. 安裝 ACPID
yum install -y acpid
systemctl enable acpid

ACPID 是一個服務進程,用於處理電源相關的事件,將內核的電源事件轉發給用戶態的應用程序,告訴應用程序安全退出。Libvirt 可以向虛擬機發送 acpid 事件來進行電源操作,例如:軟關機、硬關機、軟重啓等。

  1. 配置 Serial Console 日誌輸出
$ vim /etc/default/grub

GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8" 

$ grub2-mkconfig -o /boot/grub2/grub.cfg

通過這個配置,內核日誌會以 115200 的波特率同時發送到 tty0 和 ttyS0(串行端口)設備。Libvirt 可以通過一個普通文件模擬這個串行端口來獲得日誌輸出:

<serial type='file'>
      <source path='/var/lib/nova/instances/99579ce1-f4c4-4031-a56c-68e85a3d037a/console.log'/>
      <target port='0'/>
</serial>

注:執行 nova console-log 命令可以獲取該文件內容。

  1. 安裝 QEMU Guest Agent 守護進程,通過 QGA 建立一個 Channel,宿主機可以和虛擬機進行通信並執行管理操作,例如:設置密碼。

這個 Channel 在宿主機上表現爲一個 UNIX Socket,如:/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00003c2c.sock;而在虛擬機中表現爲一個串口設備,如:/dev/virtio-ports/org.qemu.guest_agent.0。

<channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00003c2c.sock'/>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>

通過 Channel,宿主機將 QGA 操作指令寫入到 Socket 文件中,虛擬機的 QGA 進程則不斷輪詢獲取指令並執行。

  • 安裝:
yum install -y qemu-guest-agent
  • 修改 /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
  • 啓動
systemctl start qemu-guest-agent.service
systemctl enable qemu-guest-agent.service
  1. 禁止 zeroconf 服務,啓動的話會導致 169.254.0.0/16 路有衝突,影響 Metadata API。
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
  1. 安裝 Cloud Init,用於與 Metadata API 或 Config Drive 配合完成雲主機的初始化設置。
yum install -y cloud-init

systemctl start cloud-init.service
systemctl enable cloud-init.service

默認的,cloud-init 會關閉 SSH 密碼認證,採用 SSh key 的方式進行登錄。如有需要,則修改配置文件使其打開密碼認證登錄方式:

$ vi /etc/cloud/cloud.cfg

 users:
   - default
     
  disable_root: 1
  ssh_pwauth: 1   // 默認爲 0, 改爲 1。
  1. 安裝 growpart,用於自動調整系統盤的根分區大小。
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 {} 
  1. 安裝期望的的基礎軟件。

  2. 清理無用數據,關閉虛擬機電源。

  3. 移除本地信息(網卡 MAC 地址配置的、resolve.conf 配置等)。做模塊或鏡像時,最重要的是移除本地信息。

virt-sysprep -d centos8.2
  1. 刪除虛擬機,並保存 QCOW2 鏡像文件。
virsh undefine centos8.2

創建 Glance 鏡像

glance image-create \
    --file centos8.2.qcow2 \ 
    --disk-format qcow2 \ 
    --container-format bare \ 
    --name CentOS-8.2 \
    --property hw_qemu_guest_agent=yes \ 
    --progress

使用 OpenStack 環境製作

製作的方式和上述的流程大同小異,區別在於利用了 OpenStack 的基礎環境,例如:Nova、Cinder、Glance,所以就不需要我們再找一個 QEMU-KVM 環境了。

  1. 上傳 ISO 鏡像:
openstack image create \
    --file ~/CentOS-7-x86_64-Minimal-1804.iso \
    --public --container-format=bare \
    --disk-format=raw \
    centos-7.iso
  1. 創建空卷:
openstack volume create --bootable --size 10 centos7-bootable-vol
  1. 創建雲主機,使用空卷作爲系統盤,ISO image 作爲啓動盤:
 nova boot \
      --flavor m1.medium  \
     --nic net-name=test-net \
     --security-groups test-security-group  \
     --block-device id=<centos7-bootable-vol id>, source=volume,dest=volume,size=5,type=disk,bootindex=0 \ 
     --block-device id=<ISO image id>,source=image,dest=volume,bus=ide,type=cdrom,size=1,bootindex=1 \ 
     test-vm
  1. 啓動雲主機後可以看見熟悉的操作系統安裝界面。注:只需要分配 / 根分區。

  2. 安裝一系列軟件,同上。

  3. 將安裝好操作系統的 “空卷” 作爲一個鏡像上傳到 Glance:

cinder upload-to-image <centos7-bootable-vol id> \ 
    --disk-format qcow2 \
    --force \
    centos7-image 
  1. 從 Glance 中導出鏡像文件到本地:
openstack image save centos7-image --file centos7-image.qcow2

使用 DIB 半自動化工具製作

DIB(Disk image builder)是 OpenStack 的子項目,專門用於構建 OpenStack 鏡像。

DIB 把製作鏡像的常見步驟封裝成爲腳本,比如:創建用戶、配置 YUM 源、安裝 cloud-init、部署 tgtadm 等。這些腳本稱爲 elements,位於 diskimage-builder/diskimage_builder/elements 路徑下,可以根據自己的需求定製 elements。elements 之間會有依賴,通過 element-deps 文件說明,比如 elements centos7 的 element-deps 爲:

  • cache-url
  • redhat-common
  • rpm-distro
  • source-repositories
  • yum

DIB 會首先下載一個 base 鏡像,然後通過用戶指定的 elements,一個個的 chroot 進去執行 element 包含的腳本,從而完成鏡像的製作,整個過程不需要啓動虛擬機,這裏應用了 chroot 操作系統虛擬化技術。

製作 ubuntu 14.04 鏡像:

export DIB_RELEASE=trusty
disk-image-create -o ubuntu-trusty.qcow2 vm ubuntu

創建 Trove percona 鏡像:

disk-image-create \ 
    -a amd64 \ 
    -x vm ubuntu cloud-init-datasources ubuntu-trusty-guest ubuntu-trusty-percona \ 
    -o ubuntu-trusty-percona-5.6.33-guest-image

elements:

  • ubuntu-trustry-guest:安裝 trove-guest-agent
  • ubuntu-trusty-percona:安裝 percona 組件

製作鏡像時,也可以通過環境變量進行配置,比如創建 Ironic 鏡像:

# 密碼爲 secret
export DIB_DEV_USER_PASSWORD=secret

# 支持免密 sudo
export DIB_DEV_USER_PWDLESS_SUDO=YES

# cloud-init 的數據源爲 ConfigDriver 和 OpenStack
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack" 

disk-image-create \
    -o centos7 \
    -x centos7 baremetal dhcp-all-interfaces grub2 cloud-init-datasources devuser

將 OpenStack 雲主機制作成鏡像

在工作中,也可能會出現這種情況,只需要簡單的兩步即可實現:

  1. 爲虛擬機執着快照
  2. 架構快照下載成爲鏡像文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章