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