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