Crea la tua immagine con puro CentOS 8.1 nel cloud di Amazon

Questa guida è un “fork” con lo stesso nome articoli su CentOS 5.9 e tiene conto delle funzionalità del nuovo sistema operativo. Al momento non esiste un'immagine Centos8 ufficiale da centos.org nel Marketplace AWS.

Come sapete, nel cloud di Amazon le istanze virtuali vengono lanciate sulla base di immagini (le cosiddette AMI). Amazon ne mette a disposizione un gran numero; puoi anche utilizzare immagini pubbliche preparate da terzi, per le quali il fornitore del cloud, ovviamente, non si assume alcuna responsabilità. Ma a volte è necessaria un'immagine di sistema pulita con i parametri necessari, che non è nell'elenco delle immagini.

Allora l'unica via d'uscita è creare la tua AMI.

La documentazione ufficiale descrive processo creando una "AMI supportata dall'instance store".

Lo svantaggio di questo approccio è che anche l’immagine finale dovrà essere convertita in una “AMI supportata da EBS”. Vale anche la pena notare Cockpit Image Builder. Ti consentirà di creare immagini personalizzate, in CLI o WEB GUI modalità, ma quando hai già Centos 8.

In questo articolo verrà discusso come creare la propria AMI supportata da EBS nel cloud Amazon senza passaggi intermedi.

Piano d'azione

  • Preparare l'ambiente
  • Installa un sistema pulito ed effettua le impostazioni necessarie
  • Scatta un'istantanea del disco
  • Registrati all'AMI

Preparare l'ambiente

Per i nostri scopi, qualsiasi istanza ufficiale di Centos 7 qualsiasi forma, anche t2.micro. Puoi eseguirlo tramite la 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}

Il comando genererà un'istanza nel VPC a cui appartiene l'ID sottorete specificato. La sottorete dovrebbe essere pubblica e l'impostazione predefinita di SG consente tutto.

Ora accediamo all'istanza tramite ssh, aggiorniamo il sistema, installiamo dnf e riavviare:

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

Tutte le ulteriori operazioni verranno eseguite da root.

Installazione pulita di Centos 8.1

Layout del file system e montaggio delle partizioni

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

Creazione di un albero di directory

Il sistema RPM consente di preparare facilmente e rapidamente un albero di directory per il futuro sistema operativo:

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 

Ritengo ottimale eseguire l'ultimo comando in questo modo, installando pacchetti specifici, e assicurandosi di ignorare i pacchetti consigliati.

Se lo desideri, puoi usare qualcosa del genere:

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

В yum no --excludepkgs, e prima dovevo installare i gruppi e quindi rimuovere i pacchetti.

L'elenco dei pacchetti e dei gruppi dipendenti può essere visualizzato con il comando dnf group info core per un gruppo core.

Personalizzazione dei file del sistema operativo

Creiamo configurazioni per la rete, fstab, grub2 e utilizziamo gli indirizzi 169.254 interni di AWS per DNS e 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

È qui, in GRUB_CMDLINE_LINUX, che consiglio di specificare selinux=0, per coloro che hanno ancora paura di SELinux.

Ricostruire initramfs in chroot

Dopo aver modificato i file grub e fstab, è necessario ricostruirli.
Eseguiamo l'aggiornamento:

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

Qui update-crypto-policies - facoltativo, per i paranoici :)

Per "vendita", puoi fare questo:

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

Dopo aver caricato il sistema operativo, il comando update-crypto-policies --show emetterà FIPS.

Avvio automatico e pulizia dei rifiuti

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 - necessario per installare automaticamente i file di contesto SELinux al primo avvio.

Ora smontiamo il disco:

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

Registrazione dell'AMI

Per ottenere ami da un disco ebs, devi prima acquisire uno snapshot del disco:

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'

Dovrai aspettare un po' di tempo. Controlliamo lo stato utilizzando lo SnapshotId ricevuto:

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

Quando lo otterremo "State": "completed", puoi registrare un'AMI e renderla pubblica:

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

È tutto. Ora puoi avviare le istanze.

In questo modo, puoi creare un'immagine, molto probabilmente, con qualsiasi distribuzione Linux. Almeno esattamente Debian (usando debootstrap per installare un sistema pulito) e la famiglia RHEL.

AGGIORNAMENTO In base alle richieste dei lettori. Questo processo può essere automatizzato Imballatore, Solo automatizzazione. Qui Viene presentato un modello di esempio.

Fonte: habr.com

Aggiungi un commento