RHEL 8からRHEL 9へのインプレースアップグレード(後編)

Red Hat Enterprise Linux (以下RHEL)のインプレースアップグレードの後編です。

前編ではアップグレード前の準備について説明しましたが、後編では実際のアップグレード手順と、アップグレード後の処理について解説します。

インプレースアップグレード実行

前編でアップグレード前の確認が終わりましたので、いよいよアップグレードを実行します。

動作環境に依存しますが、アップグレードにはそれなりに時間が掛かります。*1

SSH経由でリモートから作業している場合、作業途中でネットワークが切断されても処理が継続されるように、tmuxなどのマルチプレクサを使用して作業することをお勧めします。

用意ができたらインプレースアップグレードを実行します。

# leapp upgrade

アップグレードが正常に終了すると以下のメッセージが表示されますので、エラーが発生していないことを確認します。

============================================================
                      REPORT OVERVIEW                               
============================================================

HIGH and MEDIUM severity reports:
    1. Leapp detected loaded kernel drivers which are no longer maintained in RHEL 9. 
    2. PostgreSQL (postgresql-server) has been detected on your system

Reports summary:
    Errors:                      0       
    Inhibitors:                  0       
    HIGH severity reports:       1       
    MEDIUM severity reports:     1
    LOW severity reports:        3       
    INFO severity reports:       4       

Before continuing, review the full report below for details about discovered problems and possible remediation instructions:
    A report has been generated at /var/log/leapp/leapp-report.txt
    A report has been generated at /var/log/leapp/leapp-report.json

============================================================
                   END OF REPORT OVERVIEW                           
============================================================

OS再起動と確認

インプレースアップグレード処理が正常終了したら、OSを再起動します。

# systemctl reboot

再起動中にもアップグレード処理が実行されるので静かに見守ります。

正常に処理が終了すると自動的にOSが再起動されます。再起動後OSが起動したらログインして以下の確認を行います。

OSバージョンの確認

想定通りのバージョンになっていることを確認します。

# cat /etc/redhat-release 
Red Hat Enterprise Linux release 9.6 (Plow)

Kernelバージョンの確認

Kernelが最新バージョンになっていることを確認します。

# uname -r
5.14.0-570.22.1.el9_6.x86_64

Subscription Managerのステータス確認

Subscription Managerのステータスを確認します。

# subscription-manager status
+-------------------------------------------+
   システムのステータス詳細
+-------------------------------------------+
全体的な状態: 無効
コンテンツアクセスモードは、シンプルコンテンツアクセスに設定されています。このホストは、サブスクリプションのステータスに関係なく、コンテンツにアクセスできます。

システムの目的の状態: 無効

# subscription-manager list --installed
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux for x86_64
製品 ID:          479
バージョン:       9.6
アーキテクチャー: x86_64
状態:             サブスクライブなし
状態の詳細:       
開始:             
終了: 

インプレースアップグレードの処理中にSubscription Managerの登録が無効となるため、再登録を行う必要があります。

# subscription-manager unregister 
# subscription-manager register 
# subscription-manager list --installed
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux for x86_64
製品 ID:          479
バージョン:       9.6
アーキテクチャー: x86_64

再登録後、正常にSubscription Managerに登録されたことを確認します。

インプレースアップグレード後の処理

レポジトリの設定変更

アップグレードに使用したleappツールは必要ないため、dnfの除外リストからleapp関連の設定を削除します。

# dnf config-manager --save --setopt exclude=''
サブスクリプション管理リポジトリーを更新しています。

これにより/etc/dnf/dnf.confのexcludeパラメータから、leapp関連のパッケージの除外設定が削除されます。

RHEL8のパッケージ確認

インストールされているパッケージに、RHEL 8のパッケージが残っているかどうか確認します。

# rpm -qa | grep -e '\.el8' | grep -vE '^(gpg-pubkey|libmodulemd|katello-ca-consumer)'
kernel-4.18.0-553.54.1.el8_10.x86_64
kernel-4.18.0-553.56.1.el8_10.x86_64
kernel-core-4.18.0-553.54.1.el8_10.x86_64
kernel-core-4.18.0-553.56.1.el8_10.x86_64
kernel-modules-4.18.0-553.54.1.el8_10.x86_64
kernel-modules-4.18.0-553.56.1.el8_10.x86_64
leapp-0.19.0-1.el8_10.noarch
leapp-upgrade-el8toel9-0.22.0-1.el8_10.noarch
libatomic_ops-7.6.2-3.el8.x86_64
libmodman-2.0.1-17.el8.x86_64
python3-leapp-0.19.0-1.el8_10.noarch
rubygem-anemone-0.7.2-23.el8sat.noarch
rubygem-parse-cron-0.1.4-5.el8sat.noarch
rubygem-robotex-1.0.0-22.el8sat.noarch
rubygem-webpack-rails-0.9.11-1.el8sat.noarch
(以下略)

