アプリケーションをインストールする (前編): packages
- 参考 URL: FreeBSD ハンドブック 第 4 章 アプリケーションのインストール
packages と ports の関係
FreeBSD に初めて触れる方は、なんでアプリケーションをインストールするのにやり方が 2 通り (つまり packages と ports) あるのだ?と思われるかもしれません。
まず、ports から説明しましょう。FreeBSD に自力でオープンソースソフトウェアをインストールする場合、一般的には次の手順を踏むことになります。
- インストールしたいソフトウェアの公式サイト (例えば Emacs なら GNU の FTP サイト) 等からソフトウェアのソースコードをダウンロードする。
- (必要があれば) FreeBSD で利用できるように、ソースコードにパッチを当てる。
- ビルドして実行可能ファイルを作成する。
- 実行可能ファイルやドキュメントを、システムのしかるべきディレクトリにコピーする。
実際にやってみるとわかりますが、ビルドが一発で通るなんてことは極めてまれで、たいていはおびただしい数のコンパイルエラーに悩まされることになります。インストールしなければならないソフトが 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 のセットアップ
# 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]:
# /usr/sbin/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
rehash
コマンド、sh 系はhash -r
で更新します。
% rehash
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
...
%r
」です。
% pkg query %ro libXrender
x11/rxvt-unicode
x11/slim
x11-wm/awesome
...
% pkg query --evaluate '%a = 0' %o
x11-wm/awesome
ports-mgmt/dialog4ports
devel/git
net/gitup
...
%a
」は依存関係の解決のためにインストールされた packages に対して 1 を、それ以外は 0 を返します。詳しくは pkg-query(8) のマニュアルを参照してください。ソフトウェアをアップグレードする
# 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