お遊び記録

最近の活動記録

FreeBSD-CURRENT を導入してみた (4) portsを使う環境整備したった

FreeBSD-CURRENT自体の導入がひと段落したところで、様々なソフトウェアを使えるように portsの環境整備を行います。




ports木を導入する

portsとはFreeBSDで用いられる様々なソフトウェアを導入するための枠組みです。 仕組み的にはmake(1)コマンドを核としていて、以下の作業を半自動的に行ってくれます。

  1. コンパイル時のオプションの設定
  2. 導入したいソフトウェアのソースコードを配布サイトから取得
  3. 取得したソースコードチェックサム検査
  4. ソースコードの展開
  5. (必要ならば)FreeBSDで稼働させるためのソースコードの修正(patchあて)
  6. コンパイル
  7. インストール
  8. 一部必要な設定の追加

これら一連の処理はmake(1)コマンドを実行すれば起動されます。例えばxorgを導入したい 場合は、(原理的には)以下の様に実行します。

# cd /usr/ports/x11/xorg
# make install

実際にはより効率的に使うための多少のTipsなどはありますが、基本的にはこれだけで動きます。 FreeBSDでは現在、約24000のソフトウェアをportsで導入することができます。

portsは標準ではディレクトリ/usr/portsの下に展開され、devel(開発ツール)やgpaphics (グラフィック)、japanese(日本語関連)、www(WebおよびHTML関連)といったカテゴリごとに ディレクトリわけされて収められています。 こうした木(ツリー)構造をもっているので、ports木などと呼ばれることもあります。

では、このports木を導入してみましょう。 導入には複数の方法がありますが、ここではもっとも簡単なコマンドportsnap(8)を 用いる方法を紹介します。

portsnap(8)の設定ファイルは/etc下にあるportsnap.conf(5)ですが、このファイルを編集しなくとも 動作します。

# portsnap fetch
...
# portsnap extract
...

portsnap fetchでファイルを取得し、portsnap extractで展開します。 初回の実行にはかなりの時間がかかります。

この操作でports木自体は取得できるのですが、portsの一覧ファイル/usr/ports/INDEX-10 だけは取得できません。これを取得するには以下のように操作します。

# cd /usr/ports
# make fetchindex

ports木は非常に激しく更新が行われています。このためportsnapもたびたび 実行する必要があります。 このためには、以下の様に実行します。

# cd /usr/ports
# portsnap fetch
...
# portsnap update
...
# make fetchindex

2回目以降の更新ではextractではなく、updateを指定します。

portsを使うための最低限のコマンドを導入する

portsを便利に扱うためのコマンドは多数開発されており、それらの多くは ディレクトリ/usr/ports/ports-mgmt/から導入できます。 が、ここではまず最低限のコマンドを導入しましょう。

次世代パッケージ管理システムpkg

pkg(1)は次世代のパッケージ管理システムです。Linuxの多くのディストリビューションの様に 既にコンパイル済みのバイナリ配布パッケージによる運用を可能にします。 また導入されたports/packagesの管理にも用いられます。

コマンドpkgの導入は非常に変わっていて、以下の様にpkgコマンドを実行すると 導入できます。

# pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y  ←yと入力
Bootstrapping pkg please wait
Installing pkg-1.0.1... done
If you are upgrading from the old package format, first run:

  # pkg2ng
pkg-1.0.1                      New generation package manager

なお。ここでpkg2ngというコマンドの実行を求められています。 このコマンドは、pkgコマンドを導入する前に別のportsを導入していたならば 実行する必要がありますが、この手順で行っている場合はそうした導入は行っていないので 必要ありません。

pkgを導入したならば、以下のコマンドを実行しファイル/etc/make.confを更新します。

# echo 'WITH_PKGNG=yes' >> /etc/make.conf

これはportsシステムにパッケージ管理システムとしてpkgを使用することを指示するものです。

なお、ここで導入したpkgコマンドはメッセージにもあるようにBootstrap(立ち上げ)用の バージョンです。次の手順で最新版に更新します。

ports管理コマンドportmaster

通常portsを使用して導入されるソフトウェアパッケージは数100個になります。 それらには依存関係が存在し、あるソフトウェアが動作するには、別のソフトウェアが 存在しなければならない、といった制約条件が発生しています。 その様な状況下で個別のソフトウェアの更新を行うことは、非常に複雑な作業になり現実的では ありません。

コマンドportmaster(1)はインストールされた各種ports間の依存関係を調べ、 適切に一括更新処理を実施するコマンドです。

この導入は以下の様に行います。

# cd /usr/ports/ports-mgmt/portmaster
# make install

最初に以下の設定画面が開きます。

  • portmasterのconfig画面 ここではPKGNGPATCHオプションを指定してPKGNG対応機能を有効化します。 設定を完了し、「OK」を選択するならば、あとはコンパイルとインストールが 自動で行われます。


portmasterのもっとも便利な機能は自動一括アップデートです。 通常、ports木を更新したならば、すでにインストール済みのソフトウェアが更新されて いないか調べます。これには先のpkgコマンドを用い、以下のように実行します。

 # pkg version -v | grep -v =
pkg-1.0.1                          <   needs updating (port has 1.0.2)

現状、pkgの1.0.1版が導入されていますが、portsの方は1.0.2に対応していると 報告されています。そこでさっそく、portmasterを使用して更新をかけましょう。 自動更新はportmasterに引数-aを指定して起動します。

# portmaster -a
===>>> Gathering distinfo list for installed ports

portmaster: All===>>> Starting check of installed ports for available updates
===>>> Launching child to update pkg-1.0.1 to pkg-1.0.2

===>>> All >> pkg-1.0.1 (1/1)
portmaster: All >> pkg-1.0.1 (1/1)
===>>> Currently installed version: pkg-1.0.1
===>>> Port directory: /usr/ports/ports-mgmt/pkg

===>>> Launching 'make checksum' for ports-mgmt/pkg in background
===> No options to configure
===>>> Gathering dependency list for ports-mgmt/pkg from ports
===>>> No dependencies for ports-mgmt/pkg

portmaster: All (1)===>>> Returning to update check of installed ports


===>>> All >> (1)

portmaster: All >> (1)
===>>> The following actions will be taken if you choose to proceed:
        Upgrade pkg-1.0.1 to pkg-1.0.2

===>>> Proceed? y/n [y] y            ←yと入力


===>>> Starting build for ports that need updating <<<===
...
===>>> The following actions were performed:
        Upgrade of pkg-1.0.1 to pkg-1.0.2

この例では更新対象は1個だけでしたが、複数あっても動作します。

なお、通常はportmaster -aで十分ですが、時によってはそれでは うまく行かない場合もあります。そうした情報は、ファイル/usr/ports/UPDATING に記述されています。 こうした情報の例を示します。

20121030:
AFFECTS: users of www/squid31
AUTHOR: flo@FreeBSD.org

The WITH_SQUID_ECAP option was removed from the port. If you use ECAP
you need to update to www/squid32, you can do so by running one of the
following commands:

# portmaster -o www/squid32 www/squid31
or
# portupgrade -fo www/squid32 www/squid31

問題が起きえるソフトウェアと、その発生要件、対処方法としてのportmasterの 実行方法が記述されています。

ports木を更新したならば、かならずこのファイルには目を通しましょう。 なお、このファイルはportsnapコマンドの実行で更新されます。

ここまでのまとめ

以上でports木自身を更新し、それを使って導入したソフトウェアの更新管理を 行うためのコマンドも導入しました。

次回は、VirtualBox仮想マシンでのより便利なコンソール環境を構築してゆきます。