RHEL 8のパッケージを削除

RHEL 8のパッケージが残っていればアンインストールします。

以下のコマンドを実行するとパッケージ名に".el8"という文字列が含まれるRPMパッケージを削除します。

※ サードパーティーのRPMパッケージで".el8"という文字列が含まれている場合そのパッケージも削除しますが、削除してはいけないサードパーティーのパッケージがある場合は削除対象のパッケージを個別に確認してから削除するか、"grep -vE"コマンドに該当のパッケージ名を追加して削除対象から除外するようにしてください。

# dnf remove $(rpm -qa | grep \.el8 | grep -vE 'gpg-pubkey|libmodulemd|katello-ca-consumer')
サブスクリプション管理リポジトリーを更新しています。
依存関係が解決しました。
============================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
============================================================================================================================
 削除中: kernel x86_64 4.18.0-553.54.1.el8_10  @rhel-8-for-x86_64-baseos-rpms 0 
 kernel x86_64 4.18.0-553.56.1.el8_10 @rhel-8-for-x86_64-baseos-rpms 0 
 kernel-core x86_64 4.18.0-553.54.1.el8_10 @rhel-8-for-x86_64-baseos-rpms 71 M 
 kernel-core x86_64 4.18.0-553.56.1.el8_10 @rhel-8-for-x86_64-baseos-rpms 71 M 
 kernel-modules x86_64 4.18.0-553.54.1.el8_10 @rhel-8-for-x86_64-baseos-rpms 25 M 
 kernel-modules x86_64 4.18.0-553.56.1.el8_10 @rhel-8-for-x86_64-baseos-rpms 25 M 
 leapp noarch 0.19.0-1.el8_10 @rhel-8-for-x86_64-appstream-rpms 62 k
(以下略)

Leappの依存関係パッケージの削除

不要となったLeappの依存関係パッケージを削除します。

# dnf remove leapp-deps-el9 leapp-repository-deps-el9

アップグレード関連のデータの削除

アップグレード処理のログなどを削除します。

※ 別のサーバーでインプレースアップグレードを行う場合に参考になる情報があるので、/var/log/leappは残すか別の場所に保存しておくことをお勧めします。

# rm -rf /var/log/leapp /root/tmp_leapp_py3 /var/lib/leapp

既存のレスキューカーネルと初期 RAM ディスクの再インストール

既存のレスキューカーネルを削除します。

# rm /boot/vmlinuz-*rescue* /boot/initramfs-*rescue*

レスキューカーネルを再インストールします。

# /usr/lib/kernel/install.d/51-dracut-rescue.install add "$(uname -r)" /boot "/boot/vmlinuz-$(uname -r)"

レスキューブートエントリ確認

以下のコマンドを実行して、再インストールしたレスキューファイルを参照していることを確認します。

# grubby --info /boot/vmlinuz-*rescue*
index=1
kernel="/boot/vmlinuz-0-rescue-1e38d48d08e9457284858e68eab1cbd8"
args="ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet audit=1 audit_backlog_limit=8192 crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M $tuned_params net.naming-scheme=rhel-8.0"
root="/dev/mapper/rhel-root"
initrd="/boot/initramfs-0-rescue-1e38d48d08e9457284858e68eab1cbd8.img $tuned_initrd"
title="Red Hat Enterprise Linux (0-rescue-1e38d48d08e9457284858e68eab1cbd8) 9.6 (Plow)"
id="1e38d48d08e9457284858e68eab1cbd8-0-rescue"

次のコマンドを実行して、RHEL8のエントリが設定されていないことを確認します。

