BigAdmin System Administration Portal
特集記事
Print-friendly VersionPrint-friendly Version

Solaris 10 OS におけるゾーンの「接続時に更新」機能とパッチ適用

Enda O'Connor, 2009 年 6 月

はじめに

Solaris 10 5/08 オペレーティングシステム以降、システム管理者は、ゾーンの切り離しと接続ができるようになりました。すなわち、1 つのシステムからゾーンを切り離し、別のシステムに接続することです。初期の機能には、非大域ゾーンが接続されている転送元と転送先の両システムが、同じソフトウェアレベルのパッケージバージョン、パッチレベル、およびアーキテクチャーを持っている必要があったため、いくつかの制限がありました。つまり、sun4v システムから sun4u システムへ、あるいは以前の Solaris リリースから最新の Solaris 更新リリースへとゾーンを移動することはできませんでした。

Solaris 10 10/08 リリースでは、zoneadm attach-u 引数を指定する「接続時に更新」コマンドによって新機能が提供されました。

この記事では、「接続時に更新」について記述し、次のトピックをカバーします。

どのパッケージが更新されるかを決定する基準

「接続時に更新」を使用すると、接続されたゾーンは次の規則に従って大域ゾーンと同じソフトウェアレベルに更新されます。どのパッケージが更新されるかは、これらの規則によって決定されます。

  1. 非大域ゾーンのパッケージに SUNW_PKG_ALLZONES=true の設定がある場合、パッケージは更新するように選択されます。
  2. パッケージが継承されたパッケージディレクトリにビットを配信する場合、パッケージは更新するように選択されます。 (「継承されたパッケージディレクトリ」とは、大域ゾーンから非大域ゾーンに継承されたディレクトリを指します。疎ゾーンは、デフォルトで /usr/lib/platform、および /sbin を継承します。zonecfg コマンドの add inherit-pkg-dir サブコマンドで追加されたディレクトリは、いずれも継承されたパッケージディレクトリとなります)。
  3. 上記 1 または 2 のいずれかに依存するパッケージは、SUNW_PKG_ALLZONES の設定や継承されたパッケージディレクトリにビットを配信するかどうかにかかわらず、すべて更新されます。

一度パッケージを更新するように選択すると、ゾーンを最初にインストールしたときにパッケージをインストールしたのと同じ処理が、次の処理を実行するために行われます。

  • 更新されている非大域ゾーンからパッケージを削除する
  • 接続を実行している大域ゾーンから接続されている非大域ゾーンへと、スプールされたパッケージをインストールする

たとえば SUNWcsr を更新する場合、大域ゾーンの /var/sadm/pkg/SUNWcsr/save/pspool/SUNWcsr/ ディレクトリが、接続されている非大域ゾーンの更新された SUNWcsr パッケージをプロビジョニングするために使用されます。このディレクトリは、zoneadm install の最初に、新しい非大域ゾーンの SUNWcsr パッケージをプロビジョニングするために使用されるものです。

そのため、上記の 3 番の項目の例として、パッケージ A に SUNW_PKG_ALLZONES=true があるとき、パッケージは更新するように選択されます。パッケージ A はパッケージ B に依存します。パッケージ B には SUNW_PKG_ALLZONES=true がなく、/etc ディレクトリに配信されるため、上記 1、2 のどちらの条件も満たしません。しかし、パッケージ A はパッケージ B に依存するので、パッケージ B も更新するように選択されます。

非大域ゾーンが使用する継承されたパッケージディレクトリを考慮する場合、選択基準は重要です。完全ルートの非大域ゾーンの場合には、継承されたパッケージディレクトリはありません。したがって、同じソフトウェアレベルで実行されている疎ゾーンに比べて、更新するように選択されるパッケージは少なくなります。

また、SUNW_PKG_THISZONE=true が設定されている大域ゾーンのパッケージはいずれも自動的に除外されることにも考慮が必要です。すなわち、パッケージが非大域ゾーンにある場合、更新されません。

「接続時に更新」と通常のアップグレード

先に進む前に、サポートされているアップグレード機構のうちのいずれかによる標準アップグレードと、「接続時に更新」を使用する方法との違いを理解するとよいでしょう。標準アップグレードを行うと、Solaris のネイティブな非大域ゾーンはすべてアップグレードされます。すなわち、アップグレードの過程で配信されるすべての新しいパッケージと機能が受信され、古いパッケージは削除されます。また、非大域ゾーンと大域ゾーンは、更新リリースで配信されるパッチとパッケージのバージョンが同じソフトウェアレベルになります。

