CentOS Linux 7のサポート終了にインプレースアップグレードで対処した話

カバー

差し迫った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サーバーの起動まで処理が進まず、ログの確認などができなくなるからです。

  1. (インターネット接続にプロキシが必要なサーバーのみ)yumに対してプロキシの設定を実施。
    • /etc/yum.conf に対して、最後の行に以下のように記述。
    proxy=http://proxyHost:proxyPort
    
    • 以後、proxyHostproxyPortは利用中のプロキシサーバーに応じて変更。
  2. 最新のアップデートをインストールして、再起動。
    $ sudo yum update -y
    $ sudo reboot
    
  3. アップグレード前のインストール済みパッケージ一覧を出力。
    $ rpm -qa --queryformat "%{NAME}\n" | sort > ~/centos7.lst
    
  4. elevate-release プロジェクトリポジトリをインストール。
    $ sudo yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm
    
  5. LeappパッケージとRocky Linux用の移行データをインストール。
    $ sudo yum install -y leapp-upgrade leapp-data-rocky
    
    • Rocky Linux以外に移行する場合は、leapp-data-rockyを対応するパッケージに変更。
  6. (インターネット接続にプロキシが必要なサーバーのみ)leapp コマンドがプロキシを扱えるように、アップグレード用のリポジトリに対して設定。
    $ export https_proxy=http://proxyHost:proxyPort
    $ sudo sed -i "/^enabled=.*/a proxy=$https_proxy" /etc/leapp/files/leapp_upgrade_repositories.repo
    
  7. アップグレードの事前チェックを実行。
    $ sudo leapp preupgrade
    
  8. チェック結果が/var/log/leapp/leapp-report.txt に出力されるので、内容を確認。
    • 各結果は、次のように「Risk Factor」、「Title」、「Summary」、「Remediation」、「Key」から構成。
      Risk Factor: high (inhibitor)
      Title: Missing required answers in the answer file
      Summary: One or more sections in answerfile are missing user choices: remove_pam_pkcs11_module_check.confirm
      For more information consult https://leapp.readthedocs.io/en/latest/dialogs.html
      Remediation: [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=True
      Key: d35f6c6b1b1fa6924ef442e3670d90fa92f0d54b
      
    • 「Risk Factor」が high (inhibitor) である結果は必ず対応しないと、アップグレード不可。
    • 結果の中には、インストール済みパッケージの非互換性と対処方法などもあるため、ひととおり目を通すことを強く推奨。
  9. アップグレードを阻害するリスクに対応するために、以下のコマンドを実行。
    $ sudo leapp answer --section remove_pam_pkcs11_module_check.confirm=True
    
    • ここでは、共通で指摘された項目のみ紹介。それ以外の項目は、結果の「Summary」や「Remediation」を参照。
  10. 事前チェックを再度実行し、アップグレードを阻害するリスクが存在しなくなったことを確認。
    $ sudo leapp preupgrade
    
  11. アップグレードを開始し、サーバーを再起動。
    $ sudo leapp upgrade
    $ sudo reboot
    
  12. 再起動の完了後に、現在のOSバージョンを確認。
    • 例えば、Rocky Linux 8.8にアップグレードした場合
      $ cat /etc/redhat-release
      Rocky Linux release 8.8 (Green Obsidian)
      $ cat /etc/os-release
      NAME="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"
      
  13. 以前から残っているパッケージを確認し、それらを削除するか、手動で更新。
    $ rpm -qa | grep el7
    leapp-data-rocky-0.1-6.el7.noarch
    kernel-3.10.0-1160.99.1.el7.x86_64
    python2-leapp-0.14.0-1.el7.noarch
    leapp-upgrade-el7toel8-0.16.0-6.el7.elevate.17.noarch
    btrfs-progs-4.9.1-1.el7.x86_64
    kernel-3.10.0-1160.el7.x86_64
    leapp-0.14.0-1.el7.noarch
    yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch
    elevate-release-1.0-2.el7.noarch
    
    • CentOS Linux 7を最小限のインストールで構築した環境では、上記のCentOS Linux 7用のパッケージが存在。
    • これらのパッケージについて、以下の対応を実施。
      • Rocky Linux 9への移行に必要な leapp-upgrade パッケージが、競合するため削除。
      $ 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 に従い、パッケージを削除。
      $ 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
      
  14. アップグレード時に出力されたログファイルを念のために確認。
    $ cat /var/log/leapp/leapp-report.txt
    $ cat /var/log/leapp/leapp-upgrade.log
    
  15. Rocky Linux 9への移行時に問題となるため、アップグレードの際に作成されたディレクトリを削除。
    $ sudo rm -Rf /root/tmp_leapp_py3
    
  16. インプレースアップグレード後は不要となるパッケージを削除。
    $ sudo yum remove -y kernel-workaround
    
  17. アップグレード後のインストール済みパッケージ一覧を出力。
    $ rpm -qa --queryformat "%{NAME}\n" | sort > ~/rocky8.lst
    

Rocky Linux 8 から Rocky Linux 9 への移行

サーバーが無事にアップグレードできると、いよいよ Rocky Linux 9 に移行することができます。仮想マシンのスナップショット取得など、サーバーのバックアップを再度実施してから、以下の手順を実施します。

  1. (インターネット接続にプロキシが必要なサーバーのみ)dnfに対してプロキシの設定を実施。
    • /etc/dnf/dnf.conf に対して、最後の行に以下のように記述。
    proxy=http://proxyHost:proxyPort
    
  2. 最新のアップデートをインストールして、再起動。
    $ sudo dnf update -y
    $ sudo reboot
    
  3. elevate-release プロジェクトリポジトリをインストール。
    $ sudo dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm
    
  4. LeappパッケージとRocky Linux用の移行データをインストール。
    $ sudo dnf install -y leapp-upgrade leapp-data-rocky --disableexcludes=all
    
  5. (インターネット接続にプロキシが必要なサーバーのみ)leapp コマンドがプロキシを扱えるように、アップグレード用のリポジトリに対して設定。
    $ export https_proxy=http://proxyHost:proxyPort
    $ sudo sed -i "/^enabled=.*/a proxy=$https_proxy" /etc/leapp/files/leapp_upgrade_repositories.repo
    
  6. アップグレードの事前チェックを実行。
    $ sudo leapp preupgrade
    
  7. チェック結果が/var/log/leapp/leapp-report.txt に出力されるので、内容を確認。
  8. アップグレードを阻害するリスクに対応するために、以下のコマンドを実行。
    $ sudo sed -i "s/^AllowZoneDrifting=.*/AllowZoneDrifting=no/" /etc/firewalld/firewalld.conf
    $ sudo leapp answer --section check_vdo.no_vdo_devices=True
    
    • ここでは、共通で指摘された項目のみに対処。 - それ以外の項目は、結果の「Summary」や「Remediation」を参照。
  9. 事前チェックを再度実行し、アップグレードを阻害するリスクが存在しなくなったことを確認。
    $ sudo leapp preupgrade
    
  10. leapp upgradeの実行時に、コンフリクトが発生するパッケージを事前に削除。
    $ sudo dnf remove -y make-devel rocky-logos
    
  11. アップグレードを開始し、システムを再起動。
    $ sudo leapp upgrade
    $ sudo reboot
    
  12. 再起動の完了後に、現在のOSバージョンを確認。
    • 例えば、Rocky Linux 9.2にアップグレードした場合。
    $ cat /etc/redhat-release
    Rocky Linux release 9.2 (Blue Onyx)
    $ cat /etc/os-release
    NAME="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"
    
  13. 以前から残っているパッケージを確認し、それらを削除するか、手動で更新。
    $ rpm -qa | grep el8
    qrencode-libs-3.4.4-5.el8.x86_64
    python3-leapp-0.14.0-1.el8_6.noarch
    kernel-core-4.18.0-477.27.1.el8_8.x86_64
    iwl3945-firmware-15.32.2.9-117.el8_8.1.noarch
    python36-3.6.8-38.module+el8.5.0+671+195e4563.x86_64
    elevate-release-1.0-2.el8.noarch
    leapp-upgrade-el8toel9-0.16.0-6.el8_6.elevate.17.noarch
    kernel-4.18.0-477.27.1.el8_8.x86_64
    libcgroup-0.41-19.el8.x86_64
    iwl4965-firmware-228.61.2.24-117.el8_8.1.noarch
    leapp-repository-deps-el8-5.0.8-100.202203181036Z.249925a3.master.el8.noarch
    python2-pip-wheel-9.0.3-19.module+el8.6.0+793+57002515.noarch
    kernel-modules-4.18.0-477.27.1.el8_8.x86_64
    leapp-0.14.0-1.el8_6.noarch
    fipscheck-lib-1.5.0-4.el8.x86_64
    python2-setuptools-wheel-39.0.1-13.module+el8.4.0+403+9ae17a31.noarch
    geoipupdate-2.5.0-2.el8.x86_64
    fipscheck-1.5.0-4.el8.x86_64
    kernel-modules-extra-4.18.0-477.27.1.el8_8.x86_64
    libdnet-1.12-26.el8.x86_64
    iwl6000-firmware-9.221.4.1-117.el8_8.1.noarch
    leapp-data-rocky-0.2-2.el8.noarch
    
    • 最小限のインストールによるCentOS Linux 7から移行してきた環境では、上記のRocky Linux 8用のパッケージが存在。
    • 一部のパッケージについては、サーバーの用途によらず、以下の対応を実施。
      • Rocky Linux 9 が提供するカーネルもインストール済みのため、削除。
      $ 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 および関連パッケージであり、インプレースアップグレード後は不要なため削除。
      $ 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
      
  14. アップグレード時に出力されたログファイルを念のために確認。
    $ 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

解決策

アップグレード前の状態を確認したところ、httpdmod_php のパッケージの組み合わせで、Web アプリを動かしていました。Rocky Linux 8 では、この mod_php が非推奨となり、デフォルトで PHP-FPM が呼び出すようになっていました。

そこで、PHP のインストール状況を確認したところ、次のように php-fpm パッケージは未インストールでした。

$ rpm -qa | grep php
php-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-gmp-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-common-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-cli-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-xml-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-json-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-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.22021年5月
7.32021年11月
7.42029年5月Rocky Linux 8 と同じ
8.02024年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 の場合
    $ sudo dnf config-manager --set-enabled crb 
    $ dnf install -y epel-release
    
  • Rocky Linux 9 の場合
    $ 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 というツールが存在したなと思い出していただければ幸いです。


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。