目錄
鏡像支持功能
- 支持密碼注入功能(注:通過 nova boot --admin-pass 指令設置初始密碼)。
- 支持動態修改密碼(注:通過 nova set-password 指令重設密碼)。
- 支持根分區大小(根據 Flavor 系統盤參數)自動調整。
- 支持配置初始化(SSH key、hostname 等)。
手動製作
啓動虛擬機環境
-
下載 ISO 鏡像文件:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-minimal.iso
-
生成 QCOW2 文件
qemu-img create -f qcow2 centos8.2.qcow2 10G
- 創建並啓動虛擬機:
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
- 安裝操作系統:使用 VNC 或者使用 virt-manager、virt-viewer 連接圖形化安裝界面。注:只分配 / 根分區。
配置虛擬機環境
需要首先對虛擬機進行一系列的配置,然後才能作爲 OpenStack 雲主機的鏡像使用。
- 配置支持 SSH 遠程登錄。
systemctl enable sshd
- 安裝 ACPID
yum install -y acpid
systemctl enable acpid
ACPID 是一個服務進程,用於處理電源相關的事件,將內核的電源事件轉發給用戶態的應用程序,告訴應用程序安全退出。Libvirt 可以向虛擬機發送 acpid 事件來進行電源操作,例如:軟關機、硬關機、軟重啓等。
- 配置 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 命令可以獲取該文件內容。
- 安裝 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
- 禁止 zeroconf 服務,啓動的話會導致 169.254.0.0/16 路有衝突,影響 Metadata API。
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
- 安裝 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。
- 安裝 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 {}
-
安裝期望的的基礎軟件。
-
清理無用數據,關閉虛擬機電源。
-
移除本地信息(網卡 MAC 地址配置的、resolve.conf 配置等)。做模塊或鏡像時,最重要的是移除本地信息。
virt-sysprep -d centos8.2
- 刪除虛擬機,並保存 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 環境了。
- 上傳 ISO 鏡像:
openstack image create \
--file ~/CentOS-7-x86_64-Minimal-1804.iso \
--public --container-format=bare \
--disk-format=raw \
centos-7.iso
- 創建空卷:
openstack volume create --bootable --size 10 centos7-bootable-vol
- 創建雲主機,使用空卷作爲系統盤,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
-
啓動雲主機後可以看見熟悉的操作系統安裝界面。注:只需要分配 / 根分區。
-
安裝一系列軟件,同上。
-
將安裝好操作系統的 “空卷” 作爲一個鏡像上傳到 Glance:
cinder upload-to-image <centos7-bootable-vol id> \
--disk-format qcow2 \
--force \
centos7-image
- 從 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 雲主機制作成鏡像
在工作中,也可能會出現這種情況,只需要簡單的兩步即可實現:
- 爲虛擬機執着快照
- 架構快照下載成爲鏡像文件