Print-friendly Version
この記事は、BigAdmin ユーザーの投稿です。 Sun Microsystems では、読みやすくするために若干の編集を行なった箇所もありますが、技術的な正確さについては見直していません。 間違いを見つけた場合や記事にコメントする場合は、投稿者に連絡するか、記事の末尾にある「コメント:」フィールドを使用してください。 コミュニティーの投稿は、Sun の商標ガイドラインに従っていない場合があります。 Sun の商標については、http://www.sun.com/suntrademarks/ を参照してください。
Derek Olsen、2008 年 1 月
はじめに
この技術ヒントでは pkgman について説明します。これは、SPARC または x86 プラットフォーム用 Solaris 8、9、または 10 OS を実行するホストで、パッケージを目的の状態に維持するためのパッケージ管理ユーティリティーです。この技術ヒントでは、GTK+ のインストールを例にして、pkgman を使用する方法を説明します。GTK+ はグラフィカルユーザーインタフェースを作成するためのマルチプラットフォームのツールキットで、Sunfreeware.com からダウンロードできます。
注 : このドキュメントの例では Solaris 10 OS を使用しています。
目次
この記事では、次のトピックについて説明します。
背景
Solaris ホストにパッケージを追加したり、Solaris ホストからパッケージを削除することはよくある簡単な作業です。ただし、独自のパッケージ要件を持つさまざまなバージョンの Solaris OS を実行するホストを多数管理している場合は、これらの作業が煩雑になる可能性があります。
ホストをジャンプスタートしたあと、追加ソフトウェアパッケージのインストール要求があった場合はどうなるでしょうか。そのソフトウェアをすでにどこかで使用しているかどうかを確認するための、信頼できる情報源がありますか。それとも、要求に対する解決策は対応する人物しだいですか。同じバージョンのパッケージインスタンスがインストールされることをどのように確認して、ホストの構成の変化を制限しますか。開発、テスト、および運用を通して、たとえば PostgreSQL の順次アップグレードが必要な場合はどうでしょうか。実施するための手順が文書化されていますか。そこで、私は pkgman を作成することに時間を費やしました。
Solaris 管理者としての経験から、私はこれらの質問に対する最適な解決策を見つけようと苦心しています。また、同じような苦労をしている人たちにも出会っています。私がパッケージを管理するために使用していた今までの手法には、ソリューションが複雑になるという問題がありました。このため、新しいパッケージのロールアウト、パッケージのアップグレード、またはパッケージのリコールを簡単に行えるのは自分だけになってしまいました。ときには休暇を取ったり病欠の電話をできるようにしたいですから、もう一度ソリューションを考え直すことにしました。
このドキュメントの目標は、pkgman をインストールおよび構成してパッケージを管理する方法を説明することです。Sunfreeware.com から GTK+ (2.12.0) パッケージをインストールすることが、ここで取り上げる例の中心となります。GTK+ パッケージのインストールは、pkgman を使用する価値があるかどうかを判断するためのよい例です。
pkgman の要件
どんな場合でも運用範囲を制限する要因が存在するため、まずは pkgman の要件から説明します。
pkgman の実行には Ruby version 1.8.X が必要です。(2008 年 1 月には Ruby 1.9.X に対するテストを計画しています。)
インストールする Solaris パッケージは、データストリーム形式である必要があります。
インストールするパッケージは、HTTP を通じてローカルで利用できる必要があります。
pkgman のインストール
要件を満たしている場合は、pkgman のインストールに移ります。
http://code.google.com/p/pkgman/downloads/list のダウンロードリストから、「latest stable version」の説明が付いた tarball をダウンロードします。tarball の名前は pkgman-<release number>.tar.gz となります。
tarball を展開します。最終的に pkgman-<release number> という名前のディレクトリが作成されます。
または、サブバージョンを使用して pkgman リポジトリをチェックアウトします。次のコマンドは pkgman のサブバージョンリポジトリを、pkgman というディレクトリにチェックアウトします。
svn checkout http://pkgman.googlecode.com/svn/trunk/ pkgman
ディレクトリを pkgman ディレクトリのルートに移動します。
setup スクリプトは、pkgman を配備するときに /usr/local を接頭辞として使用します。したがって、実行可能ファイルは /usr/local/bin に、構成ファイルは /usr/local/etc にそれぞれ格納されます。setup スクリプトは、ホストの Ruby のパスに合わせて shebang 行も変更します。
ruby setup.rb
---> bin
<--- bin
---> conf
<--- conf
---> bin
<--- bin
---> conf
<--- conf
rm -f InstalledFiles
---> bin
mkdir -p /usr/local/bin/
install pkgman.rb /usr/local/bin/
<--- bin
---> conf
mkdir -p /usr/local/etc/
install pkgman.yaml /usr/local/etc/
<--- conf
pkgman を別のディレクトリにインストールする場合は、次のような作業を行います。ここでは、ディレクトリの接頭辞を /usr/local から自分のホームディレクトリに変更しています。
ruby setup.rb all --prefix=$HOME
---> bin
<--- bin
---> conf
<--- conf
---> bin
<--- bin
---> conf
<--- conf
rm -f InstalledFiles
---> bin
mkdir -p /users/deet/bin/
install pkgman.rb /users/deet/bin/
<--- bin
---> conf
mkdir -p /users/deet/etc/
install pkgman.yaml /users/deet/etc/
<--- conf
GTK+ パッケージのインストール
pkgman は /usr/local/bin/pkgman.rb (または指定した場所) で利用できるようになりました。これで、パッケージをインストールするという重要な作業に集中できます。
パッケージのダウンロードに最適な sunfreeware.com のミラーを決定します。利用可能なミラーのリスト を確認してください。
帯域幅のコストを考慮して、パッケージをローカルサイトにダウンロードし、HTTP を通してローカルで利用できるようにしてください。執筆時 (2007 年 12 月) 現在、GTK+ を実行するためにダウンロードが必要なソフトウェアのパッケージとバージョンは次のとおりです。
atk-1.18.0
cairo-1.4.10
expat-1.95.5
fontconfig-2.4.2
freetype-2.3.1
glib-2.14.1
gtk+-2.12.0
jpeg-6b
libiconv-1.11
libpng-1.2.23
pango-1.18.2
render-0.8
renderproto-0.9.3
tiff-3.8.2
xrender-0.8.3
zlib-1.2.3
これらのパッケージでは、libgcc 共有オブジェクトが必要です。この例では、libgcc ソフトウェアはインストール済みであると想定しています。
libgcc をインストールする必要がある場合は、config ファイルの設定を確認したあと、libgcc パッケージレコードに追加できます。
必要なパッケージをダウンロードしたあと、これらを HTTP を通じて利用できるようにする必要があります。また、現在 pkgman は圧縮されたパッケージをサポートしないため、ダウンロードしたパッケージは圧縮解除する必要があります。圧縮ファイルの処理を追跡する拡張要求が存在します。
gzip で処理されたパッケージを圧縮解除するには、圧縮されたパッケージを保存したディレクトリで次のコマンドを実行します。
for f in `ls *gz`; do gunzip $f; done
pkgman.yaml 構成ファイルの作成
続いて、pkgman.yaml 構成ファイルを作成します。
見やすくなるように、この節ではインストールされる pkgman.yaml ファイルからコメントを取り除きます。構成ファイルには、インストールするパッケージや削除するパッケージに関する情報、およびスクリプトの設定が含まれます。スクリプトの設定は、パッケージの場所や動作の記録方法などの項目で構成されます。
pkgman.yaml ファイルのスクリプト設定セクションの例を示します。
---
-
:http_host: jumpstart
:http_port: 1080
:http_uri: /jumpstart/pkgs/sfw
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice
ほとんどの環境では、変更が必要となるのは http_host、http_port、および http_uri キーだけです。
たとえば、自サイトのパッケージリポジトリを表示するための URL が http://10.30.1.22/solaris/support/extras である場合、pkgman.yaml の設定セクションは次のようになります。
---
-
:http_host: 10.30.1.22
:http_port: 80
:http_uri: /solaris/support/extras
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice
ここでは、pkgman.yaml ファイルについて詳しく説明しません。詳細な情報は、README ファイルの「CONFIG FILE」の節を参照してください。README ファイルは、http://pkgman.googlecode.com/svn/trunk/README で入手できます。
設定セクションの作業が完了したので、インストールする各パッケージのレコードを作成する必要があります。インストールレコードを作成するために必要な情報は、パッケージ名、パッケージのバージョン、ファイル名、およびレコードを適用するホストです。
まず、atk ソフトウェアパッケージから始めます。パッケージ名は pkginfo コマンドで確認できます。ここでは、パッケージ名とパッケージのバージョンを確認するために、パッケージファイル atk-1.18.0-sol10-sparc-local を照会しています。
[root@jumpstart /jumpstart/pkgs/sfw]$ pkginfo -l -d \
atk-1.18.0-sol10-sparc-local |egrep '(PKGINST|VERSION)'
PKGINST: SMCatk
VERSION: 1.18.0
パッケージのバージョンは、pkgparam コマンドで次のようにして取得することもできます。
[root@jumpstart /jumpstart/pkgs/sfw]$ pkgparam -f \
atk-1.18.0-sol10-sparc-local
VERSION
1.18.0
パッケージ名は SMCatk、パッケージのバージョンは 1.18.0、ファイル名は atk-1.18.0-sol10-sparc-loca であることがわかりました。この情報を pkgman.yaml ファイルのパッケージレコードに入力します。
SMCatk パッケージのインストールレコードは、次のようになります。
-
:action: install
:name: SMCatk
:file: atk-1.18.0-sol10-sparc-local
:version: 1.18.0
:hosts: default
hosts キーに default という値を使用しています。hosts キーでサポートされている値は、README ファイル に詳しく説明されています。
設定セクションとパッケージレコードを結び付けるために、現在の pkgman.yaml ファイルの状態を確認しましょう。次の pkgman.yaml ファイルは、ソフトウェアパッケージ SMCatk Version 1.18.0 が、pkgman を実行するすべてのホストにインストールされることをわかりやすい英語で示しています。パッケージファイル名は atk-1.18.0-sol10-sparc-local で、http://jumpstart:1080/jumpstart/pkgs/sfw/atk-1.18.0-sol10-sparc-local からダウンロードできます。
また、すべての出力は daemon.notice の優先順位を使用して syslog に記録されます。ロギングが「syslog」に構成されている場合、ログは syslog のみに送信され、端末には何も送信されません。
---
-
:http_host: jumpstart
:http_port: 1080
:http_uri: /jumpstart/pkgs/sfw
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice
-
:action: install
:name: SMCatk
:file: atk-1.18.0-sol10-sparc-local
:version: 1.18.0
:hosts: default
続いて、pkgman.yaml ファイルに残りのパッケージを追加する必要があります。
パッケージを 1 つか 2 つ選び、パッケージレコードを作成してみてください。作成したら、次に示す完成した pkgman.yaml ファイルと比較してみてください。パッケージの順番は重要ではありません。最終的に、すべての内容は並べ替えられていない配列になります。
---
-
:http_host: cfhost
:http_port: 80
:http_uri: /jumpstart/pkgs/sfw
:logging: syslog
:syslog_facility: daemon
:syslog_level: notice
-
:hosts: default
:file: atk-1.18.0-sol10-sparc-local
:version: 1.18.0
:name: SMCatk
:action: remove
-
:hosts: default
:file: cairo-1.4.10-sol10-sparc-local
:version: 1.4.10
:name: SMCcairo
:action: remove
-
:hosts: default
:file: expat-1.95.5-sol10-sparc-local
:version: 1.95.5
:name: SMCexpat
:action: remove
-
:hosts: default
:file: fontconfig-2.4.2-sol10-sparc-local
:version: 2.4.2
:name: SMCfontc
:action: remove
-
:hosts: default
:file: freetype-2.3.1-sol10-sparc-local
:version: 2.3.1
:name: SMCftype
:action: remove
-
:hosts: default
:file: glib-2.14.1-sol10-sparc-local
:version: 2.14.1
:name: SMCglib
:action: remove
-
:hosts: default
:file: gtk+-2.12.0-sol10-sparc-local
:version: 2.12.0
:name: SMCgtk
:action: remove
-
:hosts: default
:file: jpeg-6b-sol10-sparc-local
:version: 6b
:name: SMCjpeg
:action: remove
-
:hosts: default
:file: libiconv-1.11-sol10-sparc-local
:version: 1.11
:name: SMCliconv
:action: remove
-
:hosts: default
:file: libpng-1.2.23-sol10-sparc-local
:version: 1.2.23
:name: SMClibpng
:action: remove
-
:hosts: default
:file: pango-1.18.2-sol10-sparc-local
:version: 1.18.2
:name: SMCpango
:action: remove
-
:hosts: default
:file: render-0.8-sol10-sparc-local
:version: 0.8
:name: SMCrender
:action: remove
-
:hosts: default
:file: renderproto-0.9.3-sol10-sparc-local
:version: 0.9.3
:name: SMCrenpro
:action: remove
-
:hosts: default
:file: tiff-3.8.2-sol10-sparc-local
:version: 3.8.2
:name: SMCtiff
:action: remove
-
:hosts: default
:file: xrender-0.8.3-sol10-sparc-local
:version: 0.8.3
:name: SMCxrend
:action: remove
-
:hosts: default
:file: zlib-1.2.3-sol10-sparc-local
:version: 1.2.3
:name: SMCzlib
:action: remove
pkgman の使用法
pkgman をインストールして、初期構成ファイルの設定が完了しました。何ができるか見ていきましょう。
まず、pkgman のコマンド行オプションとその意味を示します。
[root@jtest ~]$ which pkgman
/usr/local/bin/pkgman
[root@jtest ~]$ pkgman
Usage: /usr/local/bin/pkgman [ -n ] -f pkgman.yaml
-f [ /path/to/pkgman.yaml | http://server/path/to/pkgman.yaml ]
-n Just print what would happen without making any changes
-h print usage and exit
-n 引数はオプションで、pkgman を予行モードで実行することを示します。予行モードでは、システムに対する変更は行われません。予行モードを使用すると、pkgman を実際に実行する前に、インストールされるパッケージやホストから削除されるパッケージを確認できます。
-f 引数は必須で、pkgman.yaml ファイルの場所を指定します。ファイルはローカルファイルシステムに存在しても、HTTP を通して利用可能であってもかまいません。一部のサイトは、ファイルをホストにプッシュするために cfengine や同様のツールを使用しません。したがって、pkgman.yaml ファイルを HTTP を通して利用可能にすることは実用的だと思われます。
では、実際に pkgman を実行して、作成した構成ファイルを指定してみましょう。
この最初の例では、pkgman を予行モードで実行してみます。デフォルトのログ構成を使用します。この構成では、すべての情報が /var/adm/messages に送信されます。目的のパッケージはすべて、インストールが必要であるとフラグ設定されました。
[root@jtest /]$ pkgman -n -f \
http://jumpstart:1080/jumpstart/pkgs/sfw/pkgman.yaml
[root@jtest ~]$ tail -16 /var/adm/messages
Dec 11 17:28:38 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCatk
Dec 11 17:28:39 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCcairo
Dec 11 17:28:40 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCexpat
Dec 11 17:28:41 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCfontc
Dec 11 17:28:42 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCftype
Dec 11 17:28:48 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCglib
Dec 11 17:29:07 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCgtk
Dec 11 17:29:08 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCjpeg
Dec 11 17:29:09 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCliconv
Dec 11 17:29:09 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMClibpng
Dec 11 17:29:11 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCpango
Dec 11 17:29:11 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCrender
Dec 11 17:29:11 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCrenpro
Dec 11 17:29:13 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCtiff
Dec 11 17:29:13 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCxrend
Dec 11 17:29:14 jtest pkgman[10407]: [ID 702911 daemon.notice] \
dryrun mode -
Install pkg SMCzlib
したがって、この例を先に進め、予行フラグを外して pkgman を実行し、実際のインストールを行います。ログ出力からは、すべてが正しく実行されたようです。
[root@jtest /]$ pkgman -f \
http://jumpstart:1080/jumpstart/pkgs/sfw/pkgman.yaml
[root@jtest ~]$ tail -16 /var/adm/messages
Dec 11 17:33:40 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCatk> was successful.
Dec 11 17:33:44 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCcairo> was successful.
Dec 11 17:33:45 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCexpat> was successful.
Dec 11 17:33:51 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCfontc> was successful.
Dec 11 17:33:54 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCftype> was successful.
Dec 11 17:34:08 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCglib> was successful.
Dec 11 17:35:00 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCgtk> was successful.
Dec 11 17:35:02 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCjpeg> was successful.
Dec 11 17:35:04 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCliconv> was successful.
Dec 11 17:35:06 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMClibpng> was successful.
Dec 11 17:35:12 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCpango> was successful.
Dec 11 17:35:13 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCrender> was successful.
Dec 11 17:35:14 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCrenpro> was successful.
Dec 11 17:35:19 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCtiff> was successful.
Dec 11 17:35:21 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCxrend> was successful.
Dec 11 17:35:23 jtest pkgman[10494]: [ID 702911 daemon.notice] \
Installation of <SMCzlib> was successful.
pkgman をもう一度予行モードで実行して、何が起こるか確認してみましょう。
今回は、pkgman.yaml ファイルの「logging」のエントリを変更しています。前回は :logging: syslog でした。今回は :logging: console にしています。したがって、必要な作業がある場合は端末に報告されます。
[root@jtest ~]$ pkgman -n -f \
http://cfhost/jumpstart/pkgs/sfw/pkgman.yaml
[root@jtest ~]$
目的のパッケージはすでにインストールされているため、何も報告されませんでした。ただし、疑い深い人のために、パッケージデータベースをダブルチェックして、パッケージが実際にインストール済みであることを確認します。
[root@jtest ~]$ pkginfo |grep SMC
application SMCatk atk
application SMCcairo cairo
application SMCexpat expat
application SMCfontc fontconfig
application SMCftype freetype
application SMCglib glib
application SMCgtk gtk+
application SMCjpeg jpeg
application SMClibpng libpng
application SMCliconv libiconv
application SMCpango pango
application SMCrender render
application SMCrenpro renderproto
application SMCtiff tiff
application SMCxrend xrender
application SMCzlib zlib
ここでは、すべてが正しいように見えます。これで、GTK+ と必要な依存パッケージをインストールしたホストを用意できました。
GTK+ をインストールしたいほかのホストにも、パッケージのインストールを簡単に繰り返すことができるはずです。
JumpStart ポストインストールスクリプト
JumpStart (Flash アーカイブを使用) インストールスクリプトの次の部分は、pkgman を JumpStart にどのように統合しているかを示しています。
目的の OS クラスタを JumpStart を使用してインストールするだけと説明しましたが、これは正確ではありません。Flash アーカイブを作成する前に、OS に Ruby パッケージを追加しています。
代替ルートのインストールを尊重して一部のパッケージがインストールされていないため、インストールのリブートが完了したあと pkgman を実行します。プレインストールスクリプトまたはポストインストールスクリプトにあるハードコードされたパスは、正しく動作しない場合があります。
また、ポストインストールスクリプトでいくつかの設定作業を行うので、ここが pkgman の実行を含める論理的な場所になります。Flash インストール中、/etc/flash/reboot に配置されたスクリプトは、最初のブート中に実行されます。スクリプトの実行後、プロセスは reboot ディレクトリとその内容を削除します。一時的な init スクリプトを作成するよりも適切です。
************* start postinstall **************
#!/bin/sh
create_reboot_script()
{
mkdir -p /a/etc/flash/reboot
cat >/a/etc/flash/reboot/firstboot.sh <<_EOF
#!/bin/sh
PATH=/usr/bin:/bin:/usr/local/bin:/usr/sbin:/sbin
export PATH
logger -p daemon.notice "Running firstboot script"
logger -p daemon.notice "Executing pkgman"
/usr/local/bin/pkgman -f /usr/local/etc/pkgman.yaml
logger -p daemon.notice "rebooting"
init 6
_EOF
chown root:root /a/etc/flash/reboot/firstboot.sh
chmod 755 /a/etc/flash/reboot/firstboot.sh
}
create_reboot_script
************* end postinstall ****************
最初の JumpStart 後の pkgman 実行が完了したら、その後の pkgman の実行は cfengine によってトリガーされます。ホストに特定のトリガーファイル (/etc/.run_pkgman) が存在する場合は、cfengine を構成して pkgman を実行します。
パッケージの変更を配備する必要がある場合、送信先のホストは cfengine グループに存在します。たとえば、GTK+ パッケージを Solaris ワークステーションにプッシュしたい場合、cfengine の「workstations」グループですべてのホストにあるトリガーファイルを機能するように cfengine を使用します。
pkgman の実行を制御する cfengine ファイルの抜粋を示します。
classes:
solaris::
run_pkgman = ( FileExists(/etc/.run_pkgman) )
shellcommands:
run_pkgman::
"/usr/local/bin/pkgman -f /usr/local/etc/pkgman.yaml"
"/usr/bin/rm /etc/.run_pkgman"
機能しているトリガーファイルなど、1 回だけのジョブには専用の cfengine ファイルを使用します。すべてのワークステーションで pkgman をトリガーするには、1 回だけのジョブに使用する cfengine ファイルに次の内容を追加します。cfengine の変更をプッシュしたあとはジョブを削除してください。
shellcommands:
workstations::
"/usr/bin/touch /etc/.run_pkgman"
まとめ
pkgman の紹介もあっという間に終わりになりました。我々の目標は GTK+ パッケージを sunfreeware.com からインストールすることでした。そして、これは達成できました。
この例を通して、pkgman をさらに調査する価値があるかどうかを判断するための情報を十分提供できたと期待しています。詳細な情報は、README ファイル を参照してください。
コメントや質問がありましたら、someword [at] gmail.com までご一報ください。
お時間をいただき、ありがとうございました。
Derek 氏は、経験を積んだ UNIX/Linux のシステム管理者です。長年、カスタム JumpStart インストール、パッケージ管理、および構成管理に関して、特別な興味深い手法を開発してきました。Derek 氏はオレゴン州ポートランド (米国) で暮らし、余暇に Solaris OS をいじったり、ビールを飲んだり、彼が犬を世話してるのであって、逆ではないことを確かめたりしています。
The information and links on this page have been provided by a BigAdmin user. The submitter is solely responsible for such information and links. Sun is not responsible for the availability of external sites or resources, and does not endorse and is not responsible or liable for any content, advertising, products, or other materials on or available from such sites or resources. Sun will not be responsible or liable, directly or indirectly, for any actual or alleged damage or loss caused by or in connection with use of or reliance on the information posted here, or goods or services available on or through any external site or resource.
Comments (latest comments first)
Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License .