言いかえれば、更新イメージは大域ゾーンおよびすべての非大域ゾーンに適用されます。アップグレードの間、大域ゾーンと非大域ゾーンに関する依存性チェックは行われません。また、イメージの一部であるパッケージはすべて、大域ゾーンを含むすべてのゾーンにわたって配置されます。

これに対して、「接続時に更新」を使用する場合、大域ゾーンおよび更新されている非大域ゾーンの両方のソフトウェアインベントリが取得されます。そのあと、前述した 3 つの基準に従い、zoneadm によって非大域ゾーンの更新パッケージが決定されます。

したがって、システムから非大域ゾーンをすべて切り離し、大域ゾーンで後続の更新リリースに標準アップグレードしてから、非大域ゾーンに対して「接続時に更新」を使用した場合、アップグレード時に接続されていたゾーンに対してシステム全体の標準アップグレードを行なった場合とは異なる結果となります。次の項目が 1 つも該当しない場合、更新で配信された新しいパッケージはどれも、接続された非大域ゾーンに伝播されません。

  • パッケージが SUNW_PKG_ALLZONES=true の条件を満たしている。
  • パッケージが継承されたパッケージディレクトリにビットを配信する。
  • ALLZONES=true が設定されたパッケージ、継承されたパッケージディレクトリに配信されたパッケージ、またはその両方の条件を満たすパッケージが、新しいパッケージに依存する。

ALLZONES=true が設定されているか、継承されたパッケージディレクトリに配信されたパッケージでないかぎり、古いパッケージはどれも削除されません。

「接続時に更新」の主な使用目的は、ユーザーによる対話的処理を最小限に抑えながら、あるシステムから別のシステムに非大域ゾーンを移行できるようにすることです。Solaris 10 10/08 リリースより前は、接続されている非大域ゾーンのシステムソフトウェアが、接続されている非大域ゾーンが存在するシステムと正確に同じソフトウェアレベルにあるようにしなければなりませんでした。ゾーンの「接続時に更新」を使用すると、システム管理者は低いパッチレベルのゾーンを接続することができるようになり、ゾーンは自動的に接続先の大域ゾーンと同じパッチレベルに更新されます。また、sun4v システムから sun4u システムへ、あるいは sun4u システムから sun4v システムへと非大域ゾーンを移行できるようにもなりました。

「接続時に更新」の主な使用目的の 1 つは、異なるシステム間で Solaris Containers を迅速かつ容易に移行できるようにすることです。(コンテナとは、非大域ゾーンとリソース制御を組み合わせたもののことです)。使用例を挙げます。Sun Fire T2000 サーバーで、それぞれ特定のデータベースを持つ 5 つのコンテナが実行されており、時間がたつにつれてそのうちの 1 つのデータベースが想定以上に増大した場合、システムリソースが使い果たされてパフォーマンスの問題が発生することがあります。影響を受けたコンテナをより高性能なシステムへと移行することができないと、エンドユーザーはコンテナ、コンテナ内のソフトウェア、およびソフトウェア構成を別のシステムに複製し、最終的には古いコンテナから新しいコンテナへのスイッチを作成しなければならない場合があります。しかし、ゾーン移行により、この作業がはるかに容易になります。影響を受けたコンテナを、データベース、構成、および関連する作業負荷ごと新しいシステムに移動できるようになり、これによってこのコンテナと古いシステム上の残り 4 台のコンテナが使用できるリソースが増えるためです。

パッチ適用とゾーンの「接続時に更新」

非大域ゾーンを大域ゾーンと同じパッチレベルにすることができる「接続時に更新」は、多くの関心を集めました。一例を挙げます。システム管理者は、パッチバンドルを適用する前にすべての非大域ゾーンを切り離し、そのあとで大域ゾーンにパッチバンドルを適用できます。そしてバンドルを適用してシステムを再起動したあと、ゾーンの zoneadm -z <zonename> attach -u コマンドで非大域ゾーンを大域ゾーンと同じパッチレベルに戻すことができます。

