在 Amazon 云中使用纯 CentOS 8.1 创建您自己的映像

本指南是同名的“叉子” 文章 关于 CentOS 5.9,并考虑到新操作系统的功能。 目前 AWS Marketplace 中没有来自 centos.org 的官方 Centos8 映像。

大家知道,亚马逊云中的虚拟实例是基于镜像启动的(所谓的 急性心肌梗死)。 亚马逊提供了大量的;您也可以使用第三方准备的公共镜像,当然云提供商对此不承担任何责任。 但有时您需要一个带有必要参数的干净系统映像,而该映像不在映像列表中。

那么唯一的出路就是制作自己的 AMI。

官方文档描述了 过程 创建“实例存储支持的 AMI”。

这种方法的缺点是完成的映像还需要转换为“EBS 支持的 AMI”。 另外值得注意的是驾驶舱图像生成器。 它将允许您创建自定义图像, CLI 或网页 GUI 模式,但是当你已经有 Centos 8 时。

本文将讨论如何在 Amazon 云中创建您自己的 EBS 支持的 AMI,无需中间步骤。

行动计划

  • 准备环境
  • 安装干净的系统并进行必要的设置
  • 拍摄磁盘快照
  • 注册 AMI

准备环境

为了我们的目的,任何 Centos 7 官方实例 任何形状,甚至 t2.micro。 您可以通过 CLI 运行它:

aws ec2 run-instances 
  --image-id ami-4bf3d731 
  --region us-east-1 
  --key-name alpha 
  --instance-type t2.micro 
  --subnet-id subnet-240a8618 
  --associate-public-ip-address 
  --block-device-mappings DeviceName=/dev/sda1,Ebs={VolumeSize=8} 
  --block-device-mappings DeviceName=/dev/sdb,Ebs={VolumeSize=4}

该命令将在指定的子网 ID 所属的 VPC 中引发一个实例。 该子网应该是公共的,SG“默认”允许一切。

现在我们通过ssh登录实例,更新系统,安装 dnf 并重新启动:

sudo yum update -y && sudo yum install -y dnf && sudo reboot

所有进一步的操作将从 root.

安装干净的 Centos 8.1

文件系统布局和分区挂载

DEVICE=/dev/xvdb
ROOTFS=/rootfs
parted -s ${DEVICE} mktable gpt
parted -s ${DEVICE} mkpart primary ext2 1 2
parted -s ${DEVICE} set 1 bios_grub on
parted -s ${DEVICE} mkpart primary xfs 2 100%

mkfs.xfs -L root ${DEVICE}2
mkdir -p $ROOTFS
mount ${DEVICE}2 $ROOTFS

mkdir $ROOTFS/{proc,sys,dev,run}
mount --bind /proc $ROOTFS/proc
mount --bind /sys $ROOTFS/sys
mount --bind /dev $ROOTFS/dev
mount --bind /run $ROOTFS/run

创建目录树

RPM系统允许您轻松快速地为未来的操作系统准备目录树:

PKGSURL=http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages
rpm --root=$ROOTFS --initdb
rpm --root=$ROOTFS -ivh 
  $PKGSURL/centos-release-8.1-1.1911.0.8.el8.x86_64.rpm 
  $PKGSURL/centos-gpg-keys-8.1-1.1911.0.8.el8.noarch.rpm 
  $PKGSURL/centos-repos-8.1-1.1911.0.8.el8.x86_64.rpm

dnf --installroot=$ROOTFS --nogpgcheck --setopt=install_weak_deps=False 
   -y install audit authselect basesystem bash biosdevname coreutils 
   cronie curl dnf dnf-plugins-core dnf-plugin-spacewalk dracut-config-generic 
   dracut-config-rescue e2fsprogs filesystem firewalld glibc grub2 grubby hostname 
   initscripts iproute iprutils iputils irqbalance kbd kernel kernel-tools 
   kexec-tools less linux-firmware lshw lsscsi ncurses network-scripts 
   openssh-clients openssh-server passwd plymouth policycoreutils prefixdevname 
   procps-ng  rng-tools rootfiles rpm rsyslog selinux-policy-targeted setup 
   shadow-utils sssd-kcm sudo systemd util-linux vim-minimal xfsprogs 
   chrony cloud-init 

我认为最好通过安装特定的软件包来执行最后一个命令,并确保忽略推荐的软件包。

如果你愿意,你可以使用这样的东西:

dnf --installroot=$ROOTFS groupinstall base core 
    --excludepkgs "NetworkManager*" 
     -e "i*-firmware"

В yum 没有 --excludepkgs,之前我必须安装组然后删除软件包。

