Стварэнне сваёй выявы з чыстым CentOS 8.1 у воблаку Amazon

Дадзенае кіраўніцтва, з'яўляецца «форкам» аднайменнай. артыкулы пра CentOS 5.9, і улічвае асаблівасці новай OS. На дадзены момант у AWS Marketplace няма афіцыйнай выявы Centos8 ад centos.org.

Як вядома, у воблаку Amazon віртуальныя інстансы запускаюцца на аснове вобразаў (так званыя AMI). Amazon падае вялікую іх колькасць, таксама можна выкарыстоўваць публічныя выявы, падрыхтаваныя іншымі арганізацыямі, за якія хмарны правайдэр, натуральна, ніякай адказнасці не нясе. Але часам патрэбен выява чыстай сістэмы з патрэбнымі параметрамі, якога няма ў спісе выяў.

Тады адзінае выйсце – зрабіць свой AMI.

У афіцыйнай дакументацыі апісаны спосаб стварэння "instance store-backed AMI".

Мінус такога падыходу заключаецца ў тым, што гатовы вобраз трэба будзе яшчэ і сканвертаваць у "EBS-backed AMI". Таксама варта адзначыць Cockpit Image Builder. Ён дазволіць ствараць кастамныя вобразы, у CLI ці WEB Графічны інтэрфейс карыстальніка рэжыме, але калі ў вас ужо будзе Centos 8.

Аб тым, як стварыць свой EBS-backed AMI у воблаку Amazon без прамежкавых крокаў, пайдзе прамову ў гэтым артыкуле.

план дзеянняў

  • Падрыхтаваць асяроддзе
  • Усталяваць чыстую сістэму, зрабіць неабходныя наладкі
  • Зрабіць snapshot (злепак) дыска
  • Зарэгістраваць AMI

Падрыхтоўка асяроддзя

Для нашых мэт падыдзе любы афіцыйны інстанс Centos 7 любога шэйпа, хоць t2.micro. Запусціць яго можна праз 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}

Каманда падніме інстанс у VPC, да якой ставіцца паказаны subnet-id. Мяркуецца, што падсетка будзе публічная, і SG "default" дазваляе ўсё.

Зараз залагінімся на інстанс па ssh, абновім сістэму, усталюем dnf і перазагрузімся:

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

Усе далейшыя аперацыі будуць выконвацца ад root.

Ўстаноўка чыстага Centos 8.1

Разметка файлавай сістэмы і мантаванне раздзелаў

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

Стварэнне дрэва каталогаў

Сістэма RPM дазваляе лёгка і хутка падрыхтаваць дрэва каталогаў будучай АС:

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 

Апошнюю каманду я лічу аптымальна выконваць менавіта так, усталёўкай пэўных пакетаў, і абавязкова, ігнараваць рэкамендаваныя пакеты.

Пры жаданні, вы можаце выкарыстоўваць прыкладна такі варыянт:

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

В yum няма --excludepkgs, і раней даводзілася ўсталёўваць групы, і потым выдаляць пакеты.

Спіс пакетаў і залежных груп можна прагледзець камандай dnf group info core для групы core.

Кастамізацыя файлаў АС

Створым канфігі для сеткі, fstab, grub2 і выкарыстаем інтэрнальныя 169.254 адрасы AWS для DNS і 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

Менавіта тут, у GRUB_CMDLINE_LINUX я рэкамендую паказваць selinux=0, для тых, хто ўсё яшчэ баіцца SELinux.

Перазборка initramfs у chroot

Пасля праўкі фалаў grub і fstab неабходна выканаць перазборку.
Выконваем абнаўленне:

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

Тут update-crypto-policies - Па жаданні, для параноікаў 🙂

Для "прода", можна зрабіць так:

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

Пасля загрузкі АС, каманда update-crypto-policies --show выдасць FIPS.

Аўтазапуск і Чыстка смецця

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 - патрэбен для аўтаматычнай усталёўкі SELinux кантэксту файлаў пры першай загрузцы.

Цяпер размантаваны дыск:

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

Рэгістрацыя AMI

Каб атрымаць з ebs-дыска ami, трэба зрабіць спачатку снапшот дыска:

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'

Нейкі час трэба будзе пачакаць. Праверым статус па атрыманым SnapshotId:

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

Калі атрымаем "State": "completed", можна зарэгістраваць AMI і зрабіць яго публічным:

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

На гэтым усё. Цяпер можна запускаць інстансы.

Такім спосабам можна зрабіць выяву, хутчэй за ўсё, з любым Linux-дыстрыбутывам. Прынамсі, сапраўды Debian (выкарыстоўваючы debootstrap для ўсталёўкі чыстай сістэмы) і RHEL-сямействы.

АБНАЎЛЕННЕ Па заяўках чытачоў. Аўтаматызаваць гэты працэс можа Ўпакоўшчык, толькі Аўтаматызаваць. Тут прадстаўлены прыклад темплейта.

Крыніца: habr.com

Дадаць каментар