Migrate từ CentOS 8 sang AlmaLinux 9: So sánh 3 phương pháp và hướng dẫn từng bước

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

CentOS 8 chính thức EOL từ 31/12/2021 — nhưng mình thấy vẫn còn không ít server production đang chạy CentOS 8 đến tận bây giờ. Khi thông báo EOL chính thức, mình phải migrate gấp 5 server trong vòng 1 tuần. Lần đó mình thử cả Rocky Linux lẫn AlmaLinux, sau cùng chọn AlmaLinux cho phần lớn server vì lý do sẽ giải thích bên dưới.

Bài này đi thẳng vào kỹ thuật: migrate an toàn từ CentOS 8 lên AlmaLinux 9 mà không mất data, không downtime quá dài. Không phải hướng dẫn cài mới từ đầu.

3 phương pháp migrate — Bức tranh tổng quan

Nhìn tổng quan lại, có 3 con đường để migrate:

Phương pháp 1: Fresh Install + Migrate Data

Cài AlmaLinux 9 mới hoàn toàn lên server khác (hoặc VM mới), rồi chuyển data, config, services từ server CentOS 8 sang.

Phương pháp 2: In-place Migration (cùng major version)

Chuyển CentOS 8 → AlmaLinux 8 ngay trên server đang chạy bằng script chính thức của AlmaLinux. Sau đó nâng tiếp AlmaLinux 8 → AlmaLinux 9 bằng ELevate.

Phương pháp 3: Upgrade trực tiếp qua ELevate

Dùng tool ELevate (wrapper của Red Hat Leapp) để nâng cấp major version tại chỗ. Vẫn cần qua AlmaLinux 8 làm điểm dừng trung gian, nhưng quy trình được tự động hóa hơn.

Phân tích ưu nhược từng phương pháp

Fresh Install — Sạch, nhưng chuẩn bị bỏ ra cả ngày

  • Ưu điểm: Môi trường hoàn toàn sạch, không còn package rác từ CentOS 8, dễ troubleshoot về sau.
  • Nhược điểm: Phải cài lại và cấu hình mọi thứ từ đầu. Server chạy LAMP stack + vài chục custom config có thể ngốn hết 1–2 ngày làm việc.
  • Phù hợp khi: Server đơn giản (1–2 services), hoặc bạn đã có Ansible/Terraform để dựng lại infrastructure trong vài chục phút.

In-place Migration — Ít downtime nhất, được production ưa chuộng

  • Ưu điểm: Giữ nguyên packages, config, data. Downtime thực tế chỉ khoảng 10–20 phút cho mỗi lần reboot.
  • Nhược điểm: Rủi ro xung đột package, đặc biệt nếu server có nhiều repo third-party (EPEL, Remi, repo riêng của vendor).
  • Phù hợp khi: Production server phức tạp, config nhiều, không muốn rebuild từ đầu.

ELevate — Nhanh nhất để lên thẳng v9

  • Ưu điểm: Tool chính thức, có báo cáo chi tiết trước khi upgrade, cộng đồng hỗ trợ tốt.
  • Nhược điểm: Một số package cũ không có bản EL9 tương thích, phải xử lý inhibitor thủ công trước khi chạy.
  • Phù hợp khi: Server không có quá nhiều custom packages, cần lên AlmaLinux 9 nhanh.

Lựa chọn tối ưu cho server production

Sau khi thử cả 3 cách, mình thấy quy trình 2 bước (CentOS 8 → AlmaLinux 8 → AlmaLinux 9) là chắc chắn nhất:

  1. Bước 1 (CentOS 8 → AlmaLinux 8) rất ổn định vì cùng major version, không có breaking change đáng kể.
  2. Bước 2 (AlmaLinux 8 → AlmaLinux 9 qua ELevate) có tài liệu đầy đủ và tool đã được kiểm tra kỹ.

Về lý do chọn AlmaLinux thay vì Rocky Linux: AlmaLinux thường release bản mới trong vòng 1–3 ngày sau khi RHEL ra, Rocky Linux mất khoảng 1–2 tuần. Với production server cần security patch nhanh, cái khoảng cách đó quan trọng hơn nhiều người nghĩ.

Triển khai thực tế: CentOS 8 → AlmaLinux 9

Bước 0: Backup — Không thể bỏ qua

Backup trước, mọi thứ còn lại tính sau:

# Backup /etc (toàn bộ config)
tar -czf /backup/etc-backup-$(date +%Y%m%d).tar.gz /etc/

# Dump database nếu có
mysqldump -u root -p --all-databases > /backup/all-db-$(date +%Y%m%d).sql

# Ghi lại danh sách packages đang cài
rpm -qa > /backup/packages-$(date +%Y%m%d).txt

# Nếu là VM: snapshot ngay bây giờ

Bước 1: Chuẩn bị server CentOS 8

# Update hết packages trước
dnf update -y

# Kiểm tra version hiện tại
cat /etc/centos-release

# Tắt SELinux tạm thời (bật lại sau migrate)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

