Erstellen Sie Ihr eigenes Image mit purem CentOS 8.1 in der Amazon Cloud

Dieser Leitfaden ist ein gleichnamiger „Fork“. Artikel über CentOS 5.9 und berücksichtigt die Funktionen des neuen Betriebssystems. Derzeit gibt es kein offizielles Centos8-Image von centos.org im AWS Marketplace.

Wie Sie wissen, werden in der Amazon-Cloud virtuelle Instanzen auf Basis von Bildern (sog AMI). Amazon stellt eine Vielzahl davon zur Verfügung; Sie können auch öffentliche Bilder verwenden, die von Dritten erstellt wurden, für die der Cloud-Anbieter natürlich keine Verantwortung trägt. Manchmal benötigen Sie jedoch ein sauberes Systemabbild mit den erforderlichen Parametern, das nicht in der Abbildliste enthalten ist.

Dann besteht der einzige Ausweg darin, Ihr eigenes AMI zu erstellen.

Die offizielle Dokumentation beschreibt Prozess Erstellen eines „Instanzspeicher-gestützten AMI“.

Der Nachteil dieses Ansatzes besteht darin, dass das fertige Image auch in ein „EBS-gestütztes AMI“ konvertiert werden muss. Erwähnenswert ist auch der Cockpit Image Builder. Damit können Sie benutzerdefinierte Bilder erstellen CLI oder WEB GUI Modus, aber wenn Sie bereits Centos 8 haben.

Wie Sie ohne Zwischenschritte Ihr eigenes EBS-gestütztes AMI in der Amazon-Cloud erstellen, erfahren Sie in diesem Artikel.

Aktionsplan

  • Bereiten Sie die Umgebung vor
  • Installieren Sie ein sauberes System und nehmen Sie die notwendigen Einstellungen vor
  • Machen Sie einen Snapshot der Festplatte
  • Registrieren Sie AMI

Umgebung vorbereiten

Für unsere Zwecke jeder offizielle Centos 7-Instanz jede Form, auch t2.micro. Sie können es über die CLI ausführen:

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}

Der Befehl löst eine Instanz in der VPC aus, zu der die angegebene Subnetz-ID gehört. Das Subnetz soll öffentlich sein und SG „default“ erlaubt alles.

Jetzt melden wir uns per SSH bei der Instanz an, aktualisieren das System und installieren dnf und neu starten:

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

Alle weiteren Vorgänge werden von ausgeführt root.

Installieren von sauberem Centos 8.1

Dateisystemlayout und Partitionsmontage

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

Erstellen eines Verzeichnisbaums

Mit dem RPM-System können Sie einfach und schnell einen Verzeichnisbaum für das zukünftige Betriebssystem vorbereiten:

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 

Ich halte es für optimal, den letzten Befehl auf diese Weise auszuführen, indem bestimmte Pakete installiert werden, und achte darauf, die empfohlenen Pakete zu ignorieren.

Wenn Sie möchten, können Sie so etwas verwenden:

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

В yum Nein --excludepkgs, und vorher musste ich Gruppen installieren und dann Pakete entfernen.

Die Liste der Pakete und abhängigen Gruppen kann mit dem Befehl angezeigt werden dnf group info core für eine Gruppe core.

Anpassung der Betriebssystemdatei

Lassen Sie uns Konfigurationen für das Netzwerk, fstab, grub2 erstellen und AWS-interne 169.254-Adressen für DNS und NTP verwenden.

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

Hier, in GRUB_CMDLINE_LINUX, empfehle ich die Angabe von selinux=0 für diejenigen, die immer noch Angst vor SELinux haben.

Initramfs in Chroot neu erstellen

Nachdem Sie die Grub- und Fstab-Dateien bearbeitet haben, müssen Sie sie neu erstellen.
Wir führen das Update durch:

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

Hier update-crypto-policies - optional, für Paranoiker :)

Für „Verkauf“ können Sie Folgendes tun:

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

Nach dem Laden des Betriebssystems wird der Befehl update-crypto-policies --show wird FIPS ausstellen.

Autostart und Müllbereinigung

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 – Wird benötigt, um SELinux-Kontextdateien beim ersten Start automatisch zu installieren.

Jetzt lasst uns die Festplatte aushängen:

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

AMI-Registrierung

Um AMI von einer EBS-Festplatte zu erhalten, müssen Sie zunächst einen Snapshot der Festplatte erstellen:

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'

Sie müssen einige Zeit warten. Lassen Sie uns den Status anhand der empfangenen SnapshotId überprüfen:

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

Wenn wir es bekommen "State": "completed", können Sie ein AMI registrieren und veröffentlichen:

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

Das ist alles. Jetzt können Sie Instanzen starten.

Auf diese Weise können Sie höchstwahrscheinlich mit jeder Linux-Distribution ein Image erstellen. Zumindest genau Debian (mit Debootstrap ein sauberes System installieren) und die RHEL-Familie.

AKTUALISIEREN Basierend auf Anfragen von Lesern. Dieser Prozess kann automatisiert werden Packer, Nur automatisieren. Hier Eine Beispielvorlage wird vorgestellt.

Source: habr.com

Kommentar hinzufügen