目錄
文章目錄
鏡像支持功能
- 支持密碼注入功能(注:經過 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.isolinux
-
生成 QCOW2 文件ubuntu
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 雲主機的鏡像使用。vim
- 配置支持 SSH 遠程登陸。
systemctl enable sshd
- 安裝 ACPID
yum install -y acpid systemctl enable acpid
ACPID 是一個服務進程,用於處理電源相關的事件,將內核的電源事件轉發給用戶態的應用程序,告訴應用程序安全退出。Libvirt 能夠向虛擬機發送 acpid 事件來進行電源操做,例如:軟關機、硬關機、軟重啓等。centos
- 配置 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。ssh
<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 進程則不斷輪詢獲取指令並執行。ide
- 安裝:
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 {}
-
安裝指望的的基礎軟件。ui
-
清理無用數據,關閉虛擬機電源。
-
移除本地信息(網卡 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 雲主機制做成鏡像
在工做中,也可能會出現這種狀況,只須要簡單的兩步便可實現:
- 爲虛擬機執着快照
- 架構快照下載成爲鏡像文件