公開日: 2021年7月4日 / 最終更新日: 2023年7月28日

アプリケーションをインストールする (前編): packages

FreeBSD にアプリケーションをインストールするには packages や ports と呼ばれるしくみを利用します。Emacs、LaTeX、Chrome (Chromium) などの著名なものから、何に使うのやら私にはよくわからないものまで、膨大な数のアプリケーションをわりと簡単にインストールすることができます。packages や ports の利用方法は FreeBSD ハンドブックに詳しく書かれています。それを見ながら私がいろいろ試してみた結果をまとめました。前編では packages を扱います。
参考 URL: FreeBSD ハンドブック 第 4 章 アプリケーションのインストール

packages と ports の関係

FreeBSD に初めて触れる方は、なんでアプリケーションをインストールするのにやり方が 2 通り (つまり packages と ports) あるのだ?と思われるかもしれません。

まず、ports から説明しましょう。FreeBSD に自力でオープンソースソフトウェアをインストールする場合、一般的には次の手順を踏むことになります。

  1. インストールしたいソフトウェアの公式サイト (例えば Emacs なら GNU の FTP サイト) 等からソフトウェアのソースコードをダウンロードする。
  2. (必要があれば) FreeBSD で利用できるように、ソースコードにパッチを当てる。
  3. ビルドして実行可能ファイルを作成する。
  4. 実行可能ファイルやドキュメントを、システムのしかるべきディレクトリにコピーする。

実際にやってみるとわかりますが、ビルドが一発で通るなんてことは極めてまれで、たいていはおびただしい数のコンパイルエラーに悩まされることになります。インストールしなければならないソフトが 1 本 2 本ならともかく、他にも 200 本くらいあったとしたら…苦行の日々を強いられることは想像に難くありません。ありがたいことに、これを自動で行ってくれるのが ports と呼ばれるしくみです。ports 自体はソフトウェア本体 (ソースコード) を含みません。あくまで上記の手順を遂行するための手順や情報 (ダウンロード元の URL、Makefile、パッチファイルなど) をまとめた「手順書」です。

一方、packages では FreeBSD の中の人が手順 3 までを実行して、実行可能ファイル (やドキュメント) を作成し、配布サイトに置いておいてくれます。あとはそれをダウンロードしてシステムにインストールするだけです。

つまり、手順 1 ~ 4 を自分の手元のマシンですべて実行するのが ports、手順 1 ~ 3 は別の誰かがすでに実行してくれてあり、4 だけ自分で実行すればよいのが packages といえるかと思います。

まとめると、それぞれ次のような特徴があります。

ports:

「自分のマシンでビルドする」というのがそのままメリットにもデメリットにもなります。

  • [O]自分でバグを修正したり、パッチファイルを作って当てたりすることができる。
  • [O]ビルドする前にオプションを自分で変更できる (例えば www/w3m では、オプション変更によりインラインで画像を表示する機能や Migemo による検索を有効化することができます)。
  • [O]バイナリでの配布が制限されているソフトウェアもインストールすることができる。
  • [X]インストールに時間がかかる。
  • [X]ビルドの際に生成されるオブジェクトファイル等がストレージを圧迫するかも (インストールしてしまえばmake cleanで不要なファイルをすべて削除することができますが)。

packages:

ports と逆のことがいえます。

  • [O]ports に比べて短時間でインストールできる。
  • [O]ports に比べてストレージを消費しない。
  • [X]バグを見つけても「ちょっと自分で直してみようかな」ということは叶わない。
  • [X]ビルドオプションを自分で変更できない。
  • [X]バイナリでの配布が制限されているソフトウェアをインストールできない (私の知る限りだと Ricty というフォントがそうだと思います)。

packages と ports の併用には要注意!

さて、それぞれにメリット・デメリットがあるなら、両方使って相互に補完すればいいじゃない、と思われたかもしれませんが、実はこれがなかなか厄介です。基本的に packages と ports の併用は悪手です。なぜかというのは (うまく説明できないかもしれないけど) 別記事「packages と ports を併用する前にやっておくこと」で説明を試みます。併用を考えている方はそちらもご確認ください。俺は packages 一本でいくんだ、という方は本稿の残りだけ読んでいただければ大丈夫です。

packages のセットアップ

