Ports

インストール時に、ports コレクションを入れるか、 と聞かれますが入れておくと便利です。 /usr に 100MB ほど要りますが、 多数のアプリケーションが make コマンドを一発打てば インストールできるようになります。 package にはなってないが、ports にはなっているという アプリケーションもあるそうです。

用意するもの


ports とは

package に慣れた人は ports を見て、 「あれ?本体は?」と思うかも知れません。 ports はアプリケーションのうち、 Makefile を主とする「指令部」だけで、 実体は ftp 経由で拾って来ることになります。 それを手元でコンパイルすることにより、 実行ファイルを作成ならびにインストールします。

ports コレクションを入れる

インストール時に入れておけばそれでいいですが、 後から思い立った人は、 日本の FreeBSD サイトの ports のページ にいって「全てのxxxx個の ports を tar でまとめて gzip したもの」を 拾って来るか、直接 FTP サイトからダウンロードします。 それを適当な場所(普通は /usr/ports です)に展開します。

# cd /usr
# mv /somewhere/ports.tar.gz .
# tar zxf ports.tar.gz

目的の ports を探す

例えば、kterm を ports でインストールするとしましょう。 /usr/ports の下の下のどこかに kterm というディレクトリが あるのですが、それはどこでしょう? いくつか探し方を挙げておきます。 番号が大きくなる程、時間がかかります(たぶん)。
  1. whereis で探す
    たとえば、kterm を探すと
    % whereis kterm
    kterm: /usr/X11R6/bin/kterm /usr/X11R6/man/man1/kterm.1.gz /usr/ports/japanese/kterm
    と出ます。最後が ports でのありかです。
  2. /usr/ports/INDEX で探す
    % cd /usr/ports
    % grep 'kterm' INDEX
    ja-kterm-6.2.0|/usr/ports/japanese/kterm|......
    ja-kterm16c-6.2.0|/usr/ports/japanese/kterm16c|.....
  3. ports のページ で探す。このページには検索機能があるので、 それで探せます
  4. 全部の ports の名前順一覧表 で探す。 見つけたら、 「詳しい説明」を見て確認します。 一番上の大きい文字で /usr/ports/ 以下の場所が書いてあります。
  5. find で探す
    % cd /usr/ports
    % find . -type d -name '*kterm*' -ls
    307819 2 drwxr-xr-x 5 root wheel 512 Nov 14 08:15 ./japanese/kterm
    238723 2 drwxr-xr-x 5 root wheel 512 Aug 25 1999 ./japanese/kterm16c

ports を使う

例えば、kterm をインストールする時は、 kterm のディレクトリ (/usr/ports/japanese/kterm) に cd して make install と打つだけです。
# cd /usr/ports/japanese/kterm
# make install

すると、/usr/ports/japanese/kterm にある Makefile の指令により、

という一連の作業を勝手にやってくれます。楽チン楽チン。

ports の make のターゲット

上の例では make のターゲットとして install を選びましたが、 これをいろいろ変えると、いろんな段階で作業をストップさせられます。
make のターゲット 段階
make fetch filename.tar.gz ファイルを /usr/ports/distfiles に持って来る
make extract filename.tar.gz ファイルを展開する
make patch 展開したソースファイルにパッチを当てる
make configure プログラムの設定を行う
make プログラムを作る(コンパイルする)
make install プログラムをインストールする
make deinstall プログラムをアンインストールする
make package プログラムのパッケージを作る
make clean 作業ディレクトリ /usr/ports/xxx/yyy/work を掃除する
make makesum CHECKSUM を作る (管理者用)
make package までは、それより前の段階まですべてを実行します。

/etc/make.conf

/usr/ports で make をする際、デフォルトのオプションを このファイルで決められます。

distfile を拾ってくるサイトの指定

/usr/ports/distfiles に目的の distfile (.tar.gz 形式のファイル) がない場合、ネットワーク経由で拾って来ることになります。 この場合、相手先は
  1. Makefile 中、MASTER_SITES= で指定されたサイト
  2. ftp.FreeBSD.org
という順番で選ばれます(1.でダメなら 2. を試す)。

しかし、MASTER_SITES よりもネットワーク的に近い ミラーサイトがある場合には、そちらから拾った方が快適です。 また、MASTER_SITES でダメなときも、 ftp.FreeBSD.org よりも日本の公式ミラーサイト ftp.jp.FreeBSD.org に行った方がよいでしょう。 その他も含めて、日本のミラーサイトは次の通りですので、 ping などで通信が早いところを調べましょう。

調べたら、拾ってくる優先順位を入れ換える設定をしましょう。 いじるファイルは /etc/make.conf です。

