This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

質問と回答集

4.6. 質問と回答集

Q: 私はモデムについての議論を しているのかと思っていました??!
Q: 私は, 標準以外のプログラムのインストールには packages を使うと 思っていたのですが.
Q: それではどうして面倒な ports があるのですか?
Q: パッチとは何ですか?
Q: tarball とは一体何ですか?
Q: チェックサムとは何ですか?
Q: 今まで「CD-ROM から Ports をコンパイルする」にあるようにして Ports をインストールできていたのですが, kermit のインストールをしようとするとうまくいきません.
Q: kermit の tarball を入手しましたが, /usr/ports/distfiles に ファイルを置こうとすると, 書き込み権がないというエラーがでます.
Q: ports では, すべてを /usr/ports に置いたときだけ動作するのでしょうか? システムの管理者によると, 私の個人的なファイルは /u/people/guests/wurzburger に入れなければならないのですが, これでは うまくいかないように思います.
Q: 私は, FreeBSD の CD-ROM を持っていませんが, 私はすべての tarball を 私のシステムに置いておきたいのです. そうすれば, 私は ports をインストール するたびに, 毎回ダウンロードが終わるのを待たなくてすむでしょう. これを一度におこなう簡単な方法はありませんか?
Q: マスタ FTP サイトから tarball を持ってくるより, 近くにある FreeBSD の ミラーサイトから持ってきた方が速いはずです. MASTER_SITES に書かれている サイト以外から持ってくるように ports に指示する方法はありませんか?
Q: ダウンロードをする前に, どんなファイルが必要なのか知りたいのですが.
Q: ports のコンパイルを途中で止める方法はありますか? 私はインストールをする前に いろいろとソースコードを解析したいのですが, 毎回 control-C を打たなければならないのが少し面倒です.
Q: 自分で ports を作ろうとしています. 私の作ったパッチが 正しく処理できることを確認できるように, コンパイルを止めたいのです. パッチのための make extract のようなものはありませんか?
Q: あるコンパイルオプションはバグの 原因になるという話を聞きました. 本当なのでしょうか? どうやったら正しい設定で ports をコンパイルできますか?
Q: ports がたくさんありすぎて, 私の欲しいものがなかなか見つけられません. どんな ports が使えるのか, リストはどこかにありませんか?
Q: foo ports をインストールしたいのですが, それのコンパイルは すぐに停止して, bar ports のコンパイルが始まってしまいます. 一体どうして?
Q: ports から grizzle プログラムをインストールしましたが, まったく ディスクスペースの浪費です. 削除したいのですが, すべてのファイルが どこへインストールされたのかわかりません. 何か手がかりはありませんか?
Q: ちょっと待ってください. 削除しようとするコマンドのバージョン番号を 知っていなくてはならないのでしょうか? あなたは, 私がバージョン番号を 覚えていることを本気で当てにしているのでしょうか?
Q: ディスク容量のことなのですが, ports のディレクトリは非常に膨大な容量を 使うように見えます. 残しておいた方がよいのでしょうか? 削除してしまっても よいのでしょうか?
Q: これを試してみたのですが, tarball や ports で使われたファイルが distfiles ディレクトリに残っています. これも削除してしまっても大丈夫ですか?
Q: 私はとてもとてもたくさんのプログラムを楽しみたいのです. 一度にすべての ports をインストールする方法はありませんか?
Q: やってみました. 時間がとてもかかるだろうと思ったので, そのまま実行を 続けさせて, 私は寝ました. 翌朝コンピュータを見てみると, 三つ半の ports しか 処理が終わっていませんでした. なにか悪かったのでしょうか?
Q: 私は一日中モニタの前に座って過ごしたりしたくないのですが. 何かよいアイデアはありませんか?
Q: 私たちは ports コレクションにある frobble を使っています. ですが, 私たちの必要に応じて ports を変更したところがあるのです. 自分でパッケージを作って, それを私たちのサイトのまわりに 簡単に配布できるような方法がありますか?
Q: この ports の技術は本当に賢いですね. どのようにして動いているのか 私はどうしても知りたいと思います. その秘密は何ですか?

Q: 私はモデムについての議論を しているのかと思っていました??!

A: なるほど, あなたはきっとコンピュータの背面についている シリアルポートのことだと思ってしまったのでしょう. あるバージョンの Unixから別のバージョンの Unix へとプログラムを 移殖することを ``porting'' というのですが, ここで我たちは ``porting'' の結果 という意味で ``port'' を使っています. (コンピュータに関わる人々の悪しき習慣として, ひとつの同じ言葉を複数の まったく違う意味として使うことがあるのです.)

