Membuat image Anda sendiri dengan CentOS 8.1 murni di cloud Amazon

Panduan ini adalah “garpu” dengan nama yang sama Artikel tentang CentOS 5.9, dan mempertimbangkan fitur-fitur OS baru. Saat ini tidak ada gambar Centos8 resmi dari centos.org di AWS Marketplace.

Seperti yang Anda ketahui, di cloud Amazon, instans virtual diluncurkan berdasarkan gambar (yang disebut AMI). Amazon menyediakan banyak sekali; Anda juga dapat menggunakan gambar publik yang disiapkan oleh pihak ketiga, yang tentu saja tidak bertanggung jawab atas penyedia cloud. Namun terkadang Anda memerlukan image sistem yang bersih dengan parameter yang diperlukan, yang tidak ada dalam daftar image.

Maka satu-satunya jalan keluar adalah membuat AMI sendiri.

Dokumentasi resmi menjelaskan jalan membuat “AMI yang didukung penyimpanan instans”.

Kerugian dari pendekatan ini adalah gambar akhir juga perlu diubah menjadi “AMI yang didukung EBS”. Yang juga perlu diperhatikan adalah Cockpit Image Builder. Ini akan memungkinkan Anda membuat gambar khusus, di CLI atau WEB GUI mode, tetapi ketika Anda sudah memiliki Centos 8.

Cara membuat AMI Anda sendiri yang didukung EBS di cloud Amazon tanpa langkah perantara akan dibahas dalam artikel ini.

Rencana aksi

  • Mempersiapkan lingkungan
  • Instal sistem yang bersih dan buat pengaturan yang diperlukan
  • Ambil snapshot dari disk
  • Daftarkan AMI

Mempersiapkan Lingkungan

Untuk tujuan kami, apa pun contoh resmi Centos 7 bentuk apa pun, bahkan t2.micro. Anda dapat menjalankannya melalui 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}

Perintah ini akan memunculkan sebuah instance di VPC yang memiliki subnet-id yang ditentukan. Subnet seharusnya bersifat publik, dan SG 'default' mengizinkan semuanya.

Sekarang mari masuk ke instance melalui ssh, perbarui sistem, instal dnf dan reboot:

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

Semua operasi lebih lanjut akan dilakukan dari root.

Menginstal Centos 8.1 yang bersih

Tata letak sistem file dan pemasangan partisi

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

Membuat pohon direktori

Sistem RPM memungkinkan Anda dengan mudah dan cepat menyiapkan pohon direktori untuk OS masa depan:

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 

Saya menganggap optimal untuk menjalankan perintah terakhir dengan cara ini, dengan menginstal paket tertentu, dan pastikan untuk mengabaikan paket yang disarankan.

Jika mau, Anda dapat menggunakan sesuatu seperti ini:

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

В yum tidak --excludepkgs, dan sebelumnya saya harus menginstal grup dan kemudian menghapus paket.

Daftar paket dan grup dependen dapat dilihat dengan perintah dnf group info core untuk grup core.

Kustomisasi file OS

Mari buat konfigurasi untuk jaringan, fstab, grub2 dan gunakan alamat internal 169.254 AWS untuk DNS dan 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

Di sinilah, di GRUB_CMDLINE_LINUX, saya sarankan untuk menentukan selinux=0, bagi mereka yang masih takut dengan SELinux.

Membangun kembali initramf di chroot

Setelah mengedit file grub dan fstab, Anda perlu membangunnya kembali.
Kami melakukan pembaruan:

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

Di sini update-crypto-policies - opsional, untuk paranoid :)

Untuk “dijual”, Anda dapat melakukan ini:

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

Setelah memuat OS, perintah update-crypto-policies --show akan menerbitkan FIPS.

Mulai Otomatis dan Pembersihan Sampah

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 - diperlukan untuk menginstal file konteks SELinux secara otomatis pada boot pertama.

Sekarang mari kita lepas disknya:

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

Pendaftaran AMI

Untuk mendapatkan ami dari disk ebs, Anda perlu mengambil snapshot disk terlebih dahulu:

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'

Anda harus menunggu beberapa saat. Mari kita periksa statusnya menggunakan SnapshotId yang diterima:

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

Saat kita mendapatkannya "State": "completed", Anda dapat mendaftarkan AMI dan menjadikannya publik:

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}]'

Itu saja. Sekarang Anda dapat meluncurkan instance.

Dengan cara ini, kemungkinan besar Anda dapat membuat image dengan distribusi Linux apa pun. Setidaknya persis Debian (menggunakan debootstrap untuk menginstal sistem yang bersih) dan keluarga RHEL.

UPDATE Berdasarkan permintaan dari pembaca. Proses ini dapat diotomatisasi Packer, Otomatiskan saja. Di sini Contoh template disajikan.

Sumber: www.habr.com

Tambah komentar