Amazon クラウドで純粋な CentOS 8.1 を使用して独自のイメージを作成する

このガイドは同じ名前の「フォーク」です 記事 CentOS 5.9 について説明し、新しい OS の機能を考慮しています。 現在、AWS Marketplace には centos.org からの公式 Centos8 イメージはありません。

ご存知のとおり、Amazon クラウドでは仮想インスタンスがイメージ (いわゆる AMI)。 Amazon が多数提供しているほか、サードパーティが用意した公開イメージを使用することもできますが、当然ながらクラウドプロバイダーは一切の責任を負いません。 ただし、イメージのリストにない、必要なパラメーターを備えたクリーンなシステム イメージが必要になる場合があります。

その場合、唯一の解決策は独自の AMI を作成することです。

公式ドキュメントには次のように説明されています プロセス 「インスタンスストアバックド AMI」を作成します。

このアプローチの欠点は、完成したイメージも「EBS-backed AMI」に変換する必要があることです。 Cockpit Image Builder も注目に値します。 カスタムイメージを作成できるようになります。 CLI またはWEB GUI モードですが、すでに Centos 8 を持っている場合。

この記事では、中間手順なしで Amazon クラウドに独自の EBS-backed 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 システムを使用すると、将来の OS 用のディレクトリ ツリーを簡単かつ迅速に準備できます。

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.

OSファイルのカスタマイズ

ネットワーク、fstab、grub2 の構成を作成し、DNS と NTP に AWS 内部 169.254 アドレスを使用しましょう。

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

GRUB_CMDLINE_LINUX では、まだ SELinux を恐れている人のために 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

OSをロードした後、コマンド 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 ファミリです。

UPDATE 読者からのリクエストをもとに作成しました。 このプロセスは自動化できます パッカー, 自動化のみ。 ここで テンプレートの例が示されています。

出所: habr.com

コメントを追加します