Q: 私は, 標準以外のプログラムのインストールには packages を使うと 思っていたのですが.

A: そのとおり. 通常は packages が最も手早くて簡単な方法です.

Q: それではどうして面倒な ports があるのですか?

A: いくつかの理由があります:-

  1. いくつかのソフトウェアのライセンス条件には, バイナリではなくソースコードでの 配布を求めているものがあります.

  2. バイナリ配布を信用していない人もいます. 少なくともソースコード があれば, ソースコードを読んで, (理論的には) 潜在的な問題点を自分で 見つけ出すこともできるはずです.

  3. ローカルなパッチを入手した場合, それを自分で追加するために ソースコードが必要になります.

  4. プログラムがいかにコンパイルされるべきかについて, あなたはパッケージを作った人とは 異なる見解を持っているかもしれません. どんな最適化オプションをつけるべきかとか, デバッグバージョンを作ってから それを strip するべきだとか, いや, そうするべきでない, などなど, 確固たる見解を持っている人もいるでしょう.

  5. ソースコードを手元に置いておきたい人たちもいます. 彼らは, 退屈したときに眺めたり, あちこち解析してみたり, ソースコードを 借用したり (もちろん, ライセンスが許せばの話ですが) するのです.

  6. あなたがソースコードを持っていなければ, それはソフトウェアとは 言えませんね! ;-)

Q: パッチとは何ですか?

A: パッチとは, あるバージョンから他のバージョンへどのように変更するかを 示す, (通常は) 小さなファイルです. ``23 行目を削除'', ``468 行目の後に これらの 2 行を追加'', または``197 行目をこのように変更''というような 内容を含んでいます. これは, ``diff'' という名前のプログラムで生成されます.

Q: tarball とは一体何ですか?

A: .tar または .tar.gz という拡張子を持つファイルです. (.tar.Z のようなバリエーションも ありますし, DOS のファイルシステム用に .tgz と短縮される場合もあります.)

これは基本的に, 一つのファイルに固めた (.tar) ディレクトリツリーです. 圧縮されている (.gz) 場合もあります. これは元々 Tape ARchives (訳注: テープアーカイブ) (このため tar という名前なのです) で使われていたものなのですが, インターネット上でプログラムのソースコードを配布するために 広く使われている方法です.

これらのファイルの中身を見たり, 展開したりすることもできます. FreeBSD の基本システムに付属する Unix 標準の tar コマンドを使ってみると 次のようになります:-

    % tar tvzf foobar.tar.gz
    % tar xzvf foobar.tar.gz
    % tar tvf foobar.tar
    % tar xvf foobar.tar
          

Q: チェックサムとは何ですか?

A: これは, チェックしたいファイル中のすべてのデータを加えて生成した 数値です. 何か文字が書き換わっていたら, チェックサムが一致しなくなります. そのため, 単純な比較だけで違いを見つけることができるのです. (実際には, 文字の位置が入れ替わるなどの, 単純な加算ではわからない問題も 見つけることができる複雑な方法で計算されています.)

Q: 今まで「CD-ROM から Ports をコンパイルする」にあるようにして Ports をインストールできていたのですが, kermit のインストールをしようとするとうまくいきません.

    # make install
    >> cku190.tar.gz doesn't seem to exist on this system.
    >> Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.

なぜ cku190.tar.gz が見つからないのでしょうか? 不良品の CD-ROM を買ってしまったのでしょうか?

A: CD-ROM から Ports をコンパイルする セクションで解説されているとおり, Ports の一部に, ライセンス上の制限から CD-ROM に収録できない種類のものが存在します. Kermit はその一例です. Kermit のライセンス条件は, tarball を CD-ROM に収録することを禁じているため, 申し訳ありませんが 手動で tarball を取得してください.

質問にあるようなエラーメッセージが表示されるのは, あなたがそのときにインターネットへ接続していなかったことによります. あらかじめ上記のサイトのいずれかからファイルを ダウンロードしておけば, プロセスを再開することができます. (ダウンロードの際には, あなたに最も近いサイトを選ぶようにしてください. そうすれば, 時間とインターネットの帯域の節約になります)

Q: kermit の tarball を入手しましたが, /usr/ports/distfiles に ファイルを置こうとすると, 書き込み権がないというエラーがでます.