可以使用命令查看包和依赖组的列表 dnf group info core 对于一个团体 core.

操作系统文件定制

让我们为网络、fstab、grub2 创建配置,并使用 AWS 内部 169.254 地址作为 DNS 和 NTP。

cat > $ROOTFS/etc/resolv.conf << HABR
nameserver 169.254.169.253
HABR

cat > $ROOTFS/etc/sysconfig/network << HABR
NETWORKING=yes
NOZEROCONF=yes
HABR

cat > $ROOTFS/etc/sysconfig/network-scripts/ifcfg-eth0  << HABR
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
HABR

cat > $ROOTFS/etc/fstab << HABR
LABEL=root / xfs defaults,relatime 1 1
HABR

sed -i  "s/cloud-user/centos/" $ROOTFS/etc/cloud/cloud.cfg
echo "server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4" >> $ROOTFS/etc/chrony.conf
sed -i "/^pool /d" $ROOTFS/etc/chrony.conf
sed -i "s/^AcceptEnv/# /" $ROOTFS/etc/ssh/sshd_config

cat > $ROOTFS/etc/default/grub << HABR
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto console=ttyS0,115200n8 console=tty0 net.ifnames=0 biosdevname=0"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
HABR

对于那些仍然害怕 SELinux 的人,我建议在 GRUB_CMDLINE_LINUX 中指定 selinux=0。

在 chroot 中重建 initramfs

编辑 grub 和 fstab 文件后,需要重建。
我们执行更新:

KERNEL=$(ls $ROOTFS/lib/modules/) 
chroot $ROOTFS dracut -f -v /boot/initramfs-$KERNEL.img $KERNEL
chroot $ROOTFS grub2-mkconfig -o /boot/grub2/grub.cfg
chroot $ROOTFS grub2-install $DEVICE
chroot $ROOTFS update-crypto-policies --set FUTURE

这里 update-crypto-policies - 可选,对于偏执者:)

对于“出售”,您可以这样做:

chroot $ROOTFS fips-mode-setup --enable
chroot $ROOTFS grub2-mkconfig -o /boot/grub2/grub.cfg
chroot $ROOTFS grub2-install $DEVICE

加载操作系统后,命令 update-crypto-policies --show 将发行 FIPS。

自动启动和垃圾清理

chroot $ROOTFS systemctl enable network.service
chroot $ROOTFS systemctl enable sshd.service
chroot $ROOTFS systemctl enable cloud-init.service
chroot $ROOTFS systemctl mask tmp.mount
dnf --installroot=$ROOTFS clean all
truncate -c -s 0 $ROOTFS/var/log/*.log
rm -rf var/lib/dnf/*
touch $ROOTFS/.autorelabel

autorelabel - 需要在首次启动时自动安装 SELinux 上下文文件。

现在让我们卸载磁盘:

sync
umount $ROOTFS/{proc,sys,dev,run}
umount $ROOTFS

AMI 注册

要从 ebs 磁盘获取 ami,首先需要拍摄该磁盘的快照:

aws ec2 create-snapshot 
    --volume-id vol-09f26eba4c50da110  --region us-east-1 
    --description 'centos-release-8.1-1.1911.0.8 4.18.0-147.5.1 01'

您将需要等待一段时间。 让我们使用收到的 SnapshotId 检查状态:

aws ec2   describe-snapshots  --region us-east-1 --snapshot-ids snap-0b665542fc59e58ed

当我们得到它时 "State": "completed",您可以注册 AMI 并将其公开:

aws ec2 register-image 
    --region us-east-1 
    --name 'CentOS-8.1-1.1911.0.8-minimal' 
    --description 'centos-release-8.1-1.1911.0.8 4.18.0-147.5.1 01' 
    --virtualization-type hvm --root-device-name /dev/sda1 
    --block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs": { "SnapshotId": "snap-0b665542fc59e58ed", "VolumeSize":4,  "DeleteOnTermination": true, "VolumeType": "gp2"}}]' 
    --architecture x86_64 --sriov-net-support simple --ena-support

aws ec2 modify-image-attribute 
    --region us-east-1 
    --image-id ami-011ed2a37dc89e206 
    --launch-permission 'Add=[{Group=all}]'

就这样。 现在您可以启动实例了。

通过这种方式,您很可能可以使用任何 Linux 发行版创建映像。 至少是 Debian(使用 debootstrap 安装干净的系统)和 RHEL 系列。

更新 根据读者的要求。 这个过程可以自动化 包装机, 仅自动化。 这里 提供了一个示例模板。

来源: habr.com

添加评论