14.2. パッケージおよびイメージモードでのソフトリブート動作
イメージモードで実行されているシステムは、ユーザー空間のみを再起動するパッケージモードシステムと同じ方法でソフトリブートを実行します。違いは、これらのパッケージとサービスの更新を最初にコンテナーイメージ上にビルドする必要があることです。
- パッケージモードでのソフトリブート動作
パッケージベースのシステム (例:
dnfを使用する RHEL システム) では、ソフトリブートプロセスでsystemdユニットをシャットダウンして再起動し、新しいライブラリーとバイナリーをロードします。最小限のダウンタイムで更新を適用できます。RHEL でdnfを使用して更新を適用すると、systemdはソフトリブート中のシステムの動作を管理します。主要なユニットと期待される動作は、以下のとおりです。-
サービスの再起動: ソフトリブートにより、
systemdは実行中のすべてのサービスを停止して再起動します。Web サーバーやデータベースなどのサービス用の更新されたパッケージは、サービスが再起動され、新しいバイナリーがリロードされる際にパッチを適用します。 -
ユニットの依存関係:
systemdは、定義された依存関係と順序に基づいてユニットをシャットダウンおよび起動します。ソフトリブートにより、これらの関係が維持され、不適切なシャットダウンシーケンスが発生する可能性が最小限に抑えられます。 -
プロセスとライブラリー:
glibcやopensslなどの共有ライブラリーが更新されている場合、実行中のプロセスは、再起動されるまで引き続き、以前にマップされたライブラリーを使用します。ソフトリブートにより、すべてのプロセスが停止し、その後再起動して、ライブラリーの新しいバージョンにリンクされるようになります。 - 最小限のダウンタイム: ソフトリブートではカーネルとハードウェアが再初期化されないため、ハードリブートよりも大幅に高速です。これは、サービスの中断を最小限に抑えながら、ほとんどのユーザー空間の更新を適用する場合に効果的です。
-
コマンドラインツール:
dnf-plugins-coreパッケージには、needs-restartingツールが含まれています。dnf updateの実行後、dnf needs-restartingコマンドを実行して、変更を適用するためにソフトリブートまたは特定のサービスの再起動が必要かどうかを確認できます。
-
サービスの再起動: ソフトリブートにより、
ユーザー空間のパッチ適用は、ユーザー向けのアプリケーションと共有ライブラリーのセキュリティー上の脆弱性とバグに対処します。パッチを適用する場合、新しいコードをロードするにはソフトリブートまたはプロセスの再起動が必要です。以下に例を示します。
-
OpenSSL: 使用例: 重大な OpenSSL の脆弱性が発見されました。
Web サーバー、データベース、SSH デーモンなどの OpenSSL を使用するアプリケーションは、再起動しない限り脆弱性にさらされた状態が続き、引き続き脆弱な共有ライブラリーを使用します。
ソフトリブートソリューション: dnf update openssl の実行後にソフトリブートを実行すると、依存プロセスが停止します。その後、Systemd は、これらのサービスを再起動し、新しいパッチ適用済みの libssl.so および libcrypto.so ライブラリーを自動的にロードして、マシン全体を再起動せずにシステムを保護します。
-
Glibc: 使用例:GNU Cライブラリー (glibc) にバグまたはセキュリティー上の不具合が見つかりました。
問題: Glibc は、システム上のほぼすべてのプログラムが依存する基本的なユーザー空間コンポーネントです。glibc の脆弱性はシステム全体に影響を及ぼします。1 つか 2 つのサービスを再起動するだけでは不十分です。他の多くのプロセスは依然として脆弱なままだからです。
ソフトリブートによる解決策: dnf update glibc を実行してからソフトリブートを行うことが、すべてのプロセスが再起動して新しい glibc に再リンクされることを確実にする最も確実な方法です。これにより、システム全体の再起動が原因で長くなるダウンタイムを回避しながら、更新がすべての場所に適用されます。
-
dbus-broker:
使用例: セキュリティーまたはパフォーマンスのために dbus-broker デーモンを更新します。
問題: Dbus-broker は重要なシステムサービスです。通常更新しても影響はありませんが、プロトコルが敏感に反応するため、ブローカーと関連サービスを再起動する必要があります。
ソフトリブートソリューション: ソフトリブートは、dbus-broker とすべての依存サービスおよびアプリケーションを再起動し、systemd により、正常にシャットダウンおよび再初期化されます。
- Image Mode for RHEL でのソフトリブート動作
-
RHEL Image Mode (bootc) では、
systemdは高速なユーザー空間のみの再起動 (ソフトリブート) を実行します。Systemd-soft-reboot.serviceはこのプロセスを統括し、カーネルとハードウェアを動作させたままユーザー空間をリセットします。
イメージベースのシステムでは、次の 2 つの方法で更新を管理できます。
- ステージングされた更新: システムはコンテナーレジストリーからこれらの更新を取得し、別のアクティブではないパーティションまたはファイルシステムにインストールします。再起動が開始されるまで、古いバージョンで実行され続けます。
ソフトリブートを実行すると、システムは新しくステージングされた更新済みのルートファイルシステムに切り替わり、ユーザー空間全体が一度に置き換えられます。システムは新しく更新されたオペレーティングシステムイメージで起動し、問題が発生した場合は、次回の起動時に以前のイメージにロールバックする機能が保持されます。
- ステージングされていない更新: 設定の変更や単一のサービスの再起動など、実行中のユーザー空間に対する動的なインプレース更新。新しい完全なオペレーティングシステムイメージを作成して、そのイメージを起動する必要はありません。ソフトリブートでは、同じルートファイルシステムから現在のユーザー空間がリロードされます。新しい、更新されたオペレーティングシステムイメージをプルしたり、切り替えたりすることはありません。
これを使用すると、カーネルに触れることなく現在のソフトウェアの状態をリセットできます。これは、イメージレベル以外の変更を適用したり、ユーザー空間の問題を解決したりするのに役立ちます。
systemd のソフトリブートのメカニズムは、kexec のリブートとは異なります。kexec およびカーネル切り替え (kernel switching) 機能は、systemd のソフトリブートでは使用できません。ソフトリブートはユーザー空間のみを再起動し、カーネルはそのままの状態にするためです。これにより継続性が確保され、ハードウェアをリセットせずにカーネルを変更することで発生する可能性のある複雑さや不整合を回避できます。新しいカーネルバージョンを含む更新されたオペレーティングシステムイメージでは、従来どおりの完全な再起動が必要です。