# grubby --info ALL 
index=0
kernel="/boot/vmlinuz-5.14.0-570.22.1.el9_6.x86_64"
args="ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet audit=1 audit_backlog_limit=8192 crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M $tuned_params net.naming-scheme=rhel-8.0"
root="/dev/mapper/rhel-root"
initrd="/boot/initramfs-5.14.0-570.22.1.el9_6.x86_64.img $tuned_initrd"
title="Red Hat Enterprise Linux (5.14.0-570.22.1.el9_6.x86_64) 9.6 (Plow)"
id="1e38d48d08e9457284858e68eab1cbd8-5.14.0-570.22.1.el9_6.x86_64"
index=1
kernel="/boot/vmlinuz-0-rescue-1e38d48d08e9457284858e68eab1cbd8"
args="ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet audit=1 audit_backlog_limit=8192 crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M $tuned_params net.naming-scheme=rhel-8.0"
root="/dev/mapper/rhel-root"
initrd="/boot/initramfs-0-rescue-1e38d48d08e9457284858e68eab1cbd8.img $tuned_initrd"
title="Red Hat Enterprise Linux (0-rescue-1e38d48d08e9457284858e68eab1cbd8) 9.6 (Plow)"
id="1e38d48d08e9457284858e68eab1cbd8-0-rescue"

SELinuxを元のモードに戻す

SELinuxをEnforcingモードに設定していた場合、インプレースアップグレード時にSELinuxはPermissiveモードに変更されているので、Enforcingモードに再設定します。

# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

OSを再起動してEnforcingモードに設定されたことを確認します。

# systemctl reboot再起動後ログイン
# getenforce
Enforcing

システムの暗号化ポリシ確認

インプレースアップグレードしたサーバーの暗号化ポリシーは、RHEL8の設定を継承しています。この設定の確認を確認するには、以下のコマンドを実行します。

# update-crypto-policies --show
DEFAULT

暗号化ポリシをFURETUREに変更する場合は以下のコマンドを実行します。

# update-crypto-policies --set FUTURE

暗号化ポリシについての詳細は以下を参照してください。

第3章 システム全体の暗号化ポリシーの使用 | セキュリティーの強化 | Red Hat Enterprise Linux | 9 | Red Hat Documentation

一時的に変更した設定を元に戻す

前編で説明したアップグレード前のチェック時に一時的に無効にした設定を、元の設定に戻します。

マウントオプション

/etc/fstabを編集して/varの設定に"noexec"オプションを追加してください。

/dev/mapper/rhel-var  /var  xfs  defaults,nodev,noexec,nosuid 0 0

その後/varをマウントし直してください。

# mount -o remount /var
NFSマウント設定

/etc/fstabのコメントアウトした設定を元に戻して、再度NFSマウントしてください。

# mount /mnt/nfs

この他にも一時的に無効にした設定があれば、元の設定に戻してください。

以上でRHEL8からRHEL9へのインプレースアップグレードは終了です。

アプリケーションのアップグレード

OSのインプレースアップグレードが完了したら、次にサーバー上で稼働しているアプリケーションのアップグレードを実施します。

RHEL9に対応していないアプリケーションの場合、アプリケーションが起動しない、起動していても正常に動作しない状態、もしくは正常に動作していてもサポートされない状態になっている可能性があります。そのアプリケーションのアップグレードは各アプリケーションのドキュメントやサポートに従って実施してください。

すべてのアプリケーションが正常に稼働する状態になれば、一連のアップグレード作業は終了です。

おわりに

前編・後編を通して、RHEL 8からRHEL 9へのインプレースアップグレードの手順を説明しました。

手順は多岐にわたりますが、Red Hatが提供する公式ドキュメントに従って進めれば、OSは問題なくRHEL9にインプレースアップグレードできると思います。

特に重要なのは、事前にアプリケーションの動作要件を確認することだと思います。アプリケーションによっては、RHELの最新バージョンをサポートしていないというケースもあるため、その場合はそのアプリケーションがサポートされるまでアップグレードの実施を見送る判断も必要になるかもしれません。

OSをアップグレードしないことで発生するリスクと、アプリケーションが動作しないことのリスクを踏まえて方針を決定する必要があると思います。

*1:参考までに私がアップグレードを実施した環境はかなり古いサーバーなのですが、アップグレード処理が完了するまで30分ほど掛かりました

執筆担当者プロフィール
佐久間 賢

佐久間 賢(日本ビジネスシステムズ株式会社)

普段は主にRed Hat Enterprise Linuxをメインにデリバリしています

担当記事一覧