これを実行する主な理由は、「接続時に更新」を使う方が、連続してゾーンにパッチを適用するよりもはるかに高速であるためです。複数の zoneadm attach コマンドを実行させることもできます。主な問題点は、大域ゾーンで適用されたパッチや、非大域ゾーンの継承されたパッケージディレクトリの構成によっては、「接続時に更新」を使用した場合、接続されているすべての非大域ゾーンに patchadd を使用して大域ゾーンと非大域ゾーンにパッチを適用した場合とは異なる結果になる可能性があることです。

このようなことが起こる理由を説明するために、少し不自然な例を挙げます。非大域ゾーンのうちの 1 つが完全ルートゾーンで、適用されているパッチのうちの 1 つが Mozilla Firefox にパッチを適用するパッチ 125539-05 だった場合、大域ゾーンには 125539-05 が適用されますが、ゾーンの「接続時に更新」では非大域ゾーンの SUNWfirefox は更新されません。したがって、パッチ 125539-05 は非大域ゾーンに適用されません。

代わりに、接続されたゾーンに patchadd を使用すると、125539-05 は patchadd によって非大域ゾーンに適用されます。これは、ゾーンの移行がゾーンのアップグレードとは異なる計画を含んでいるためです。アプリケーションレベルのソフトウェア (SUNWfirefox など) をアップグレードするかどうかはシステム管理者のみが決定できることです。したがって、ゾーンの「接続時に更新」はそのような決定をシステム管理者に任せて、アプリケーションレベルのソフトウェアの更新は行いません。これに対して従来のアップグレードは、メディア上にあるソフトウェアをすべてアップグレードします。

また、完全ルート非大域ゾーンでは、SUNWupdatemgru がインストールされていないと、パッチユーティリティーパッチが配信するパッケージが更新されません。これは事実上、完全ルート非大域ゾーンに SUNWupdatemgru がインストールされていないと、大域ゾーンに後続のバージョンがインストールされている場合に、ゾーンのパッチユーティリティーパッチ 110254/119255 が大域ゾーンと同期されないことになる可能性を示しています。

これは、119254/119255 がパッチを適用する SUNWswmtSUNWinstall-patch-utils-root、および SUNWpkgcmdsu の各パッケージが、いずれも SUNW_PKG_ALLZONES=false の条件を満たしているためです。また、完全ルートゾーンには継承されたパッケージディレクトリがないため、これらのパッケージは更新パッケージとして選択されません。ただし、SUNWupdatemgru がインストールされている場合を除きます。これは、SUNWupdatemgruSUNW_PKG_ALLZONES=true の条件を満たし、また SUNWswmt に依存するパッケージであり、さらにその SUNWswmtSUNWinstall-patch-utils-rootSUNWpkgcmds に依存するパッケージであるためです。

したがって、SUNWswmtSUNWinstall-patch-utils-root、および SUNWpkgcmds はすべて選択されます。SUNWupdatemgruSUNWswmt に依存し、その SUNWswmtSUNWinstall-patch-utils-rootSUNWpkgcmds に依存するためです。

通常、SUNWupdatemgruSUNWzonerSUNWzoneu と同じインストールメタクラスタにあるため、いずれの非大域ゾーンにもインストールされます。しかし、システムが最小限のメタクラスタのインストールによりプロビジョニングされてからゾーンのパッケージが追加された場合、SUNWupdatemgru がインストールされていないため、完全ルート非大域ゾーンにあるパッチユーティリティーパッケージはいずれも「接続時に更新」では更新されません。

更新されるパッケージはすべて、最初に非大域ゾーンから削除されます。次に、ゾーンを最初にインストールするために使用されたのと同じ機能を使用して、それらのパッケージは大域ゾーンから再インストールされます。(この機能は、CR 6818813 により後続の更新リリースで変更される予定です。CR 6818813 が修正されたあとは、更新パッケージとして選択されたパッケージのうち、大域ゾーンにインストールされているパッケージとバージョンが一致するものはいずれも削除されず、非大域ゾーンのパッケージが単に置き換わるようになります。これにより、「接続時に更新」のパフォーマンスの高速化も見込まれます)。

