Paglikha ng iyong sariling imahe gamit ang purong CentOS 8.1 sa Amazon cloud

Ang gabay na ito ay isang "tinidor" ng parehong pangalan Artikulo tungkol sa CentOS 5.9, at isinasaalang-alang ang mga tampok ng bagong OS. Kasalukuyang walang opisyal na larawan ng Centos8 mula sa centos.org sa AWS Marketplace.

Tulad ng alam mo, sa Amazon cloud virtual na mga pagkakataon ay inilunsad batay sa mga imahe (ang tinatawag na Ami). Nagbibigay ang Amazon ng isang malaking bilang ng mga ito; maaari mo ring gamitin ang mga pampublikong imahe na inihanda ng mga third party, kung saan ang cloud provider, siyempre, ay walang pananagutan. Ngunit kung minsan kailangan mo ng malinis na imahe ng system na may mga kinakailangang parameter, na wala sa listahan ng mga larawan.

Kung gayon ang tanging paraan ay ang gumawa ng sarili mong AMI.

Inilalarawan ng opisyal na dokumentasyon paraan paglikha ng isang "instance store-backed AMI".

Ang kawalan ng diskarteng ito ay ang natapos na imahe ay kailangan ding i-convert sa isang "EBS-backed AMI". Dapat ding tandaan ang Cockpit Image Builder. Papayagan ka nitong lumikha ng mga custom na larawan, sa CLI o WEB GUI mode, ngunit kapag mayroon ka nang Centos 8.

Tatalakayin ng artikulong ito kung paano lumikha ng iyong sariling EBS-backed AMI sa Amazon cloud nang walang mga intermediate na hakbang.

Plano ng pagkilos

  • Ihanda ang kapaligiran
  • Mag-install ng malinis na sistema at gawin ang mga kinakailangang setting
  • Kumuha ng snapshot ng disk
  • Irehistro ang AMI

Paghahanda sa Kapaligiran

Para sa aming mga layunin, anuman opisyal na halimbawa ng Centos 7 anumang hugis, kahit t2.micro. Maaari mo itong patakbuhin sa pamamagitan ng 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}

Magtataas ang command ng isang instance sa VPC kung saan kabilang ang tinukoy na subnet-id. Ang subnet ay dapat na pampubliko, at pinapayagan ng SG 'default' ang lahat.

Ngayon mag-log in tayo sa instance sa pamamagitan ng ssh, i-update ang system, i-install dnf at i-reboot:

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

Lahat ng karagdagang operasyon ay isasagawa mula sa root.

Pag-install ng malinis na Centos 8.1

Layout ng system ng file at pag-mount ng partition

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

Paglikha ng isang puno ng direktoryo

Binibigyang-daan ka ng sistema ng RPM na madali at mabilis na maghanda ng puno ng direktoryo para sa hinaharap na 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 

Itinuturing kong pinakamainam na isagawa ang huling utos sa ganitong paraan, sa pamamagitan ng pag-install ng mga partikular na pakete, at siguraduhing huwag pansinin ang mga inirerekomendang pakete.

Kung nais mo, maaari mong gamitin ang isang bagay na tulad nito:

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

Π’ yum hindi --excludepkgs, at bago ako mag-install ng mga grupo at pagkatapos ay mag-alis ng mga pakete.

Ang listahan ng mga pakete at umaasang grupo ay maaaring matingnan gamit ang command dnf group info core para sa isang grupo core.

Pag-customize ng OS file

Gumawa tayo ng mga config para sa network, fstab, grub2 at gumamit ng AWS internal 169.254 address para sa DNS at 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

Dito, sa GRUB_CMDLINE_LINUX, inirerekumenda kong tukuyin ang selinux=0, para sa mga natatakot pa rin sa SELinux.

Muling pagtatayo ng initramfs sa chroot

Pagkatapos i-edit ang grub at fstab file, kailangan mong buuin muli.
Ginagawa namin ang pag-update:

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

Dito update-crypto-policies - opsyonal, para sa paranoid :)

Para sa "pagbebenta", magagawa mo ito:

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

Pagkatapos i-load ang OS, ang command update-crypto-policies --show maglalabas ng FIPS.

Autostart at Paglilinis ng Basura

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 - kailangan upang awtomatikong i-install ang mga file ng konteksto ng SELinux sa unang boot.

Ngayon i-unmount natin ang disk:

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

pagpaparehistro ng AMI

Upang makakuha ng ami mula sa isang ebs disk, kailangan mo munang kumuha ng snapshot ng disk:

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'

Kakailanganin mong maghintay ng ilang oras. Tingnan natin ang status gamit ang natanggap na SnapshotId:

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

Pag nakuha namin "State": "completed", maaari kang magparehistro ng AMI at gawin itong pampubliko:

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

Iyon lang. Ngayon ay maaari kang maglunsad ng mga pagkakataon.

Sa ganitong paraan, maaari kang lumikha ng isang imahe, malamang, sa anumang pamamahagi ng Linux. Hindi bababa sa eksaktong Debian (gamit ang debootstrap upang mag-install ng malinis na sistema) at ang pamilya ng RHEL.

I-UPDATE Batay sa mga kahilingan ng mga mambabasa. Ang prosesong ito ay maaaring awtomatiko Packer, I-automate lang. Dito Isang halimbawang template ang ipinakita.

Pinagmulan: www.habr.com

Magdagdag ng komento