はじめに、pkg(8) をインストールするために /usr/sbin/pkg を実行します。pkg(7) のマニュアルによると、pkg の本体は後方互換性の問題を避けるためにベースシステムにはインストールされていないそうで、そのため最初に /usr/sbin/pkg を実行して pkg(8) をインストールしなければならないそうです。実際、FreeBSD インストール直後に pkg(8) を使おうとすると、システムにインストールされていない旨が表示されます。
# pkg info pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]:
このとき pkg(8) をインストールするか訊かれるので、このタイミングでインストールしてもいいですし、次のように手動でインストールすることもできます。
# /usr/sbin/pkg
これで pkg(8) がインストールされます。この段階で、ローカルな packages に関するメタデータのデータベースファイルが /var/db/pkg/ に置かれます。
# ls -al /var/db/pkg/ | grep sqlite
-rw-r--r--   1 root  wheel  372736 Jul 24 22:56 local.sqlite
-rw-r--r--   1 root  wheel       0 Jul 24 22:56 local.sqlite-journal
次に、pkg updateを実行してリモートリポジトリのメタデータ (「リポジトリカタログ」と呼ぶらしい) を取得します。これも /var/db/pkg/ に置かれます。
# pkg update
Updating FreeBSD repository catalogue...
...
# ls -al /var/db/pkg/ | grep sqlite
-rw-r--r--   1 root  wheel    372736 Jul 24 22:56 local.sqlite
-rw-r--r--   1 root  wheel         0 Jul 24 22:56 local.sqlite-journal
-rw-r--r--   1 root  wheel  57331712 Jul 24 00:27 repo-FreeBSD.sqlite
-rw-r--r--   1 root  wheel         0 Jul 24 23:05 repo-FreeBSD.sqlite-journal

pkg updateは今後も packages のインストールやアップグレードなどを行う前に実行する必要があります。たいていは自動的に (暗示的に) 実行されるようですが、頭の片隅に入れておくとよいかもしれません。

これで準備は整いました。

packages を利用してみる

ソフトウェアのインストールはpkg install、アンインストールはpkg deleteです。試しに sudo をインストールしてみましょう。
# pkg install sudo
本当にインストールできたかな?
% pkg info | grep sudo
sudo-1.9.14                    Allow others to run commands as root
よさそうです。コマンドを新しくインストールしたら、コマンド一覧を更新しましょう。csh 系はrehashコマンド、sh 系はhash -rで更新します。
% rehash
さて、個々の package(s) は他の package(s) に依存したりされたりしています。それを調べるのがpkg queryコマンドです。指定した package 依存している packages を表示するには「%d」を付けてpkg queryコマンドを実行します。
% pkg query %do rxvt-unicode
x11/libXrender
x11/libXpm
x11/libXext
x11-toolkits/libXt
...
%do」の「o」は表示形式の指定で、package(s) のリストを ports のディレクトリ名で表示します。表示形式は他にもいろいろあって、例えば「%dn-%dv」とすると <パッケージ名>-<バージョン> の形式になります。
% pkg query %dn-%dv rxvt-unicode
libXrender-0.9.10_2
libXpm-3.5.15
libXext-1.3.4,1
libX11-1.7.2,1
libXt-1.2.1,1
...
逆に、指定した package 依存している packages を表示するには「%r」です。
% pkg query %ro libXrender
x11/rxvt-unicode
x11/slim
x11-wm/awesome
...
ついでに、依存関係の解決のために自動的にインストールされた packages を除き、自分が意図してインストールしたものだけをリストアップしたいなーと思ったらこうです。
% pkg query --evaluate '%a = 0' %o
x11-wm/awesome
ports-mgmt/dialog4ports
devel/git
net/gitup
...
%a」は依存関係の解決のためにインストールされた packages に対して 1 を、それ以外は 0 を返します。詳しくは pkg-query(8) のマニュアルを参照してください。

ソフトウェアをアップグレードする

リモートリポジトリの packages は、我々がこうして駄文を書いたり読んだりしている間にも、改良され修正されてバージョンアップしています。更新可能な packages があるか調べてみましょう。
# pkg update -f
Updating FreeBSD repository catalogue...
Fetching meta.conf: 100%    163 B   0.2kB/s    00:01
Fetching packagesite.pkg: 100%    7 MiB 185.8kB/s    00:37
Processing entries: 100%
FreeBSD repository update completed. 32886 packages processed.
All repositories are up to date.
# pkg version -l '<' -vR
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
cups-2.4.2                         <   needs updating (remote has 2.4.2_1)
curl-8.0.1                         <   needs updating (remote has 8.1.1)
まずpkg update -fでリポジトリカタログのローカルコピーを更新し、pkg versionでローカルとリポジトリの packages のバージョンを比較しています。「-l '<'」を付けることでローカルよりもリポジトリのバージョンが新しい packages だけをリストアップします。上の例では cups や curl などが更新可能なようです。では実際に packages のアップグレードを実行しましょう。コマンドはpkg upgradeです。「-y」を付けるといちいち yes/no を訊かれずに済みます。
# pkg upgrade -y
とりあえずこんなところでしょうか。ところで、上でも少し触れましたが、残念なことにライセンス等の関係で packages にはなくて ports には収録されている、というソフトウェアが存在します。そういう場合は ports を利用することになるのですが、(これも上で述べたように) packages と ports を併用する場合は注意が必要です。その点も含めて、後編では ports について説明します。