ایجاد تصویر خود با CentOS 8.1 خالص در ابر آمازون

این راهنما یک "چنگال" به همین نام است مقاله در مورد CentOS 5.9، و ویژگی های سیستم عامل جدید را در نظر می گیرد. در حال حاضر هیچ تصویر رسمی Centos8 از centos.org در بازار AWS وجود ندارد.

همانطور که می دانید در ابر آمازون نمونه های مجازی بر اساس تصاویر راه اندازی می شوند (به اصطلاح AMI). آمازون تعداد زیادی از آنها را ارائه می دهد؛ همچنین می توانید از تصاویر عمومی تهیه شده توسط اشخاص ثالث استفاده کنید که البته ارائه دهنده ابر هیچ مسئولیتی در قبال آنها ندارد. اما گاهی اوقات شما نیاز به یک تصویر سیستم تمیز با پارامترهای لازم دارید که در لیست تصاویر نیست.

سپس تنها راه این است که AMI خود را بسازید.

اسناد رسمی توضیح می دهد راه ایجاد یک "AMI مورد حمایت فروشگاه".

نقطه ضعف این روش این است که تصویر تمام شده نیز باید به یک AMI با پشتیبانی EBS تبدیل شود. همچنین باید به Cockpit Image Builder اشاره کرد. به شما این امکان را می دهد که تصاویر دلخواه خود را ایجاد کنید CLI یا وب GUI حالت، اما زمانی که از قبل Centos 8 دارید.

نحوه ایجاد AMI با پشتیبانی EBS خود در ابر آمازون بدون مراحل میانی در این مقاله مورد بحث قرار خواهد گرفت.

برنامه عملیاتی

  • محیط را آماده کنید
  • یک سیستم تمیز نصب کنید و تنظیمات لازم را انجام دهید
  • یک عکس فوری از دیسک بگیرید
  • ثبت نام 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 ایجاد می کند که زیرشبکه مشخص شده به آن تعلق دارد. قرار است زیرشبکه عمومی باشد و 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 ایجاد کنیم و از آدرس های داخلی AWS 169.254 برای 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 می‌ترسند، selinux=0 را مشخص کنید.

بازسازی 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

برای دریافت ami از دیسک ebs، ابتدا باید یک عکس فوری از دیسک بگیرید:

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

همین. اکنون می توانید نمونه ها را راه اندازی کنید.

به این ترتیب، به احتمال زیاد با هر توزیع لینوکس می توانید یک تصویر ایجاد کنید. حداقل دقیقاً Debian (استفاده از debootstrap برای نصب یک سیستم تمیز) و خانواده RHEL.

بروزرسانی بر اساس درخواست خوانندگان این فرآیند می تواند خودکار باشد بستهبند، فقط خودکار. اینجا یک الگوی نمونه ارائه شده است.

منبع: www.habr.com

اضافه کردن نظر