คำตอบสั้น ๆ: ใช้ ELevate อัปเกรด CentOS 7 เป็น AlmaLinux 8 แล้วต่อเป็น 9 แบบ in-place ทำ Snapshot ก่อน อ่านรายงาน leapp preupgrade แก้ inhibitor และเตรียมแผนย้อนกลับ
คู่มือนี้อธิบาย ELevate ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ELevate คือโครงการของ AlmaLinux ที่นำเครื่องมือ Leapp ซึ่ง Red Hat ใช้อัปเกรด RHEL ข้ามเวอร์ชันหลักแบบ in-place มาเพิ่มข้อมูลให้ใช้กับดิสโทรตระกูลเดียวกันได้ ทำให้อัปเกรดเครื่อง CentOS 7 ไปเป็น AlmaLinux 8 แล้วต่อไป AlmaLinux 9 ได้โดยไม่ต้องติดตั้งระบบใหม่และย้ายข้อมูลเอง CentOS 7 หมดอายุการสนับสนุนไปตั้งแต่ 30 มิถุนายน 2024 เครื่องที่ยังใช้อยู่จึงไม่ได้รับแพตช์ความปลอดภัยอีกแล้ว
คู่มือนี้เหมาะกับผู้ดูแลที่มีเซิร์ฟเวอร์ CentOS 7 ซึ่งติดตั้งใหม่ได้ยาก เช่น มีแอปเก่าที่ไม่มีใครจำวิธีติดตั้ง เมื่อทำครบ คุณจะมีแผนสำรองก่อนเริ่ม รู้วิธีอ่านรายงานของ Leapp และแก้ด่านที่กั้นการอัปเกรด (inhibitor) อัปเกรดสองรอบจาก 7 ไป 8 และ 8 ไป 9 ด้วย ELevate และตรวจระบบหลังอัปเกรดได้ครบ
สิ่งที่ต้องเตรียม
- Snapshot หรือข้อมูลสำรองทั้งเครื่อง Leapp ไม่มีคำสั่งย้อนกลับ ถ้าอัปเกรดล้มเหลวกลางทาง ทางกลับมีทางเดียวคือกู้จากข้อมูลสำรอง ดู คู่มือ Backup Server บน Cloud ของ TDC
- Console ของผู้ให้บริการ ระหว่างอัปเกรดเครื่องจะรีบูตเข้าสภาพแวดล้อมพิเศษที่ไม่มีเครือข่าย ต้องดูความคืบหน้าผ่าน Console ผ่าน Web UI
- ช่วงเวลาหยุดระบบ ที่แจ้งผู้ใช้แล้ว ระยะเวลาขึ้นกับจำนวนแพ็กเกจและความเร็วดิสก์ ควรกันเวลาไว้ทั้งสำหรับอัปเกรดและสำหรับกู้คืนถ้าล้มเหลว
- รายการซอฟต์แวร์ที่ไม่ได้มาจาก CentOS เช่น PHP จาก Remi, MySQL Community, Docker CE หรือ Control Panel เพราะ Leapp จะไม่อัปเกรดแพ็กเกจเหล่านี้ให้
- ถ้าเครื่องเปิด Secure Boot ต้องปิดก่อนอัปเกรดข้ามผู้ผลิตจาก CentOS ไป AlmaLinux
เครื่องที่มี Control Panel ห้ามรัน Leapp ตรง ๆ cPanel มีสคริปต์ของตัวเองชื่อ elevate-cpanel ซึ่งใช้ ELevate ภายในและจัดการ cPanel ให้ด้วย ส่วน Plesk มีเครื่องมือทางการ centos2alma สำหรับ CentOS 7 ไป AlmaLinux 8 ให้ตรวจเอกสารล่าสุดของผู้ผลิต Panel ก่อนเสมอว่ารองรับเส้นทางใดบ้าง
ขั้นตอนที่ 1: ประเมินเครื่องก่อนตัดสินใจใช้ ELevate
เก็บข้อมูลเครื่องไว้เทียบหลังอัปเกรด และหาสิ่งที่จะมีปัญหาตั้งแต่ต้น
cat /etc/centos-release
uname -r
df -h / /var /boot
yum repolist enabled
rpm -qa --qf '%{NAME}-%{VERSION} %{VENDOR}\n' | grep -v CentOS | sort
systemctl list-units --type=service --state=running --no-pager > /root/services-before.txt
ls -d /usr/local/cpanel /usr/local/psa /usr/local/directadmin 2>/dev/null
คำสั่ง rpm แสดงแพ็กเกจที่ไม่ได้มาจาก CentOS ซึ่งต้องจัดการเองหลังอัปเกรด ถ้ารายการยาวมาก หรือเครื่องมีแอปที่ผูกกับ PHP 5.x, Python 2 หรือไลบรารีเก่า การสร้างเครื่องใหม่บน AlmaLinux 9 แล้วย้ายข้อมูลอาจเร็วและปลอดภัยกว่า เพราะ PHP, MariaDB และ Python ในระบบใหม่เปลี่ยนเวอร์ชันทั้งหมด ถ้าตัดสินใจใช้ ELevate ให้ทดลองกับเครื่องที่โคลนจาก Snapshot ก่อนเครื่องจริงทุกครั้ง
ขั้นตอนที่ 2: ทำ Snapshot และแก้ repository ของ CentOS 7
สร้าง Snapshot ของเครื่องในพอร์ทัลก่อน แล้วสำรองฐานข้อมูลแยกด้วย mysqldump หรือ pg_dump อีกชั้น จากนั้นแก้ repository เพราะ mirror เดิมของ CentOS 7 ปิดไปแล้วหลังหมดอายุ AlmaLinux เตรียมไฟล์ repo ที่ชี้ไปคลังสำรองไว้ให้
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://el7.repo.almalinux.org/centos/CentOS-Base.repo
sudo yum upgrade -y
sudo reboot
การอัปเดต CentOS 7 ให้เป็นแพ็กเกจล่าสุดก่อนเป็นเงื่อนไขของ Leapp หลังรีบูตให้ตรวจว่าเครื่องบูตด้วยเคอร์เนลล่าสุดด้วย uname -r และบริการทั้งหมดกลับมาทำงาน
ขั้นตอนที่ 3: ติดตั้ง ELevate และ Leapp
ติดตั้งแพ็กเกจ release ของ ELevate แล้วติดตั้ง Leapp กับข้อมูลสำหรับ AlmaLinux
sudo yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm
sudo yum install -y leapp-upgrade leapp-data-almalinux
ถ้าต้องการปลายทางเป็น Rocky Linux, Oracle Linux หรือ CentOS Stream ให้เปลี่ยนแพ็กเกจข้อมูลเป็นของดิสโทรนั้นตาม ELevate Quickstart Guide คู่มือนี้ใช้ AlmaLinux เป็นตัวอย่าง
ขั้นตอนที่ 4: รัน preupgrade และแก้ inhibitor
leapp preupgrade จำลองการอัปเกรดโดยไม่เปลี่ยนระบบ แล้วเขียนรายงานปัญหาไว้ที่ /var/log/leapp/leapp-report.txt บนเครื่อง CentOS 7 ที่ติดตั้งแบบปกติ ผลรอบแรกจะขึ้น UPGRADE INHIBITED เกือบทุกครั้ง ซึ่งเป็นเรื่องปกติ
sudo leapp preupgrade
sudo grep -A6 "Risk Factor: high (inhibitor)" /var/log/leapp/leapp-report.txt
ด่านที่พบบ่อยที่สุดบน CentOS 7 มีสามข้อ และแก้ได้ตามคำแนะนำของ ELevate
# ไดรเวอร์ที่ถูกถอดออกใน EL8 (ถ้ารายงานระบุไดรเวอร์อื่น เช่น floppy ให้ถอดตัวนั้นด้วย)
sudo rmmod pata_acpi
# Leapp ต้องการให้กำหนด PermitRootLogin ให้ชัด เพราะค่าเริ่มต้นของ EL8 ต่างจาก EL7
echo PermitRootLogin yes | sudo tee -a /etc/ssh/sshd_config
# ตอบคำถามเรื่องโมดูล pam_pkcs11 ที่ถูกถอดออก
sudo leapp answer --section remove_pam_pkcs11_module_check.confirm=True
คำสั่ง tee -a ต่อบรรทัดไว้ท้ายไฟล์ ถ้า sshd_config ของคุณมีบล็อก Match ที่ใช้งานอยู่ท้ายไฟล์ ให้ย้ายบรรทัดนี้ขึ้นไปไว้เหนือบล็อกนั้นเอง แล้วตรวจด้วย sudo sshd -t อ่านรายงานทั้งไฟล์ ไม่ใช่เฉพาะสามข้อนี้ รายการระดับ high ที่ไม่ใช่ inhibitor ยังต้องอ่าน เช่น แพ็กเกจที่ไม่ได้ลงนามโดย CentOS ซึ่งจะค้างเป็น el7 หลังอัปเกรด รันซ้ำจนบรรทัดสรุปไม่มี inhibitor เหลือ ถ้ามีไฟล์ /var/log/leapp/answerfile ต้องตอบทุกข้อในไฟล์นั้นก่อน