A: ports のしくみは /usr/ports/distfiles から tarball を探します. しかし, これは read-only の CD-ROM へのシンボリックリンクなので, ここにファイルを置くことはできません. 次のようにすれば, 他の場所を探すよう ports に指示することができます.

    # make DISTDIR=/where/you/put/it install

Q: ports では, すべてを /usr/ports に置いたときだけ動作するのでしょうか? システムの管理者によると, 私の個人的なファイルは /u/people/guests/wurzburger に入れなければならないのですが, これでは うまくいかないように思います.

A: PORTSDIR 変数と PREFIX 変数を変更することで, 違うディレクトリを 使用することができます. 例えば,

    # make PORTSDIR=/u/people/guests/wurzburger/ports install

とすると, ports は /u/people/guests/wurzburger/ports でコンパイルされ, すべて /usr/local 以下にインストールされます.

    # make PREFIX=/u/people/guests/wurzburger/local install

この場合, コンパイルは /usr/ports でおこない, /u/people/guests/wurzburger/local にインストールします. もちろん, 以下のように両者を組み合わせることも可能です.

    # make PORTSDIR=.../ports PREFIX=.../local install

(省略せずに記述したら, このページに収めるには長すぎるのですが, 考え方は理解していただけたと思います)

もし ports をインストールするたびに, これらを毎回タイプするのが 気に入らないのであれば, (正直に言って, 誰もそう思わないでしょう) これらを環境変数にセットしてしまうという手があります.

Q: 私は, FreeBSD の CD-ROM を持っていませんが, 私はすべての tarball を 私のシステムに置いておきたいのです. そうすれば, 私は ports をインストール するたびに, 毎回ダウンロードが終わるのを待たなくてすむでしょう. これを一度におこなう簡単な方法はありませんか?

A: ports コレクション全体の tarball を持ってくるには, 次のようにしてください.

    # cd /usr/ports
    # make fetch

ports の下のディレクトリひとつの tarball を持ってくるには, 次のように してください.

    # cd /usr/ports/directory
    # make fetch

ports をひとつだけ持ってくる方法は, きっと既にご存知だと思います.

Q: マスタ FTP サイトから tarball を持ってくるより, 近くにある FreeBSD の ミラーサイトから持ってきた方が速いはずです. MASTER_SITES に書かれている サイト以外から持ってくるように ports に指示する方法はありませんか?

A: もちろんあります. 例えば ftp.FreeBSD.org MASTER_SITES に書かれている サイトより近いとしたら, 以下のようにしてください.

    # cd /usr/ports/directory
    # make MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch

Q: ダウンロードをする前に, どんなファイルが必要なのか知りたいのですが.

A: make fetch-list とすると, ports に必要なファイルの一覧を表示できます.

Q: ports のコンパイルを途中で止める方法はありますか? 私はインストールをする前に いろいろとソースコードを解析したいのですが, 毎回 control-C を打たなければならないのが少し面倒です.

A: make extract を実行すると, ファイル転送とソースコードの展開まで おこなったところで停止します.

Q: 自分で ports を作ろうとしています. 私の作ったパッチが 正しく処理できることを確認できるように, コンパイルを止めたいのです. パッチのための make extract のようなものはありませんか?

A: あります. make patch があなたのお望みのものです. おそらく PATCH_DEBUG オプションも同様に お役に立つことでしょう. ところで, あなたの努力に感謝いたします!!

Q: あるコンパイルオプションはバグの 原因になるという話を聞きました. 本当なのでしょうか? どうやったら正しい設定で ports をコンパイルできますか?

A: 本当です. gcc の バージョン 2.6.3 (FreeBSDの 2.1.0 と 2.1.5 に付属している バージョン) では, -O2 オプションを -fno-strength-reduce オプションなしで 使うと, バグのあるコードを出力します (ほとんどの ports は -O2 オプションを 使いません). コンバイラオプションは次のように定義 すべき です.

    # make CFLAGS='-O2 -fno-strength-reduce' install

これを /etc/make.conf に書いておくこともできますが, 残念なことに すべての ports がこの指定を尊重してくれる 訳ではありません. もっとも確実なのは make configure を実行し, ソースディレクトリの Makefile を見て手で修整することですが, ソースが 多くのサブディレクトリにわかれていて, 各々に Makefile がある場合は 大変な仕事になります.

