CentOS 8は2021年12月31日に正式にEOLを迎えました — しかし、今もなお本番環境でCentOS 8を稼働させているサーバーは少なくありません。EOLの正式発表を受けて、筆者は1週間で5台のサーバーを緊急移行しなければなりませんでした。その際、Rocky LinuxとAlmaLinuxの両方を試し、後述する理由から最終的にほとんどのサーバーでAlmaLinuxを選択しました。
本記事は技術的な内容に直結します:データを失わず、ダウンタイムを最小限に抑えたCentOS 8からAlmaLinux 9への安全な移行について解説します。ゼロからの新規インストールガイドではありません。
3つの移行方法 — 全体像
全体を俯瞰すると、移行には3つのアプローチがあります:
方法1:Fresh Install + データ移行
別のサーバー(または新しいVM)にAlmaLinux 9をクリーンインストールし、CentOS 8サーバーからデータ、設定、サービスを移行する方法です。
方法2:In-place Migration(同一メジャーバージョン)
AlmaLinuxの公式スクリプトを使用して、稼働中のサーバー上でCentOS 8をAlmaLinux 8に変換します。その後、ELevateを使ってAlmaLinux 8からAlmaLinux 9にアップグレードします。
方法3:ELevateによる直接アップグレード
ELevateツール(Red Hat Leappのラッパー)を使ってメジャーバージョンをその場でアップグレードします。AlmaLinux 8を中間ステップとして経由する必要がありますが、プロセスはより自動化されています。
各方法のメリット・デメリット分析
Fresh Install — クリーンだが、丸一日かかる覚悟で
- メリット:完全にクリーンな環境で、CentOS 8からの不要なパッケージが残らず、後のトラブルシューティングが容易です。
- デメリット:すべてを最初からインストールし直し、設定し直す必要があります。LAMP stackに数十のカスタム設定が施されたサーバーでは、1〜2日の作業になる可能性があります。
- 適している場面:シンプルなサーバー(1〜2サービス)、またはAnsible/Terraformでインフラを数十分で再構築できる場合。
In-place Migration — ダウンタイム最小、本番環境で好まれる
- メリット:パッケージ、設定、データをそのまま維持できます。実際のダウンタイムは各再起動で約10〜20分程度です。
- デメリット:パッケージの競合リスクがあります。特にサードパーティリポジトリ(EPEL、Remi、ベンダー独自リポジトリ)が多いサーバーでは注意が必要です。
- 適している場面:複雑な設定が多い本番サーバーで、最初から再構築したくない場合。
ELevate — v9への最速の直接アップグレード
- メリット:公式ツールで、アップグレード前に詳細なレポートを提供し、コミュニティサポートも充実しています。
- デメリット:一部の古いパッケージにEL9互換バージョンがなく、実行前にinhibitorを手動で対処する必要があります。
- 適している場面:カスタムパッケージが少なく、AlmaLinux 9に素早く移行したい場合。
本番サーバーに最適な選択
3つの方法をすべて試した結果、2ステッププロセス(CentOS 8 → AlmaLinux 8 → AlmaLinux 9)が最も確実だと感じています:
- ステップ1(CentOS 8 → AlmaLinux 8)は同一メジャーバージョンのため非常に安定しており、大きなbreaking changeがありません。
- ステップ2(AlmaLinux 8 → AlmaLinux 9、ELevate経由)はドキュメントが充実しており、ツールも十分にテストされています。
Rocky LinuxではなくAlmaLinuxを選んだ理由について:AlmaLinuxはRHELリリース後1〜3日以内に新バージョンをリリースしますが、Rocky Linuxは約1〜2週間かかります。セキュリティパッチを迅速に適用する必要がある本番サーバーでは、この差は多くの人が思う以上に重要です。
実際の移行手順:CentOS 8 → AlmaLinux 9
ステップ0:バックアップ — 絶対に省略不可
まずバックアップ、それから残りを考えましょう:
# /etc のバックアップ(全設定ファイル)
tar -czf /backup/etc-backup-$(date +%Y%m%d).tar.gz /etc/
# データベースのダンプ(存在する場合)
mysqldump -u root -p --all-databases > /backup/all-db-$(date +%Y%m%d).sql
# インストール済みパッケージの一覧を記録
rpm -qa > /backup/packages-$(date +%Y%m%d).txt
# VMの場合:今すぐスナップショットを取得
ステップ1:CentOS 8サーバーの準備
# まず全パッケージをアップデート
dnf update -y
# 現在のバージョンを確認
cat /etc/centos-release
# SELinuxを一時的に無効化(移行後に再有効化)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
ステップ2:CentOS 8 → AlmaLinux 8への移行
# AlmaLinuxの公式移行スクリプトをダウンロード
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
# チェックサムの確認(このステップを省略しないこと)
sha256sum almalinux-deploy.sh
# スクリプトを実行(root権限が必要)
chmod +x almalinux-deploy.sh
sudo bash almalinux-deploy.sh
# スクリプトは自動的に実行します:
# - CentOSリポジトリをAlmaLinuxリポジトリに置き換え
# - コアパッケージを入れ替え(centos-release、gpg-keysなど)
# - データや設定は削除しない
スクリプトは約5〜10分で完了します。再起動して確認しましょう:
reboot
# 再起動後
cat /etc/almalinux-release
# AlmaLinux release 8.x (...)
# AlmaLinuxパッケージがインストールされていることを確認
rpm -qa | grep almalinux
ステップ3:ELevateを使ったAlmaLinux 8 → AlmaLinux 9のアップグレード
# ELevateリポジトリをインストール
sudo yum install -y https://repo.almalinux.org/elevate/elevate-release-latest-el8.noarch.rpm
# leapp-upgradeとAlmaLinux用データファイルをインストール
sudo yum install -y leapp-upgrade leapp-data-almalinux
# 他の作業を行う前にpre-upgradeチェックを実行
sudo leapp preupgrade
# レポートをよく読む — このステップが成否を左右する
cat /var/log/leapp/leapp-report.txt
レポートには2種類の問題が出力されます:inhibitor(アップグレードを完全にブロックするため必ず修正が必要)とwarning(警告で、状況に応じて無視可能)。続行前にすべてのinhibitorをクリアする必要があります。よく見られるinhibitorの例:
# Inhibitor: EL9バージョンが存在しないパッケージ
# 修正: そのパッケージを削除するか代替品を探す
dnf remove <package-name>
# Inhibitor: GRUB設定が同期していない
grub2-mkconfig -o /boot/grub2/grub.cfg
# Inhibitor: pam_pkcs11モジュール
leapp answer --section remove_pam_pkcs11_module_check.confirm=True
# Inhibitor: VDOデバイス(使用していない場合)
leapp answer --section check_vdo.confirm=True
inhibitorへの対処が完了したら、実際のアップグレードを実行します:
# アップグレードを実行
sudo leapp upgrade
# アップグレード環境に再起動
# アップグレードプロセスはサーバーによって約20〜40分かかります
reboot
ステップ4:移行後の確認
# AlmaLinux 9のバージョンを確認
cat /etc/almalinux-release
# AlmaLinux release 9.x (Seafoam Ocelot)
uname -r
# EL9の新しいカーネル
# 重要なサービスを確認
systemctl status nginx
systemctl status mysqld
systemctl status sshd
# どのリポジトリにも属さないパッケージを検索(要確認)
dnf list extras
SELinuxの再有効化
# ファイルシステム全体を再ラベル付け(メジャーバージョンアップグレード後は必須)
touch /.autorelabel
reboot
# 再起動後、enforcingモードを再有効化
sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config
reboot
5台のサーバー移行で実際に遭遇した問題
- PHPバージョン:EL9にはデフォルトでPHP 8.1が含まれます。PHP 7.4または8.0が必要なアプリはRemiリポジトリを追加する必要があります — セットアップに約30分追加でかかります。
- MySQL 5.7:EL9の公式リポジトリにはMySQL 5.7がありません。MySQL公式リポジトリを追加するか、移行前にMySQL 8.0に直接アップグレードしてください。
- Python 2:EL9ではPython 2が完全に削除されました。コードベースでまだPython 2を使用している場合は、Python 3に移植してから移行してください — 最後の最後に発覚しないよう注意が必要です。
- Crontab:移行直後に
/etc/crontabと/var/spool/cron/を確認してください。筆者はアップグレード後に自動バックアップのcronジョブが消えてしまい、3日後に気づいたことがあります。 - カスタムカーネルモジュール:古いカーネル向けに自前でコンパイルしたモジュールはEL9カーネルでは動作しません。ソースから再コンパイルが必須です。
移行後の確認チェックリスト
# 移行後チェックリスト — 各項目を確認
# [ ] cat /etc/almalinux-release → バージョン9.xであることを確認
# [ ] uname -r → EL9カーネルであることを確認
# [ ] すべての重要なサービスが起動していること
# [ ] dnf update -y → エラーなしで完了すること
# [ ] SELinuxがenforcingモード(getenforceで確認)
# [ ] ファイアウォールルールが維持されていること(firewall-cmd --list-allで確認)
# [ ] アプリケーションが正常に動作していること(web、DB、API)
# [ ] 不審なエラーがないこと(/var/log/messages)
# [ ] 必要なcronジョブがすべて存在すること
# [ ] 移行後にバックアップが更新されていること
CentOS 8からAlmaLinux 9への移行は複雑ではありませんが、leapp preupgradeを省略すると躓きやすくなります。レポートを丁寧に読み、inhibitorを一つひとつ対処するための30分は、プロセス全体で最も価値ある投資です。エラーなしでアップグレードが完了したときの達成感は、本当に格別なものがあります。

