
差し迫ったCentOS Linux 7のサポート終了対応
当社では、社内システムの運用にLinuxを活用しています。様々なディストリビューションを採用したLinuxサーバーが存在しますが、その中でも最も多いのが CentOS Linux 7 です。このディストリビューションは2024年6月30日にサポート終了を迎えるため、その対応として後継OSとして採用を決定した Rocky Linux 9 に移行する作業を進めています。
移行には、現行のサーバーを構築した際の手順書などを元に、後継OSをクリーンインストールした環境に手順を再適用する方法が一般的です。しかし、移行すべき台数が多いこともあり、少しでも作業を楽にするために、一部のサーバーについてはインプレースアップグレードを実現できるツールである ELevate ⧉ を利用して移行しました。この記事では、このアップグレードツールについて、実際の移行時に遭遇したトラブルも含めて紹介します。
RHEL 派生ディストリビューション移行ツール ELevate
ELevateは、Red Hat Enterprise Linux(RHEL)ベースのディストリビューションに対して、メジャーバージョン間のアップグレードを提供するオープンソースのツールです。RHEL のアップグレードに特化した Leapp フレームワークを元に、AlmaLinux の開発元が中心となって、AlmaLinux をはじめとする RHEL 派生ディストリビューションにも対応できるように拡張されました。2024年3月時点で、ELevate は次のアップグレードパスをサポートしています。
ELevate には、以下の制約事項があります。
- セキュアブートが実行されている環境では非サポート。
- ELevateを実行する前に、セキュアブートの無効化が必要。
- 各ディストリビューションが提供する公式リポジトリのみサポート。
- EPELなどから入手したアプリケーションは、移行後に別途再インストール。
- 2回の再起動が必要なため、無停止での移行は不可能。
- サーバーメンテナンスのスケジュール調整が必要。
- 移行対象のサーバーに必要な搭載メモリは2GB以上。
- メモリが少ないと、再起動時にエマージェンシーモードに陥る。
- 復旧にはシステムのバックアップまたは仮想マシンのスナップショットが必要。
また、移行はインプレースアップグレードとして行われるため、データやアプリケーション、設定は保持されます。このため、制約事項を受け入れられる場合には、ELevate は強力なツールとなります。
Rocky Linux 9 へのアップグレード
ここからは、実際に CentOS Linux 7のサーバーを何台か ELevate で Rocky Linux 9 に移行して、確立されたアップグレード手順を紹介します。
CentOS Linux 7 から Rocky Linux 8 への移行
アップグレードパスで説明したように、まずは Rocky Linux 8 に移行する必要があります。仮想マシンのスナップショット取得など、サーバーのバックアップを実施してから、以下の手順を実施します。
また、サーバーにSSH接続している場合は、シリアルコンソール接続などを有効化し、トラブルシューティングができるようにします。パッケージのアップグレードは、再起動によるブートの際に行われるため、失敗時にはSSHサーバーの起動まで処理が進まず、ログの確認などができなくなるからです。
- (インターネット接続にプロキシが必要なサーバーのみ)yumに対してプロキシの設定を実施。
/etc/yum.conf
に対して、最後の行に以下のように記述。
proxy=http://proxyHost:proxyPort- 以後、
proxyHost
とproxyPort
は利用中のプロキシサーバーに応じて変更。
- 最新のアップデートをインストールして、再起動。
Terminal window $ sudo yum update -y$ sudo reboot - アップグレード前のインストール済みパッケージ一覧を出力。
Terminal window $ rpm -qa --queryformat "%{NAME}\n" | sort > ~/centos7.lst elevate-release
プロジェクトリポジトリをインストール。Terminal window $ sudo yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm- LeappパッケージとRocky Linux用の移行データをインストール。
Terminal window $ sudo yum install -y leapp-upgrade leapp-data-rocky- Rocky Linux以外に移行する場合は、
leapp-data-rocky
を対応するパッケージに変更。
- Rocky Linux以外に移行する場合は、
- (インターネット接続にプロキシが必要なサーバーのみ)
leapp
コマンドがプロキシを扱えるように、アップグレード用のリポジトリに対して設定。Terminal window $ export https_proxy=http://proxyHost:proxyPort$ sudo sed -i "/^enabled=.*/a proxy=$https_proxy" /etc/leapp/files/leapp_upgrade_repositories.repo - アップグレードの事前チェックを実行。
Terminal window $ sudo leapp preupgrade - チェック結果が
/var/log/leapp/leapp-report.txt
に出力されるので、内容を確認。- 各結果は、次のように「Risk Factor」、「Title」、「Summary」、「Remediation」、「Key」から構成。
Risk Factor: high (inhibitor)Title: Missing required answers in the answer fileSummary: One or more sections in answerfile are missing user choices: remove_pam_pkcs11_module_check.confirmFor more information consult https://leapp.readthedocs.io/en/latest/dialogs.htmlRemediation: [hint] Please register user choices with leapp answer cli command or by manually editing the answerfile.[command] leapp answer --section remove_pam_pkcs11_module_check.confirm=TrueKey: d35f6c6b1b1fa6924ef442e3670d90fa92f0d54b
- 「Risk Factor」が
high (inhibitor)
である結果は必ず対応しないと、アップグレード不可。 - 結果の中には、インストール済みパッケージの非互換性と対処方法などもあるため、ひととおり目を通すことを強く推奨。
- 各結果は、次のように「Risk Factor」、「Title」、「Summary」、「Remediation」、「Key」から構成。
- アップグレードを阻害するリスクに対応するために、以下のコマンドを実行。
Terminal window $ sudo leapp answer --section remove_pam_pkcs11_module_check.confirm=True- ここでは、共通で指摘された項目のみ紹介。それ以外の項目は、結果の「Summary」や「Remediation」を参照。
- 事前チェックを再度実行し、アップグレードを阻害するリスクが存在しなくなったことを確認。
Terminal window $ sudo leapp preupgrade - アップグレードを開始し、サーバーを再起動。
Terminal window $ sudo leapp upgrade$ sudo reboot - 再起動の完了後に、現在のOSバージョンを確認。
- 例えば、Rocky Linux 8.8にアップグレードした場合
Terminal window $ cat /etc/redhat-releaseRocky Linux release 8.8 (Green Obsidian)$ cat /etc/os-releaseNAME="Rocky Linux"VERSION="8.8 (Green Obsidian)"ID="rocky"ID_LIKE="rhel centos fedora"VERSION_ID="8.8"PLATFORM_ID="platform:el8"PRETTY_NAME="Rocky Linux 8.8 (Green Obsidian)"ANSI_COLOR="0;32"LOGO="fedora-logo-icon"CPE_NAME="cpe:/o:rocky:rocky:8:GA"HOME_URL="https://rockylinux.org/"BUG_REPORT_URL="https://bugs.rockylinux.org/"SUPPORT_END="2029-05-31"ROCKY_SUPPORT_PRODUCT="Rocky-Linux-8"ROCKY_SUPPORT_PRODUCT_VERSION="8.8"REDHAT_SUPPORT_PRODUCT="Rocky Linux"REDHAT_SUPPORT_PRODUCT_VERSION="8.8"
- 例えば、Rocky Linux 8.8にアップグレードした場合
- 以前から残っているパッケージを確認し、それらを削除するか、手動で更新。
Terminal window $ rpm -qa | grep el7leapp-data-rocky-0.1-6.el7.noarchkernel-3.10.0-1160.99.1.el7.x86_64python2-leapp-0.14.0-1.el7.noarchleapp-upgrade-el7toel8-0.16.0-6.el7.elevate.17.noarchbtrfs-progs-4.9.1-1.el7.x86_64kernel-3.10.0-1160.el7.x86_64leapp-0.14.0-1.el7.noarchyum-plugin-fastestmirror-1.1.31-54.el7_8.noarchelevate-release-1.0-2.el7.noarch- CentOS Linux 7を最小限のインストールで構築した環境では、上記のCentOS Linux 7用のパッケージが存在。
- これらのパッケージについて、以下の対応を実施。
- Rocky Linux 9への移行に必要な
leapp-upgrade
パッケージが、競合するため削除。
Terminal window $ sudo yum remove -y python2-leapp leapp-upgrade-el7toel8 leapp leapp-data-rocky elevate-release --disableexcludes=all- ELevate のログ(
/var/log/leapp/leapp-report.txt
)に記載された推奨事項Some RHEL 7 packages have not been upgraded
に従い、パッケージを削除。
Terminal window $ sudo yum remove -y kernel-3.10.0-1160.99.1.el7 btrfs-progs-4.9.1-1.el7 kernel-3.10.0-1160.el7 yum-plugin-fastestmirror-1.1.31-54.el7_8 - Rocky Linux 9への移行に必要な
- アップグレード時に出力されたログファイルを念のために確認。
Terminal window $ cat /var/log/leapp/leapp-report.txt$ cat /var/log/leapp/leapp-upgrade.log - Rocky Linux 9への移行時に問題となるため、アップグレードの際に作成されたディレクトリを削除。
Terminal window $ sudo rm -Rf /root/tmp_leapp_py3 - インプレースアップグレード後は不要となるパッケージを削除。
Terminal window $ sudo yum remove -y kernel-workaround - アップグレード後のインストール済みパッケージ一覧を出力。
Terminal window $ rpm -qa --queryformat "%{NAME}\n" | sort > ~/rocky8.lst
Rocky Linux 8 から Rocky Linux 9 への移行
サーバーが無事にアップグレードできると、いよいよ Rocky Linux 9 に移行することができます。仮想マシンのスナップショット取得など、サーバーのバックアップを再度実施してから、以下の手順を実施します。
- (インターネット接続にプロキシが必要なサーバーのみ)dnfに対してプロキシの設定を実施。
/etc/dnf/dnf.conf
に対して、最後の行に以下のように記述。
proxy=http://proxyHost:proxyPort - 最新のアップデートをインストールして、再起動。
Terminal window $ sudo dnf update -y$ sudo reboot elevate-release
プロジェクトリポジトリをインストール。Terminal window $ sudo dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm- LeappパッケージとRocky Linux用の移行データをインストール。
Terminal window $ sudo dnf install -y leapp-upgrade leapp-data-rocky --disableexcludes=all - (インターネット接続にプロキシが必要なサーバーのみ)
leapp
コマンドがプロキシを扱えるように、アップグレード用のリポジトリに対して設定。Terminal window $ export https_proxy=http://proxyHost:proxyPort$ sudo sed -i "/^enabled=.*/a proxy=$https_proxy" /etc/leapp/files/leapp_upgrade_repositories.repo - アップグレードの事前チェックを実行。
Terminal window $ sudo leapp preupgrade - チェック結果が
/var/log/leapp/leapp-report.txt
に出力されるので、内容を確認。 - アップグレードを阻害するリスクに対応するために、以下のコマンドを実行。
Terminal window $ sudo sed -i "s/^AllowZoneDrifting=.*/AllowZoneDrifting=no/" /etc/firewalld/firewalld.conf$ sudo leapp answer --section check_vdo.no_vdo_devices=True- ここでは、共通で指摘された項目のみに対処。 - それ以外の項目は、結果の「Summary」や「Remediation」を参照。
- 事前チェックを再度実行し、アップグレードを阻害するリスクが存在しなくなったことを確認。
Terminal window $ sudo leapp preupgrade leapp upgrade
の実行時に、コンフリクトが発生するパッケージを事前に削除。Terminal window $ sudo dnf remove -y make-devel rocky-logos- アップグレードを開始し、システムを再起動。
Terminal window $ sudo leapp upgrade$ sudo reboot - 再起動の完了後に、現在のOSバージョンを確認。
- 例えば、Rocky Linux 9.2にアップグレードした場合。
Terminal window $ cat /etc/redhat-releaseRocky Linux release 9.2 (Blue Onyx)$ cat /etc/os-releaseNAME="Rocky Linux"VERSION="9.2 (Blue Onyx)"ID="rocky"ID_LIKE="rhel centos fedora"VERSION_ID="9.2"PLATFORM_ID="platform:el9"PRETTY_NAME="Rocky Linux 9.2 (Blue Onyx)"ANSI_COLOR="0;32"LOGO="fedora-logo-icon"CPE_NAME="cpe:/o:rocky:rocky:9::baseos"HOME_URL="https://rockylinux.org/"BUG_REPORT_URL="https://bugs.rockylinux.org/"SUPPORT_END="2032-05-31"ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"ROCKY_SUPPORT_PRODUCT_VERSION="9.2"REDHAT_SUPPORT_PRODUCT="Rocky Linux"REDHAT_SUPPORT_PRODUCT_VERSION="9.2" - 以前から残っているパッケージを確認し、それらを削除するか、手動で更新。
Terminal window $ rpm -qa | grep el8qrencode-libs-3.4.4-5.el8.x86_64python3-leapp-0.14.0-1.el8_6.noarchkernel-core-4.18.0-477.27.1.el8_8.x86_64iwl3945-firmware-15.32.2.9-117.el8_8.1.noarchpython36-3.6.8-38.module+el8.5.0+671+195e4563.x86_64elevate-release-1.0-2.el8.noarchleapp-upgrade-el8toel9-0.16.0-6.el8_6.elevate.17.noarchkernel-4.18.0-477.27.1.el8_8.x86_64libcgroup-0.41-19.el8.x86_64iwl4965-firmware-228.61.2.24-117.el8_8.1.noarchleapp-repository-deps-el8-5.0.8-100.202203181036Z.249925a3.master.el8.noarchpython2-pip-wheel-9.0.3-19.module+el8.6.0+793+57002515.noarchkernel-modules-4.18.0-477.27.1.el8_8.x86_64leapp-0.14.0-1.el8_6.noarchfipscheck-lib-1.5.0-4.el8.x86_64python2-setuptools-wheel-39.0.1-13.module+el8.4.0+403+9ae17a31.noarchgeoipupdate-2.5.0-2.el8.x86_64fipscheck-1.5.0-4.el8.x86_64kernel-modules-extra-4.18.0-477.27.1.el8_8.x86_64libdnet-1.12-26.el8.x86_64iwl6000-firmware-9.221.4.1-117.el8_8.1.noarchleapp-data-rocky-0.2-2.el8.noarch- 最小限のインストールによるCentOS Linux 7から移行してきた環境では、上記のRocky Linux 8用のパッケージが存在。
- 一部のパッケージについては、サーバーの用途によらず、以下の対応を実施。
- Rocky Linux 9 が提供するカーネルもインストール済みのため、削除。
Terminal window $ sudo dnf remove -y kernel-4.18.0-477.27.1.el8_8 kernel-core-4.18.0-477.27.1.el8_8 kernel-modules-4.18.0-477.27.1.el8_8 kernel-modules-extra-4.18.0-477.27.1.el8_8- ELevate および関連パッケージであり、インプレースアップグレード後は不要なため削除。
Terminal window $ sudo dnf remove -y python3-leapp leapp-upgrade-el8toel9 leapp leapp-data-rocky leapp-repository-deps-el8-5.0.8-100.202203181036Z.249925a3.master.el8 elevate-release --disableexcludes=all
- アップグレード時に出力されたログファイルを念のために確認。
Terminal window $ cat /var/log/leapp/leapp-report.txt$ cat /var/log/leapp/leapp-upgrade.log
アップグレードにおけるトラブルシュート
ここでは、移行中および移行時に遭遇した問題と解決策について紹介します。
アップグレード時に At least XXXMB more space needed on the filesystem. エラー
leapp upgrade
コマンドを実行したところ、「/
ファイルシステムの空き容量が 412MB 足りない」とエラーになりました。
Error Summary-------------Disk Requirements: At least 412MB more space needed on the / filesystem.
============================================================ END OF ERRORS============================================================
Debug output written to /var/log/leapp/leapp-upgrade.log
ディスクの空き容量に余裕があったので、/
のファイルシステムを10GB以上も拡張しました。しかし、アップグレードを再実行すると、また、少なくとも411MB以上の空き容量が必要だというエラーが表示されました。
解決策
インターネットでエラーメッセージを検索したところ、アップグレード中に使用される Leapp オーバーレイ・ファイル・システム内の領域が不足した場合に、このエラーメッセージが表示されて、失敗することが分かりました。
回避策として、アップグレードが成功するまで、LEAPP_OVL_SIZE
環境変数を増やし続けるとの記載がありましたので、未設定時のデフォルト値である2048MBから1GB増やした値である3072で、アップグレードを再実行してみました。
# export LEAPP_OVL_SIZE=3072# leapp upgrade
すると、今度はエラーが表示されずに、leapp upgrade
コマンドが完了しました。
PHP ベースの Web アプリケーション
PHP ベースの Web アプリ用のサーバーを Rocky Linux 8 へアップグレードし、動作確認のために Web アプリにアクセスしたところ、"503 Service Unavailable"が表示されました。Webサーバー(Apache HTTP Server)のログには、以下のエラーメッセージが記録されていました。
[Wed Oct 25 16:37:30.119363 2023] [proxy:error] [pid 12694:tid 140461528278784] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed[Wed Oct 25 16:37:30.119398 2023] [proxy_fcgi:error] [pid 12694:tid 140461528278784] [client 10.XXX.YYY.ZZZ:64312] AH01079: failed to make connection to backend: httpd-UDS
解決策
アップグレード前の状態を確認したところ、httpd
と mod_php
のパッケージの組み合わせで、Web アプリを動かしていました。Rocky Linux 8 では、この mod_php
が非推奨となり、デフォルトで PHP-FPM が呼び出すようになっていました。
そこで、PHP のインストール状況を確認したところ、次のように php-fpm
パッケージは未インストールでした。
$ rpm -qa | grep phpphp-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64php-gmp-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64php-common-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64php-cli-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64php-xml-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64php-json-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64php-pecl-zip-1.15.3-1.module+el8.4.0+413+c9202dda.x86_64
Rocky Linux 9 にアップグレードしてから対処することも検討しましたが、Rocky Linux 8 のままでいく可能性もあったため、この段階で対処することにしました。
Rocky Linux 8 では複数の PHP バージョンが提供されており、各バージョンがいつまでサポートされるかは、アップストリームである RHEL の下記ページから確認できます。
それによると、各バージョンのサポート終了は以下の通りでした。
PHPのバージョン | サポート終了 | 備考 |
---|---|---|
7.2 | 2021年5月 | |
7.3 | 2021年11月 | |
7.4 | 2029年5月 | Rocky Linux 8 と同じ |
8.0 | 2024年11月 |
アップグレード時に導入された PHP 7.2 はサポートが既に終了していたので、Rocky Linux 8 のサポート終了と同じ期間サポートが続く PHP 7.4 にアップデートすることに決めました。
$ sudo dnf module reset php$ sudo dnf module enable php:7.4$ sudo dnf module -y install php:7.4/common$ sudo systemctl restart httpd
PHP 7.4 のインストール後に、Webサーバーを再起動すると、php-fpm
サービスも自動で起動して、Web アプリにアクセスできるようになりました。
EPEL リポジトリに移動したパッケージ
これまで利用していたシェルスクリプトがアップグレード後に、command not found
で失敗するようになりました。インストール済みのパッケージを確認したところ、エラーとなったコマンドを提供していたパッケージがありません。そこで、dnf
コマンドで追加インストールを試みましたが、Unable to find a match
エラーで失敗しました。
解決策
Rocky Linux に限らず、RHEL 派生ディストリビューションには、メジャーバージョンが上がるごとに、公式リポジトリから削除されたパッケージがそれなりに発生します。インストールに失敗したパッケージも、そのようなパッケージの一つでした。
アップグレードの事前チェックでは、パッケージがアップデートできずに削除されることは指摘されなかったので、アップグレード前後で取得したパッケージの一覧を比較して確認することを推奨します。ただし、名前変更やマージされただけのパッケージも存在するため、アップストリームである RHEL の下記ドキュメントも参照してください。
公式リポジトリから削除されたパッケージの中には、Fedora プロジェクトによる EPEL リポジトリで提供するようになったものも存在します。スクリプトで失敗したコマンドも、幸運なことに EPEL リポジトリで提供されていたので、リポジトリの有効化とパッケージの追加インストールで対処しました。
EPEL リポジトリを有効化するには、以下のコマンドを実行します。
- Rocky Linux 8 の場合
Terminal window $ sudo dnf config-manager --set-enabled crb$ dnf install -y epel-release - Rocky Linux 9 の場合
Terminal window $ sudo dnf config-manager --set-enabled powertools$ sudo dnf install -y epel-release
後は、いつも通りにパッケージを追加インストールするだけです。
おわりに
この記事では、2024年6月にサポート終了を迎えるCentOS Linux 7のサーバーから移行する方法として、ELevate を用いたインプレースアップグレードを実際に遭遇したトラブルシュートとともに紹介しました。いくつかの制約事項が存在し、アップグレード後の動作確認が不要になるほど万能ではないですが、クリーンインストールした状態から再構築するよりは確実に楽でした。
この記事を読む前から、Rocky Linux 8 や AlmaLinux 8 へ既に移行済みという方もいると思います。しかし、約5年後に今度は RHEL 8 派生ディストリビューションがサポート終了を迎えます。その際に、ELevate というツールが存在したなと思い出していただければ幸いです。