Build Cloud-Init Image for Oracle Linux

Tuesday, October 26, 2021

开头

早前 CentOS 公告不再提供 Centos 8 的支持,并转到 Stream 分支去。虽然不懂什么意思反正就是不爽,然后找了一个替代品 Oracle Linux 并且内核很新感觉不错。

用了个把月后也不错所以就制作一个 Cloud-init 镜像方便虚拟机快速部署,Oracle Linux 官方没有直接提供 Cloud-init 镜像所以需要自己制作(也可能是我找不到)。

准备

因为 Oracle Cloud 自己是有 Cloud-init 镜像的给虚拟机的,但是找了一轮也只找到了发布日志。最后找到了这个官方工具这篇文章

接着在 Oracle Cloud 上面创建了一台免费虚拟机,环境都装完了才发现不支持嵌套虚拟化,所以最后还是在自己 PVE 上面装了一个 OL8 才搞成功的。

由于官方工具在 OL8 上面测试通过,我也用 OL8 部署,如果用 CentOS 或者 Redhat 的话就自己研究了。

Oracle Linux 下载地址:https://yum.oracle.com/oracle-linux-isos.html

虚拟环境

安装官方工具的依赖与 vagrant-libvirt 的依赖。

由于我用的是 kvm 虚拟机也可以按照官方文章用 VirtualBox 。

dnf update -y
dnf install -y yum-utils 
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
dnf module install virt python27
dnf install kpartx qemu-img packer vagrant \
            gcc libvirt libvirt-devel libxml2-devel make ruby-devel libguestfs-tools \
            git
alternatives --set python /usr/bin/python2

安装 vagrant-libvirt 插件

export CONFIGURE_ARGS="with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/usr/lib64"
vagrant plugin install vagrant-libvirt

启动 libvirt 并检查虚拟化

systemctl enable --now libvirtd
virt-host-validate

运行上面的第二条命令后会输出下面内容,如果第一行显示 PASS 一般就没问题了。

  QEMU: Checking for hardware virtualization                    : PASS
  QEMU: Checking if device /dev/kvm exists                      : PASS
  QEMU: Checking if device /dev/kvm is accessible               : PASS
  QEMU: Checking if device /dev/vhost-net exists                : PASS
  QEMU: Checking if device /dev/net/tun exists                  : PASS
  QEMU: Checking for cgroup 'cpu' controller support            : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support        : PASS
  QEMU: Checking for cgroup 'cpuset' controller support         : PASS
  QEMU: Checking for cgroup 'memory' controller support         : PASS
  QEMU: Checking for cgroup 'devices' controller support        : PASS
  QEMU: Checking for cgroup 'blkio' controller support          : PASS
  ...

制作镜像

首先修改一下配置文件 env.properties,内存不能少于 768 否则 OL8 无法启动,磁盘(DISK_SIZE_GB)最小 3GB(需要修改 kickstart 配置否则出错),QEMU_BINARY 需要手动配置绝对路径否则会找不到命令。

其他选项根据实际情况查看官方工具仓库内 env.properties 文件的注释进行修改。

WORKSPACE=/root/images
ISO_URL=file:///mnt/mac/template/iso/OracleLinux-R8-U4-x86_64-dvd.iso
ISO_CHECKSUM=a55e97eec90e8c810f23625a349af816e1fdf162428e2bf96b752ff562106d4b

DISTR="ol8-slim"
CLOUD="oci"
BUILD_NUMBER=1

SSH_PASSWORD=0000

CPU_NUM=2
MEM_SIZE=768
DISK_SIZE_GB=10

PACKER_BUILDER="qemu.x86-64"
QEMU_BINARY="/usr/libexec/qemu-kvm"

CLOUD_INIT=yes
CLOUD_USER=ol

如果需要制作尽可能小的磁盘镜像文件需要修改 kickstart cfg 配置文件,路径位于 oracle-linux-image-tools/distr/ol8-slim/ol8-ks.cfg.

在磁盘分区的位置修改成下面这样,可以注释或者删掉 swap 分区一行,然后 root 分区修改成 2000 (2GB)。

# Disk partitioning information
part /boot    --fstype="xfs"  --ondisk=sda --size=500  --label=/boot
#part swap     --fstype="swap" --ondisk=sda --size=4096 --label=swap
part /        --fstype="xfs"  --ondisk=sda --size=2000 --label=root  --grow

最后运行下面命令开始制作镜像

./bin/build-image.sh --env env.properties

等待大概20-30分钟,如无意外则会出现类似于下面的提示表示已经制作完毕。

+++ build-image.sh: Parse arguments
+++ build-image.sh: Load environment
+++ build-image.sh: Stage Packer files
+++ build-image.sh: Stage kickstart file
+++ build-image.sh: Generate Packer configuration file
+++ build-image.sh: Run Packer
    build-image.sh: Spawn HTTP server
    build-image.sh: Invoke Packer

...

    build-image.sh: Package image
+++ build-image.sh: Cleanup Workspace
+++ build-image.sh: All done
+++ build-image.sh: Image available in /data/workspace/OL8U4_x86_64-oci-b0

其他参考文章

远离京东第三方商家

禁用 macOS 系统更新