したがって、ゾーンを最初にインストールするために使用されたのと同じ機能が、「接続時に更新」でも使用されます。更新されるパッケージの場合には、パッケージのすべてのパッチパッケージ undo.Z パッケージが、大域ゾーンから接続されている非大域ゾーンへ継承されます。大域ゾーンに大規模なパッチ適用が行われている場合、接続されている非大域ゾーンがほとんどまたはまったくパッチ適用されていないシステムから切り離されていると、これによって非大域ゾーンの占有容量が著しく増加することがあります。

エンドユーザーが単純に patchadd を使用して大域ゾーンと非大域ゾーンにパッチを適用すると、接続されているそれぞれの非大域ゾーン内に undo.Z が生成されます。これには、その非大域ゾーン内で実際に置き換えられたファイルのみが含まれています。疎ゾーンの場合は、patchadd によって作成された undo.Z には、/lib/platform/bin、または /sbin に存在するいずれのファイルも含まれないことになります。したがって、ゾーンの「接続時に更新」機能によって大域ゾーンから継承された undo.Z よりもサイズは小さくなります。

完全ルートゾーンと疎ルートゾーン

完全ルートゾーンではなく、疎ルートゾーン (両方のゾーンは同じシステムで同時にプロビジョニングされているため、同じパッケージおよびパッチレベルにある) に「接続時に更新」を使用すると、更新される両方のゾーンで、異なる数のパッケージが更新されることになります。したがって、Solaris 10 5/08 OS 上で作成され、Solaris 10 10/08 のレベルに更新された疎ルートゾーンでは、505 個のパッケージが更新パッケージとして選択されます。一方、完全ルートゾーンでは、311 個のパッケージが更新パッケージとして選択されます。

そのため、パッチ適用の速度向上のためにゾーンの「接続時に更新」の使用を検討する前に、「接続時に更新」を使用して非大域ゾーンを大域ゾーンと同じパッチレベルにする方法と、接続されていてパッチが適用できるすべての非大域ゾーンに単純に patchadd を使用する方法との違いを認識する必要があります。

IDR (Interim Diagnostic Relief) パッチと特別パッチの存在

Sun によって提供される IDR パッチが接続されているゾーンにインストールされている場合、非大域ゾーンを切り離す前に、まったく同じ IDR が転送先の大域ゾーンに適用されているか、IDR が転送元の非大域ゾーンから削除されていなければなりません。(Solaris 10 5/09 OS では、zoneadm attach コマンドに提供されている -b 引数により、ゾーンの接続中に IDR を削除することで、この問題に対応しています)。

また、Solaris 10 更新イメージの構築にのみ使用され、これまでにリリースされていない「特別パッチ」と呼ばれるパッチの存在も解決しなければなりません。特別パッチについては、現在リリースされているパッチ 140197 の CR 6743776 によって対応されています。これらの特別パッチの処理に関する永続的な解決法は、Solaris 10 5/09 OS のパッチ 139555-08 で配信される CR 6791625 によって対応されています。

「接続時に更新」を実行するための手順

1. 転送元のシステムで、zoneadm -z <zonename> detach を実行します。(注: 切り離し機能は Solaris 10 5/08 OS で導入されました)。

2. 転送先のシステムにゾーンパスを移動します。

3. 転送先大域ゾーンのカーネルパッチレベルが 139555 (Solaris 5/09 以降の更新レベル) でない場合、次のコマンドを実行して、転送元非大域ゾーンのパッケージを強制的に再生成します。関連する CR は 6685069 です。

#rm <zonepath>/SUNWdetached.xml

4. 対象システムで zonecfg を使用して、ゾーンを再構成します。

5. 最後に、次のコマンドを実行します。

#zoneadm -z <zonename> attach -u

ゾーン移行に必要な手順の詳細な説明については、非大域ゾーンを移行する方法 を参照してください。

Solaris 10 5/09 ではエラー報告機能も改善されています。ダウングレードされると見なされるパッケージ (つまり、接続されている非大域ゾーンのパッケージバージョンが、接続されていた転送元の大域ゾーンのパッケージバージョンよりも高い場合) について、前のリリースではすべてのインスタンスが 1 つずつ報告されていました。言いかえれば、zoneadm attach -u を実行すると、一度に 1 つのエラーしか報告されませんでした。Solaris 10 5/09 OS では、最初に zoneadm attach -u を実行すれば、一度にすべてのエラーが報告されます。

詳細情報

次に、追加のリソースをいくつか挙げます。


Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin