スポンサーリンク

PKG_ADD(1) FreeBSD 一般コマンドマニュアル PKG_ADD(1)

名称

pkg_add − ソフトウェア配布 package をインストールするプログラム

書式

pkg_add [−vInfrRMS] [−t template] [−p prefix] [−C chrootdir] pkg-name [pkg-name ...]

解説

pkg_add コマンドは、 pkg_create(1) コマンドにより作成された package (訳 注: FreeBSD の package system におけるパッケージを指す場合にこう表記しま す) を展開するのに用いられます。

警告

pkg_add コマンドは package ファイルに含まれるスクリプトやプログラムを実行 することがあるので、あなたのシステムは、危険な配布ファイルを作る極悪人か らの ‘‘トロイの木馬’’ や他の巧妙な攻撃などを受ける可能性があります。

package ファイルを提供する人物の能力と身元を確認するとよいでしょう。より 進んだ安全のためには、package を展開するのに −M フラグを用い、その内容 と、スクリプトがシステムに害をおよぼさないかを確認します。 +INSTALL, +POST-INSTALL, +DEINSTALL, +REQUIRE, +POST-INSTALL, +REQUIRE, +MTREE_DIRS の各ファイルには特に注意を払い、+CONTENTS ファイルの @cwd, @mode (setuid をチェック), @dirrm, @exec, @unexec ディレクティブを調べてください。 package ファイルを調べるのには pkg_info(1) コマンドも使えます。

オプション

以下のコマンドラインオプションが提供されています:

       pkg-name [pkg-name ...]

指定された package がインストールされます。 という名前が指定さ れると、 pkg_add は stdin から読み込みます。 package がカレント ディレクトリに見つからないと、 pkg_add は PKG_PATH で指定された各 ディレクトリを探します。

−v
饒舌な出力に切り替えます。

−I
package にインストール用スクリプト (pre-install または post-install) が存在しても、それを実行しません。

−n
実際にはインストールを行わず、インストールした場合に実行されるで あろうステップを表示します。

−R
package のインストール結果を記録しません。このオプションは、後で アンインストールすることを不可能にするため、自分が何をしているか を理解している人のみ使ってください。

−r
リモートフェッチ機能を使用します。適切なオブジェクト形式とリリー スを決定してから、 package を取得してインストールします。

−f
あらかじめ必要な package がインストールされていなかったり、 requirements スクリプトが失敗した場合にも強制的にインストールしま す。これは pkg_add が見つからない必要な package を探して自動的に インストールすることを止めるわけではなく、見つからない場合でも中 断しないようにします。

−p prefix
package からファイルを展開するディレクトリの前に prefix を付けま す。 package がデフォルトディレクトリを保持している場合には、この オプションで変更できます。 pkg_add はディレクトリ設定が相対的に行 われているか、絶対的に行われているかを知る術がないので、最初の @cwd ディレクティブのみが変更されることに注意してください。複数回 のディレクトリ変更が行われることはまれですが、実際にあった場合、 すべてのディレクトリ変更を制御したくなるでしょう。この場合、 MASTER モード、 SLAVE モードの使用を検討してみてください (オプ ション −M−S を参照)。

−t template
‘‘作業領域’’ を作成する際に、 mktemp(3) への入力として template を用います。これはデフォルトでは /var/tmp/instmp.XXXXXX という文 字列ですが、 /var/tmp ディレクトリの容量が制限されているような状 況では変更する必要があるかもしれません。 mktemp(3) が一意の ID を 用いるために必要な ‘X’ の文字をいくつか残しておくことを忘れないで ください。

作業領域 template を package ファイルがインストールされるディレク トリと同じディスクパーティションに設定することによって、パフォー マンスを高めることが可能です (大抵は /usr )。

−M
MASTER
モードで実行します。これは pkg_add のとても特殊な実行モー ドであり、 SLAVE モードと共に実行しなければなりません。このモード で実行されると、 pkg_add は一時的な作業領域 ( −t オプションを参 照) へ package を展開する以上のことはせず、現在の作業領域ディレク トリ名を頭に付加した packing list を標準出力に出力します(標準出力 は sed(1) のようなプログラムにフィルタされているかもしれません)。 SLAVE モードと共に用いると、中身を処理する前に package 構造に大き な変更を加えることが可能になります。

−S
SLAVE
モードで実行します。これは pkg_add のとても特殊な実行モード であり、 MASTER モードと共に実行しなければなりません。このモード で実行されると、 pkg_add は package の内容がすでに作業領域に展開 され、その場所が標準入力から文字列として入力されることを想定しま す。完全な packing list も stdin から読み込まれ、その後中身が通常 どおり処理されます。

−C chrootdir
処理を行なう前に、ディレクトリ chrootdir に対して chroot(2) を実 行し、パッケージファイルとパッケージデータベースが chrootdir にイ ンストールされているようにします。 chrootdir は、 pkg_add の実行 に通常必要なものすべてを含む、相当程度完全なファイルシステムであ る必要があります。このフラグは、 sysinstall(8) が実行する操作のサ ポートを支援するために追加されました。その他の用途に役に立つよう にということではありません。 chrootdir は適切に設定され、通常の ユーザが変更できないようにすること、 fetch(1) のようないくつかの コマンドは chrootdir の内側で実行されることに注意してください。

一つ以上の pkg-name 引数を指定することが可能で、それらは package を含む ファイル名 (通常拡張子 ‘‘.tbz’’ で終わります) か、ftp サイトにあるファイ ルを示す URL のどちらかになります。したがって、anonymous ftp から直接ファ イルを展開することが可能です (例えば pkg_add ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/shells/bash-1.14.7.tbz) 。注意: もし上記のような転送で用いる ftp で passive mode を利用したいな ら、環境変数 FTP_PASSIVE_MODE に何らかの値を設定する必要があります。そう でなければ、より一般的な ACTIVE モードが利用されます。もしうまく動作して いることがわかっているサイトから package を得ようとして pkg_add が常に失 敗する場合、あなたが passive mode の ftp を使う必要のあるファイアウォール の中にいるのが原因である場合があります。

技術詳細

pkg_add ユーティリティは、各 package の "packing list" を /tmp (設定され ている場合には $PKG_TMPDIR ) 中の特別な作業ディレクトリに展開し、中身を解 析し、package の内容を完全に展開するために以下の手順を実行します。

       1. package がすでにインストールされている、と記録されているかどうかをチェックします。もしそうならインストールを中断します。

2. package が、既にインストール済の package と衝突するかどうかをチェッ クします (@conflicts ディレクティブを読みます。 pkg_create(1) を参 照)。もしそうならインストールを中断します。

3. packing list に書かれている、package の全依存関係をスキャンします (@pkgdep ディレクティブを読みます。 pkg_create(1) を参照)。もし必須 の package が現在インストールされていなければ、それを見つけてインス トールしようとします。ない package がみつからなかったりインストール できなかったりすると、インストールを中断します。

4. package がどのようにシステムに追加されるかを制御する @option ディレ クティブを検索します。このマニュアルページを書いている時点では、実装 されているオプションは @option extract-in-place のみであり、これは /tmp 内の作業領域を経由しないで、 package を最終的なディレクトリに直 接展開するようにします。

5. @option extract-in-place が指定されていれば、package は最終的な場所 に直接展開され、そうでなければ作業領域内に展開されます。

6. package が require ファイル ( pkg_create(1) を参照) を含んでいる場 合、そのファイルを以下の引数を付けて実行します:
pkg-name INSTALL

ここで pkg-name は問題としている package の名前であり、 INSTALL キー ワードはインストールの requirements チェックであることを示しています (これは複数の機能を提供するひとつのスクリプトを用いようとする場合に 有用です)。

       7. package に pre-install スクリプトが存在する場合、以下の引数を付けて実行されます:

script pkg-name PRE-INSTALL

ここで pkg-name は対象の package 名であり、 PRE-INSTALL はこれがイン ストール前のフェーズであることを示すキーワードです。

: ( −i および −I のフラグを pkg_create(1) に使用することにより) package 作成時に pre-install と post-install のスクリプトが別々に与 えられる場合には、 PRE-INSTALL キーワードは登場しません。

       8. @option extract-in-place が指定されていない場合、packing list (+CONTENTS ファイル) が作業領域から最終的な場所にファイルを移動 (必要ならコピー) するために参照されます。

9. package が mtreefile ファイル ( pkg_create(1) を参照) を含む場 合、mtree が以下の引数を付けて実行されます:
mtree −u −f
mtreefile −d −e −p prefix
ここで prefix−p フラグが指定されていればその prefix、 −p フラグ が指定されていない場合にはこの package の最初の @cwd ディレクティブ のディレクトリ名が prefix になります。

       10.package に post-install スクリプトが含まれる場合、

script pkg-name POST-INSTALL
として実行されます。ここで pkg-name は対象の package 名であり、 POST-INSTALL はこれがインストール後のフェーズであることを示すキー ワードです。

: ( −i および −I のフラグを pkg_create(1) に使用することにより) package 作成時に pre-install と post-install のスクリプトが別々に与 えられる場合には、 POST-INSTALL キーワードは登場しません。

POST-INSTALL および PRE-INSTALL のキーワードを渡す背景には、 ‘‘イン ストールの前とインストール後の両方’’ の手続きをこなす一つの install スクリプトを用いることを可能にすることがあります。しかしながら、メン テナンスの観点からは、機能を分離する方が有利かつ容易です。

       11.インストールが終了すると、後で pkg_delete(1) で使うために packinglist、 deinstall スクリプト、 description、 display の各ファイルが/var/db/pkg/<pkg-name> にコピーされます。 package の依存関係は、他のpackage の /var/db/pkg/<other-pkg>/+REQUIRED_BY ファイル (PKG_DBDIR環境変数が設定してある場合、上記の /var/db/pkg/ が置き換えられます)に記録されます。

12.最後に、作業領域が削除されプログラムは終了します。

すべてのスクリプトは環境変数 PKG_PREFIX にインストール時の prefix ( 前述 の −p オプションを参照) が設定された状態で実行されます。このことによ り、package の作者は pkg_add−p フラグにより package がインストールさ れるディレクトリが変更されても、きちんとふるまうスクリプトを書くことが可 能になります。

環境変数

PKG_PATH の値は、指定された package が見つからない時に用いられます。環境 変数はコロンで区切られた一連のエントリです。各エントリはディレクトリ名か らなります。カレントディレクトリは空欄のディレクトリ名で暗黙のうちに指定 されるか、一つのピリオドで明示的に指定します。

環境変数 PKG_DBDIR は、インストールされた package についてのデータベース の位置を指定します。デフォルト位置は /var/db/pkg です。

pkg_add が作業領域の生成を試みる作業用ディレクトリの名前は、環境変数 PKG_TMPDIR と TMPDIR とから (この順で) 取られます。これらの変数が存在しな いか、指定されたディレクトリに十分な空き容量がない場合、 pkg_add は、 /var/tmp, /tmp, /usr/tmp のうちで、十分な空き容量を持つ最初のディレクトリ を使います。

環境変数 PACKAGEROOT は、 pkg_add が取得を行う代替位置を指定します。取得 に使用する URL は、本環境変数と、 −r オプション使用時に pkg_add が自動的 にディレクトリを決定する論理とで、構築されます。設定例は "ftp://ftp3.FreeBSD.org" です。

環境変数 PACKAGESITE は、 pkg_add が取得を行う代替位置を指定します。この 変数を使用すると、 −r オプション使用時に pkg_add が自動的にディレクトリを 決定する論理が破壊されます。よって、これはリモートパッケージファイルへの 完全な URL であることが必要です。

関連ファイル

       /var/tmp

環境変数 PKG_TMPDIR と TMPDIR のどちらも適切なディレクトリを 指定しない場合に、作業領域を作成するために用いる作業用ディレ クトリ。
/tmp
/var/tmp
が存在しないか、十分な空き容量を持たない場合、その 次に選ばれるディレクトリ。
/usr/tmp
/var/tmp
/tmp のどちらも作業領域を作成するには適切でない 場合、最後に選ばれるディレクトリ。
/var/db/pkg
インストールされた package についてのデータベースのデフォル トの位置。

関連項目

pkg_create(1), pkg_delete(1), pkg_info(1), pkg_version(1), mktemp(3), sysconf(3), mtree(8)

作者

Jordan Hubbard

協力者

John Kohl ⟨jtk@rational.com⟩

バグ

配布物のファイル間のハードリンクは、 (1) 作業領域が、ファイルへのすべての リンクの最終的なディレクトリと同じファイルシステムの場合もしくは、 (2) ファイルへのすべてのリンクが contents ファイル内で @cwd ディレクティブで 括られている場合にのみ保存されます。 さらにその上、リンク名は単一の tar コマンド ( sysconf(_SC_ARG_MAX) により返される値に依存する実行時の引数の 長さの制限により、複数の実行には分割できません) で展開されなければなりま せん。

バグは他にもあるはずです。

FreeBSD 10.0 March 1, 2004 FreeBSD 10.0

スポンサーリンク