Crea a túa propia imaxe con CentOS 8.1 puro na nube de Amazon

Esta guía é un "garfo" co mesmo nome Artigo sobre CentOS 5.9 e ten en conta as características do novo sistema operativo. Actualmente non hai ningunha imaxe oficial de Centos8 de centos.org no AWS Marketplace.

Como sabedes, na nube de Amazon lánzanse instancias virtuais baseadas en imaxes (as chamadas AMI). Amazon ofrece un gran número delas; tamén podes utilizar imaxes públicas elaboradas por terceiros, das que o provedor da nube, por suposto, non se fai responsable. Pero ás veces necesitas unha imaxe limpa do sistema cos parámetros necesarios, que non está na lista de imaxes.

Entón, a única saída é facer a túa propia AMI.

Descríbese a documentación oficial camiño creando unha "AMI apoiada na tenda de instancias".

A desvantaxe deste enfoque é que a imaxe rematada tamén terá que converterse nunha "AMI apoiada por EBS". Tamén vale a pena destacar o Cockpit Image Builder. Permitirache crear imaxes personalizadas, en CLI ou WEB GUI modo, pero cando xa tes Centos 8.

Neste artigo comentarase como crear a túa propia AMI apoiada por EBS na nube de Amazon sen pasos intermedios.

Plan de acción

  • Preparar o medio ambiente
  • Instale un sistema limpo e realice os axustes necesarios
  • Fai unha instantánea do disco
  • Rexistrarse AMI

Preparando o Medio Ambiente

Para os nosos fins, calquera instancia oficial de Centos 7 calquera forma, incluso t2.micro. Pode executalo a través da 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}

O comando xerará unha instancia na VPC á que pertence o ID de subrede especificado. Suponse que a subrede é pública e SG "predeterminado" permíteo todo.

Agora imos iniciar sesión na instancia mediante ssh, actualizar o sistema e instalar dnf e reinicia:

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

Todas as operacións posteriores realizaranse desde root.

Instalación limpa Centos 8.1

Disposición do sistema de ficheiros e montaxe de particións

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

Creación dunha árbore de directorios

O sistema RPM permítelle preparar de xeito sinxelo e rápido unha árbore de directorios para o futuro SO:

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 

Considero que é óptimo executar o último comando deste xeito, instalando paquetes específicos, e asegúrese de ignorar os paquetes recomendados.

Se queres, podes usar algo así:

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

В yum non --excludepkgs, e antes tiven que instalar grupos e despois eliminar paquetes.

A lista de paquetes e grupos dependentes pódese ver co comando dnf group info core para un grupo core.

Personalización de ficheiros do sistema operativo

Creemos configuracións para a rede, fstab, grub2 e usemos enderezos internos 169.254 de AWS para 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

É aquí, en GRUB_CMDLINE_LINUX, onde recomendo especificar selinux=0, para os que aínda lle teñen medo a SELinux.

Reconstruíndo initramfs en chroot

Despois de editar os ficheiros grub e fstab, cómpre reconstruír.
Realizamos a actualización:

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

Aquí update-crypto-policies - opcional, para paranoicos :)

Para "venda", podes facer isto:

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

Despois de cargar o sistema operativo, o comando update-crypto-policies --show emitirá FIPS.

Arranque automático e limpeza de lixo

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 - necesario para instalar automaticamente os ficheiros de contexto de SELinux no primeiro arranque.

Agora imos desmontar o disco:

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

Rexistro AMI

Para obter ami dun disco ebs, primeiro cómpre facer unha instantánea do 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'

Terás que esperar algún tempo. Comprobamos o estado usando o SnapshotId recibido:

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

Cando o consigamos "State": "completed", pode rexistrar unha AMI e facela pública:

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

Iso é todo. Agora podes lanzar instancias.

Deste xeito, podes crear unha imaxe, moi probablemente, con calquera distribución de Linux. Polo menos exactamente Debian (usando debootstrap para instalar un sistema limpo) e a familia RHEL.

Actualización Baseado en peticións dos lectores. Este proceso pódese automatizar Empaquetador, Só automatizar. Aquí Preséntase un modelo de exemplo.

Fonte: www.habr.com

Engadir un comentario