Q: ports がたくさんありすぎて, 私の欲しいものがなかなか見つけられません. どんな ports が使えるのか, リストはどこかにありませんか?

A: /usr/ports の中にある INDEX ファイルを見てみましょう. あるキーワードで ports コレクションを検索したければ, それも可能です. たとえば, 以下のようにすればプログラミング言語 LISP に関連した ports を見つけることができます:

    % cd /usr/ports
    % make search key=lisp

Q: foo ports をインストールしたいのですが, それのコンパイルは すぐに停止して, bar ports のコンパイルが始まってしまいます. 一体どうして?

A: foo ports が, bar ports の提供する何らかの機能を必要としているからです. 例えば foo が画像を使うとすると, bar は画像処理に必要な ライブラリを持っている, などです. または, barfoo をコンパイルするのに必要なツールなのかもしれません.

Q: ports から grizzle プログラムをインストールしましたが, まったく ディスクスペースの浪費です. 削除したいのですが, すべてのファイルが どこへインストールされたのかわかりません. 何か手がかりはありませんか?

A: 大丈夫, 次のようにしてください.

    # pkg_delete grizzle-6.5

もしくは, 次のようにします.

    # cd /usr/ports/somewhere/grizzle
    # make deinstall

Q: ちょっと待ってください. 削除しようとするコマンドのバージョン番号を 知っていなくてはならないのでしょうか? あなたは, 私がバージョン番号を 覚えていることを本気で当てにしているのでしょうか?

A: そんなことはありません. バージョン番号は次のようにすればわかります.

    # pkg_info -a | grep grizzle
    Information for grizzle-6.5:
    grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up arcade game.

Q: ディスク容量のことなのですが, ports のディレクトリは非常に膨大な容量を 使うように見えます. 残しておいた方がよいのでしょうか? 削除してしまっても よいのでしょうか?

A: はい. インストールが首尾よく終わり, もうソースコードが必要でないと思うなら, それらを残しておく理由はないでしょう. 一番よい方法は, 次の通りです.

    # cd /usr/ports
    # make clean

これは, すべての ports のサブディレクトリを調べ, 各 ports のスケルトン以外の削除をおこないます.

Q: これを試してみたのですが, tarball や ports で使われたファイルが distfiles ディレクトリに残っています. これも削除してしまっても大丈夫ですか?

A: はい. それを使った作業が終わったのであれば, 削除してしまっても大丈夫です.

Q: 私はとてもとてもたくさんのプログラムを楽しみたいのです. 一度にすべての ports をインストールする方法はありませんか?

A: 次のようにしてください.

    # cd /usr/ports
    # make install

Q: やってみました. 時間がとてもかかるだろうと思ったので, そのまま実行を 続けさせて, 私は寝ました. 翌朝コンピュータを見てみると, 三つ半の ports しか 処理が終わっていませんでした. なにか悪かったのでしょうか?

A: これは ports の中には私たちの決められないこと (例えば, あなたが A4 の 用紙に印刷したいのか, US レターサイズの用紙に印刷したいのかなど) について 質問してくるものがあるからです. それらの質問には手動で答える必要があります.

Q: 私は一日中モニタの前に座って過ごしたりしたくないのですが. 何かよいアイデアはありませんか?

A: では, あなたが寝に / 仕事に / 公園にいく前に以下を実行してください:-

    # cd /usr/ports
    # make -DBATCH install

これでユーザの入力を要求しないすべての ports をインストールします. そして, 戻ってきてから, 次のように実行してください.

    # cd /usr/ports
    # make -DIS_INTERACTIVE install

そして, 残りの作業を実行してください.

Q: 私たちは ports コレクションにある frobble を使っています. ですが, 私たちの必要に応じて ports を変更したところがあるのです. 自分でパッケージを作って, それを私たちのサイトのまわりに 簡単に配布できるような方法がありますか?

A: もちろんあります. 変更点をパッチにする方法は知っていますよね:-

    # cd /usr/ports/somewhere/frobble
    # make extract
    # cd work/frobble-2.8
    [あなたのパッチを当ててください]
    # cd ../..
    # make package

Q: この ports の技術は本当に賢いですね. どのようにして動いているのか 私はどうしても知りたいと思います. その秘密は何ですか?

A: 秘密は一切ありません. Makefiles ディレクトリ にある bsd.ports.mk bsd.ports.subdir.mk ファイルを見るだけです.

複雑なシェルスクリプトを嫌う読者は, このリンクを追いかけないほうが よいでしょう.