Messages in cipher reflected in the looking glass

http://blogs.sun.com/thaniwa/date/20070516 2007年 5月 16日 水曜日

(JA) Diskless Solaris (x86編) その3:パッチを当てる

ということで、第3回。色々やることがあるものです。
インストールのみで終わってしまってはあまり意味がありません。 ということで、今回はパッチを当ててみました。ということでその解説です。

smosservice によるパッチの当て方(by マニュアル)

「わざわざ項目を作っている理由は?」と小一時間問い詰められるのは勘弁ということで。^-^; パッチの当て方もマニュアルに記載されているのでその通りやってみました。

ディスクレスクライアントにパッチを当てるためには smosservice を用います。 手順は2段階です。
まず、パッチを smosservice に登録(スプールに追加)します。 smosservice の patch オプションを利用します。 -a で 適用するパッチ(のディレクトリ)を指定します。
ここでは実験台として in.telnetd のパッチを当てることにします。 このパッチは必ず当てましょう。

# /usr/sadm/bin/smosservice patch -- -a /tmp/120069-03

これだけなんですが、エラー(EXM_RMIERROR)を発生して、 管理をしているサービスが落ちることがあります。 そんな時は下記を実行して、再起動できます。

# svcadm restart wbem

パッチのスプールへの追加が成功すると、 /export/diskless/Patches にパッチが保存されます。

# ls /export/diskless/Patches
120069-03  Archive

Archive はディスクレスクライアントのOSイメージに対して パッチが適用された後のパッチを保存される領域です。
パッチがちゃんとスプールされているかは下記のコマンドで確認します。 (結果は該当部分のみ抽出しています。)

# /usr/sadm/bin/smosservice patch -- -P
Patches In Spool Area
Os Rel  Arch    Patch Id    Synopsis
--------------------------------------------------------------------------------
10      i386    120069-03   SunOS 5.10_x86: in.telnetd patch
86      i386    120069-03   SunOS 5.10_x86: in.telnetd patch

ちゃんと登録されています。SPARC版のパッチは一行なんですが、 x86版のパッチは2行表示になるようです。 (おそらく OS Rel の部分が2行になってしまっているため)

次にパッチを全体に配布します。

# /usr/sadm/bin/smosservice patch -- -m -U

これでパッチの適用は終了です。 パッチが当たったか確認します。

# /usr/sadm/bin/smosservice patch -- -P

Os Rel  Arch    Patch Id    Synopsis
--------------------------------------------------------------------------------
10      i386    120069-03   SunOS 5.10_x86: in.telnetd patch
86      i386    120069-03   SunOS 5.10_x86: in.telnetd patch

はて?
どうもパッチが適用されていない感じです。 調べて見たところ、うまくパッチが当たっていなかったです。

自力で当ててみる(patchadd編)

ということで、私が利用した実験環境ではうまくいきませんでした。 とそのまま放っておいてしまったら in.telnetd バグがそのまま残ってしまいます。 こいつに関してはどうしても当てておきたいっ! ということで頑張ってみます。
通常、Solaris でパッチを当てる場合、patchadd コマンドを利用します。 この patchadd コマンドを見てみると pkgadd と同様に -R オプションが存在することがわかります。 ということで、patchadd -R を用いれば、パッチを当てることができそうです。

# patchadd
Patch or "-M patchdir" must be specified.
Usage:
        patchadd [-G] [-t] [-d] [-u] [-n] [-B backout_dir]
                [-k keystore] [-P passwd] [-x proxy] [target] source
        patchadd -p [target]
        patchadd -Z

        [target] specifies destination system to apply or query patches,
        and can be one of:

                [-C net_install_image] - apply/query patch on mini root
                [-R client_root_path] - apply/query patch on bootable
                                        client root

patchadd の man を調べてみたのですが、pkgadd とは違い独自に作成した admin ファイル(パッケージ情報の管理ファイル)を用いることは出来ないようです。
ディスクレスクライアント環境では /export/Solaris_10 以下に /usr が作成されていますが、 /export/Solaris_10/var, /export/Solaris_10/usr_i386.all/usr というように 通常とはディレクトリ構造が異なります。 そのため、下記のようにシンボリックリンクを作成し、 ディレクトリ構造を通常と同じようにしておきます。

# cd /export/Solaris_10
# ln -s ./usr_i386.all/usr usr

この状態で、

# patchadd -R /export/Solaris_10 120069-03

のようにパッチを当てます。

# patchadd -R /export/Solaris_10 /root/120069-03
Validating patches...

Loading patches installed on the system...

Done!

Loading patches requested to install.

Done!

Checking patches that you specified for installation.

Done!


Approved patches will be installed in this order:

120069-03


Checking installed patches...
Verifying sufficient filesystem capacity (dry run method)...
Installing patch packages...

Patch 120069-03 has been successfully installed.
See /export/Solaris_10/var/sadm/patch/120069-03/log for details

Patch packages installed:
  SUNWtnetd

これでパッチが当たりました。
ディスクレスクライアントでは / (root) と /usr でパッチ管理情報が 異なるディレクトリに保存されています。 そのため、ディスクレスクライアント側で /usr にパッチが当たっているかどうかは確認できません。
サーバで以下のようにすることで確認できます。

# patchadd -p -R /export/Solaris_10 | grep 120069
Patch: 120069-01 Obsoletes: Requires: Incompatibles: Packages: SUNWtnetd
Patch: 120069-03 Obsoletes: Requires: Incompatibles: Packages: SUNWtnetd


ここでは、/usr にパッチを当てましたが、 / (root) にパッチを当てる場合も同様に行います。 ただし、既にディスクレスクライアントが作成済みの場合は、 全てのクライアントに対してパッチを当てる必要があります。

# patchadd -R /export/root/cloneSolaris_10/i86pc/ ( クローン領域(ディスクレス作成の際のベース) )
# patchadd -R /export/root/w1100z ( w1100z用の root領域 )


一応、これでパッチは当てることが出来ましたが、問題となるのが次のケース。

  • パッチが他の複数のパッチに依存していて、 それが / (root) に適用するパッチ、/usr に適用するパッチの 両方を含む場合
  • パッチに / (root) と /usr の両方が含まれている場合

これに対応するためにはもっと徹底したカスタマイズが必要になります。
と多少中途半端に課題を残してしまいましたが、パッチの当て方は以上で終了。

投稿されたコメント:

コメント
コメントは無効になっています。