Bước 2: Migrate CentOS 8 → AlmaLinux 8

# Tải script migration chính thức của AlmaLinux
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh

# Kiểm tra checksum (không bỏ qua bước này)
sha256sum almalinux-deploy.sh

# Chạy script (cần quyền root)
chmod +x almalinux-deploy.sh
sudo bash almalinux-deploy.sh

# Script tự động:
# - Thay thế repo CentOS bằng AlmaLinux repos
# - Swap các package core (centos-release, gpg-keys...)
# - Không xóa data hay config của bạn

Script chạy xong trong khoảng 5–10 phút. Reboot và kiểm tra:

reboot

# Sau khi boot lại
cat /etc/almalinux-release
# AlmaLinux release 8.x (...)

# Xác nhận packages AlmaLinux đã được cài
rpm -qa | grep almalinux

Bước 3: Upgrade AlmaLinux 8 → AlmaLinux 9 bằng ELevate

# Cài ELevate repo
sudo yum install -y https://repo.almalinux.org/elevate/elevate-release-latest-el8.noarch.rpm

# Cài leapp-upgrade và data files cho AlmaLinux
sudo yum install -y leapp-upgrade leapp-data-almalinux

# Chạy pre-upgrade check TRƯỚC KHI làm gì thêm
sudo leapp preupgrade

# Đọc kỹ report — bước này quyết định thành bại
cat /var/log/leapp/leapp-report.txt

Report đổ ra 2 loại vấn đề: inhibitor (block upgrade hoàn toàn, bắt buộc phải fix) và warning (cảnh báo, có thể bỏ qua tùy trường hợp). Phải clear hết inhibitor trước khi tiếp tục. Một số inhibitor hay gặp:

# Inhibitor: packages không có bản EL9
# Fix: gỡ package đó hoặc tìm bản thay thế
dnf remove <package-name>

# Inhibitor: GRUB config không đồng bộ
grub2-mkconfig -o /boot/grub2/grub.cfg

# Inhibitor: pam_pkcs11 module
leapp answer --section remove_pam_pkcs11_module_check.confirm=True

# Inhibitor: VDO devices (nếu không dùng)
leapp answer --section check_vdo.confirm=True

Xử lý xong inhibitor, chạy upgrade thật:

# Chạy upgrade
sudo leapp upgrade

# Reboot vào upgrade environment
# Quá trình upgrade mất khoảng 20–40 phút tùy server
reboot

Bước 4: Kiểm tra sau migrate

# Xác nhận version AlmaLinux 9
cat /etc/almalinux-release
# AlmaLinux release 9.x (Seafoam Ocelot)

uname -r
# Kernel mới của EL9

# Kiểm tra services quan trọng
systemctl status nginx
systemctl status mysqld
systemctl status sshd

# Tìm packages không thuộc repo nào (cần review)
dnf list extras

Bật lại SELinux

# Relabel toàn bộ filesystem (bắt buộc sau major version upgrade)
touch /.autorelabel
reboot

# Sau reboot, bật enforcing lại
sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config
reboot

Những vấn đề thực tế gặp phải khi migrate 5 server

  • PHP version: EL9 mặc định đi kèm PHP 8.1. App cần PHP 7.4 hoặc 8.0 phải thêm repo Remi — cái này tốn thêm khoảng 30 phút setup.
  • MySQL 5.7: EL9 không có MySQL 5.7 trong repo chính thức. Thêm repo MySQL official hoặc upgrade thẳng lên MySQL 8.0 trước khi migrate.
  • Python 2: EL9 bỏ hoàn toàn Python 2. Nếu codebase còn dùng Python 2, port sang Python 3 trước — đừng để đến phút chót mới phát hiện.
  • Crontab: Check lại /etc/crontab/var/spool/cron/ ngay sau migrate. Mình từng mất 1 cron job backup tự động sau khi upgrade — phát hiện ra sau 3 ngày.
  • Custom kernel modules: Module tự compile cho kernel cũ sẽ không chạy được với kernel EL9. Compile lại từ source là bắt buộc.

Checklist kiểm tra sau migrate

# Checklist hậu migrate — tick từng mục
# [ ] cat /etc/almalinux-release → đúng version 9.x
# [ ] uname -r → kernel EL9
# [ ] Tất cả services quan trọng running
# [ ] dnf update -y → không lỗi
# [ ] SELinux enforcing (getenforce)
# [ ] Firewall rules còn nguyên (firewall-cmd --list-all)
# [ ] App hoạt động bình thường (web, DB, API)
# [ ] Log không có error lạ (/var/log/messages)
# [ ] Crontab đủ các job cần thiết
# [ ] Backup đã được cập nhật sau migrate

Migrate CentOS 8 → AlmaLinux 9 không phức tạp, nhưng dễ vấp nếu bỏ qua leapp preupgrade. Dành thêm 30 phút đọc kỹ report và xử lý từng inhibitor — đó là khoản đầu tư xứng đáng nhất trong cả quy trình. Khi upgrade xong không có error, cái cảm giác nhẹ người là rất thật.

Share: