Kreiranje vlastite slike sa čistim CentOS-om 8.1 u Amazon oblaku

Ovaj vodič je istoimena „viljuška“. članci o CentOS-u 5.9, i uzima u obzir karakteristike novog OS-a. Trenutno ne postoji zvanična slika Centos8 sa centos.org na AWS Marketplace-u.

Kao što znate, u oblaku Amazon virtuelne instance se pokreću na osnovu slika (tzv AMI). Amazon ih nudi veliki broj, a možete koristiti i javne slike koje su pripremile treće strane, za koje provajder u oblaku, naravno, ne snosi nikakvu odgovornost. Ali ponekad vam je potrebna čista slika sistema sa potrebnim parametrima, koja nije na listi slika.

Tada je jedini izlaz da napravite sopstveni AMI.

Zvanična dokumentacija opisuje način kreiranje „AMI-ja koji podržava instancu“.

Nedostatak ovog pristupa je što će gotova slika takođe morati da se konvertuje u „EBS-backed AMI“. Takođe vredi napomenuti Cockpit Image Builder. To će vam omogućiti da kreirate prilagođene slike, u CLI ili WEB GUI modu, ali kada već imate Centos 8.

Kako da kreirate sopstveni AMI podržan od EBS-a u Amazon oblaku bez međukoraka, biće objašnjeno u ovom članku.

Akcioni plan

  • Pripremite okolinu
  • Instalirajte čist sistem i izvršite potrebna podešavanja
  • Napravite snimak diska
  • Registrujte AMI

Priprema okoline

Za naše potrebe, bilo koji službeni primjerak Centosa 7 bilo kojeg oblika, čak i t2.micro. Možete ga pokrenuti preko 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}

Komanda će pokrenuti instancu u VPC-u kojoj pripada navedeni subnet-id. Podmreža bi trebala biti javna, a SG 'default' dozvoljava sve.

Sada se prijavimo na instancu putem ssh-a, ažuriramo sistem, instaliramo dnf i restartujte:

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

Sve dalje operacije će se izvoditi od root.

Instaliranje čistog Centosa 8.1

Izgled sistema datoteka i montaža particija

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

Kreiranje stabla direktorija

RPM sistem vam omogućava da lako i brzo pripremite stablo direktorija za budući 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 

Smatram da je optimalno izvršiti posljednju naredbu na ovaj način, instaliranjem određenih paketa, i svakako zanemarite preporučene pakete.

Ako želite, možete koristiti nešto poput ovoga:

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

В yum ne --excludepkgs, a prije sam morao instalirati grupe, a zatim ukloniti pakete.

Spisak paketa i zavisnih grupa može se videti pomoću naredbe dnf group info core za grupu core.

Prilagodba OS datoteke

Kreirajmo konfiguracije za mrežu, fstab, grub2 i koristimo AWS interne 169.254 adrese za DNS i 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

Ovdje, u GRUB_CMDLINE_LINUX-u, preporučujem da navedete selinux=0, za one koji se još uvijek boje SELinuxa.

Obnova initramf-ova u chroot-u

Nakon uređivanja grub i fstab fajlova, morate ponovo izgraditi.
Vršimo ažuriranje:

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

ovdje update-crypto-policies - opciono, za paranoične :)

Za "prodaju" možete učiniti sljedeće:

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

Nakon učitavanja OS-a, naredba update-crypto-policies --show će izdati FIPS.

Autostart i čišćenje smeća

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 - potrebno za automatsku instalaciju SELinux kontekstnih datoteka pri prvom pokretanju.

Sada demontirajmo disk:

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

AMI registracija

Da biste dobili ami sa ebs diska, prvo morate napraviti snimak diska:

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'

Morat ćete sačekati neko vrijeme. Provjerimo status koristeći primljeni SnapshotId:

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

Kad ga dobijemo "State": "completed", možete registrirati AMI i učiniti ga javnim:

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

To je sve. Sada možete pokrenuti instance.

Na ovaj način možete kreirati sliku, najvjerovatnije, sa bilo kojom Linux distribucijom. Barem točno Debian (koristeći debootstrap za instalaciju čistog sistema) i RHEL obitelj.

UPDATE Na osnovu zahtjeva čitalaca. Ovaj proces se može automatizovati Packer, Samo automatiziraj. ovdje Prikazan je primjer šablona.

izvor: www.habr.com

Dodajte komentar