Criando sua própria imagem com CentOS 8.1 puro na nuvem Amazon

Este guia é um “garfo” de mesmo nome artigos sobre o CentOS 5.9 e leva em consideração os recursos do novo sistema operacional. Atualmente não há imagem oficial do Centos8 de centos.org no AWS Marketplace.

Como você sabe, na nuvem Amazon as instâncias virtuais são lançadas com base em imagens (as chamadas AMI). A Amazon fornece um grande número deles; você também pode usar imagens públicas preparadas por terceiros, pelas quais o provedor de nuvem, é claro, não tem qualquer responsabilidade. Mas às vezes você precisa de uma imagem de sistema limpa com os parâmetros necessários, que não está na lista de imagens.

Então a única saída é fazer sua própria AMI.

A documentação oficial descreve processo criando uma “AMI baseada em armazenamento de instância”.

A desvantagem desta abordagem é que a imagem finalizada também precisará ser convertida em uma “AMI apoiada por EBS”. Também digno de nota é o Cockpit Image Builder. Isso permitirá que você crie imagens personalizadas, em CLI ou WEB GUI modo, mas quando você já possui o Centos 8.

Como criar sua própria AMI apoiada por EBS na nuvem Amazon sem etapas intermediárias será discutido neste artigo.

Plano de ação

  • Prepare o ambiente
  • Instale um sistema limpo e faça as configurações necessárias
  • Tire um instantâneo do disco
  • Registrar AMI

Preparando o Ambiente

Para nossos propósitos, qualquer instância oficial do Centos 7 qualquer formato, até mesmo t2.micro. Você pode executá-lo atravé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 gerará uma instância na VPC à qual pertence o ID de sub-rede especificado. A sub-rede deve ser pública e o 'padrão' do SG permite tudo.

Agora vamos fazer login na instância via ssh, atualizar o sistema, instalar dnf e reinicie:

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

Todas as outras operações serão realizadas a partir de root.

Instalando Centos 8.1 limpo

Layout do sistema de arquivos e montagem de partição

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

Criando uma árvore de diretórios

O sistema RPM permite preparar de forma fácil e rápida uma árvore de diretórios para o futuro sistema operacional:

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 ideal executar o último comando desta forma, instalando pacotes específicos, e ignorando os pacotes recomendados.

Se desejar, você pode usar algo assim:

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

В yum não --excludepkgs, e antes eu tinha que instalar grupos e depois remover pacotes.

A lista de pacotes e grupos dependentes pode ser visualizada com o comando dnf group info core para um grupo core.

Personalização de arquivo do sistema operacional

Vamos criar configurações para a rede, fstab, grub2 e usar endereços 169.254 internos da 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

É aqui, no GRUB_CMDLINE_LINUX, que recomendo especificar selinux=0, para quem ainda tem medo do SELinux.

Reconstruindo initramfs em chroot

Depois de editar os arquivos grub e fstab, você precisa reconstruir.
Realizamos a atualização:

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

Aqui update-crypto-policies - opcional, para os paranóicos :)

Para “venda”, você pode fazer isso:

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

Depois de carregar o sistema operacional, o comando update-crypto-policies --show emitirá FIPS.

Inicialização automática 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 - necessário para instalar automaticamente os arquivos de contexto do SELinux na primeira inicialização.

Agora vamos desmontar o disco:

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

Registro AMI

Para obter o ami de um disco ebs, primeiro você precisa tirar um instantâneo 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'

Você terá que esperar algum tempo. Vamos verificar o status usando o SnapshotId recebido:

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

Quando conseguirmos "State": "completed", você pode registrar uma AMI e torná-la 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}]'

Isso é tudo. Agora você pode iniciar instâncias.

Desta forma, você pode criar uma imagem, provavelmente, de qualquer distribuição Linux. Pelo menos exatamente o Debian (usando debootstrap para instalar um sistema limpo) e a família RHEL.

ATUALIZAÇÃO Com base em solicitações de leitores. Este processo pode ser automatizado Empacotador, Somente automatizar. Aqui Um modelo de exemplo é apresentado.

Fonte: habr.com

Adicionar um comentário