Créer votre propre image avec CentOS 8.1 pur dans le cloud Amazon

Ce guide est un « fork » du même nom articles à propos de CentOS 5.9 et prend en compte les fonctionnalités du nouveau système d'exploitation. Il n'existe actuellement aucune image Centos8 officielle de centos.org sur AWS Marketplace.

Comme vous le savez, dans le cloud Amazon, les instances virtuelles sont lancées sur la base d'images (appelées AMI). Amazon en propose un grand nombre ; vous pouvez également utiliser des images publiques préparées par des tiers, pour lesquelles le fournisseur de cloud n'assume bien entendu aucune responsabilité. Mais parfois, vous avez besoin d'une image système propre avec les paramètres nécessaires, qui ne figurent pas dans la liste des images.

Alors la seule issue est de créer votre propre AMI.

La documentation officielle décrit façon créer une « AMI basée sur le stockage d'instance ».

L'inconvénient de cette approche est que l'image finale devra également être convertie en une « AMI basée sur EBS ». Il convient également de noter Cockpit Image Builder. Il vous permettra de créer des images personnalisées, en CLI ou WEB GUI mode, mais lorsque vous disposez déjà de Centos 8.

Comment créer votre propre AMI basée sur EBS dans le cloud Amazon sans étapes intermédiaires sera abordé dans cet article.

План действий

  • Préparer l'environnement
  • Installez un système propre et effectuez les réglages nécessaires
  • Prendre un instantané du disque
  • Enregistrer AMI

Préparation de l'environnement

Pour nos besoins, tout instance officielle Centos 7 n'importe quelle forme, même t2.micro. Vous pouvez l'exécuter via 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}

La commande générera une instance dans le VPC à laquelle appartient l'ID de sous-réseau spécifié. Le sous-réseau est censé être public et SG « par défaut » autorise tout.

Connectons-nous maintenant à l'instance via ssh, mettons à jour le système, installons dnf et redémarrez :

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

Toutes les opérations ultérieures seront effectuées à partir de root.

Installation de Centos 8.1 propre

Disposition du système de fichiers et montage des partitions

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

Création d'une arborescence de répertoires

Le système RPM permet de préparer facilement et rapidement une arborescence de répertoires pour le futur 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 

Je considère qu'il est optimal d'exécuter la dernière commande de cette façon, en installant des packages spécifiques, et en veillant à ignorer les packages recommandés.

Si vous le souhaitez, vous pouvez utiliser quelque chose comme ceci :

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

В yum aucun --excludepkgs, et avant, je devais installer des groupes puis supprimer des packages.

La liste des packages et des groupes dépendants peut être consultée avec la commande dnf group info core pour un groupe core.

Personnalisation des fichiers du système d'exploitation

Créons des configurations pour le réseau, fstab, grub2 et utilisons les adresses internes 169.254 d'AWS pour DNS et 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

C'est ici, dans GRUB_CMDLINE_LINUX, que je recommande de préciser selinux=0, pour ceux qui ont encore peur de SELinux.

Reconstruire initramfs dans chroot

Après avoir modifié les fichiers grub et fstab, vous devez les reconstruire.
Nous effectuons la mise à jour :

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

Ici update-crypto-policies - facultatif, pour les paranoïaques :)

Pour « vente », vous pouvez faire ceci :

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

Après avoir chargé le système d'exploitation, la commande update-crypto-policies --show émettra FIPS.

Démarrage automatique et nettoyage des déchets

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 - nécessaire pour installer automatiquement les fichiers de contexte SELinux au premier démarrage.

Démontons maintenant le disque :

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

Inscription AMI

Pour obtenir ami à partir d'un disque ebs, vous devez d'abord prendre un instantané du disque :

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'

Vous devrez attendre un certain temps. Vérifions l'état à l'aide du SnapshotId reçu :

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

Quand nous l'obtiendrons "State": "completed", vous pouvez enregistrer une AMI et la rendre publique :

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

C'est tout. Vous pouvez désormais lancer des instances.

De cette façon, vous pouvez très probablement créer une image avec n'importe quelle distribution Linux. Au moins exactement Debian (en utilisant debootstrap pour installer un système propre) et la famille RHEL.

MISE À JOUR Basé sur les demandes des lecteurs. Ce processus peut être automatisé Emballeur, Automatiser uniquement. Ici Un exemple de modèle est présenté.

Source: habr.com

Ajouter un commentaire