/etc/make.conf
    MASTER_SITE_BACKUP?=   \
           ftp://ftp.jp.freebsd.org/pub/FreeBSD/distfiles/
    MASTER_SITE_OVERRIDE?=  \
           ftp://ftp.jp.freebsd.org/pub/FreeBSD/distfiles/  
実際は双方とも、適当なサイトを指定して下さい。

この設定により、distfile を取得する試みは次の順番で行われます。

  1. MASTER_SITE_OVERRIDE で指定されたサイト
  2. Makefile 中の MASTER_SITES で指定されたサイト
  3. MASTER_SITE_BACKUP で指定されたサイト

USA 以外のサイトの場合

USA 以外のサイトでは、次の設定をしておくとよいでしょう。
/etc/make.conf
#USA_RESIDENT=  YES 
    → USA_RESIDENT=  NO 

例えば、/usr/ports/security/ssh ではアメリカが輸出規制を しているため、アメリカのサイトからは持って来れません。 そこで、環境変数として USA_RESIDENT を NO に設定するのですが、 ここでしておけば環境変数を改めて設定しなくてもOKです。

Ports でインストールしたアプリケーションを アップデートする

portupgrade で行います。 まずは、portupgrade 自身を port でインストールします。 3.4R の ports にはありませんが、4.4R にはありました。
# cd /usr/ports/sysutils/portupgrade
# make install clean

使い方は、例えば hogehoge-x.y.z (hogehoge はアプリケーション名、 x.y.z はバージョン番号) をアップデートするには、次の通り。
# portupgrade -r hogehoge-x.y.z
ーr は関連する ports もアップデートするためのオプションです。

トラブルシューティング

ports でインストールに失敗したとなると、大体原因は 次のようなものでしょうか。
  1. fetch (ファイルを持って来るの)に失敗した
  2. CHECKSUM が違った
  3. コンパイルに失敗した
それぞれの対処法です。

1.fetch (ファイルを持って来るの)に失敗した

単に、自動的に拾って来るのに失敗しただけですから そう恐れることはありません。 goo なり何なりで 目的の filename.tar.gz のありかを探し、 その後に ftp などして持ってくればよいのです。 持って来た filename.tar.gz を /usr/ports/disfiles に移してから、 改めて /usr/ports/xxx/yyy にいって make install します。

2.CHECKSUM が違った

要は、ファイルが本来あるべき姿から改変されていないか どうかをチェックしているのですが ( md5 参照 )、 それにひっかかってしまったのです。 これは重要な問題をはらんでいます。 つまり、悪意のある誰かがファイルにトロイの木馬を仕掛け、 拾って来た人のマシンを自らの手で壊させてやろうと 企んでいる可能性があるからです。 この場合は、あやしいファイルを /usr/ports/distfiles から消してから、 信頼のおけるサイトから拾い直して、 /usr/ports/distfiles に置いておけば大丈夫です。

3.コンパイルに失敗した

うーん、これはちょっと。場合場合でしょうから、 エラーメッセージを見て対処するしかありません。

4.一度やったオプションの指定を忘れてくれない (5.x)

ports の中には、手動でオプションを指定するものがありますが、 一度指定してしまうとそれを忘れてくれないことがあります。 そのせいで、コンパイルがうまくいかないオプションを 外せず悶々としてしまいます。

そんなときは、/var/db/ports/(プログラムの名前)/options を見てみましょう。 ここにオプション情報が格納されていますので、消してしまえば初期化できます。

ところで、手動でオプションを要求されるのはとても面倒です。 コンパイルに時間がかかるものをいっぱい入れたいとき、 ずっと計算機の前に居ないといけないからです。 まだやってませんが、/var/db/ports/xxxx/options に適当な記述をしておけば オプション要求を避けられるのではないかと思います。(未確認)

プライベートネットから ports を使う

ports を使おうとしているホストがプライベートネットワークの中にあり、 じかにインターネットと繋がっていない場合は、proxy サーバを経由して ports を使います。proxy サーバには HTTP_PROXY サーバ、FTP_PROXY サーバ などがありますが、HTTP_PROXY サーバを指定するといいようです。 HTTP_PROXY サーバは各ネットの管理者に聞いて下さい。 仮に、ここでは proxy.in.your.net で、ポート番号が 8080 としておきましょう。 やることは、環境変数 HTTP_PROXY を設定するだけです。

# setenv HTTP_PXORY proxy.in.your.net:8080

これさえやれば、あとはインターネットにじかつなぎされているように make; make install で OK です。

注意としては、環境変数 FTP_PROXY サーバは設定しない方がよいみたいです。 HTTP_PROXY サーバが設定してあって、FTP_PROXY サーバが設定してない場合は、 前者が後者にもなりますので問題ありません。


FreeBSD の部屋


Jun. 02, 2003