Ubuntuのパッケージシステムは、Ubuntuでフルにメンテナンスしているmainコンポーネントと、Debian由来のuniverseコンポーネントにより、きわめて豊富なソフトウェア資産を擁しています。しかしながら、コンパイルオプションが気に入らない、あるいは特定のパッチを適用した状態で動作させたい、自分で修正したコードを利用したい、といったこともあるでしょう。今回はそうした「自分でコンパイルしたい」ユーザーにとって便利な、「 ホームディレクトリの下にパッケージシステムを導入する」いくつかの方法を紹介します[1] 。
自分でパッケージを作る
古典的なLinux環境においては、必要なソフトウェアを自分で整備するため、tarballをダウンロードして展開し、./configure; make ; sudo make install……などといった呪文を唱えるのは、一種のお約束でした。こうした処置の面倒くささを回避するために生まれたのがパッケージシステムです。パッケージシステムを用いることで、「 ソフトウェアを使う場合には、自分でコンパイルする」という厄介ごとを省略することができます。また逆に、「 自分でパッケージを修正する」ことで、自分用パッケージを作ることもできます。
Ubuntu環境では、「 apt-get source」コマンドを利用することで、いつでもパッケージのソースを入手し、自分でパッケージをビルドしなおしたり、ソフトウェアのバグを追いかけることができます。ソースコードの展開に「dpkg-dev」パッケージが必要になりますので、事前にインストールしておきましょう。あとは「apt-get source ( パッケージ名) 」 ( 例:apt-get source zsh)などとしてパッケージ名を指定するだけで、カレントディレクトリにパッケージのソースがダウンロードされ、自動的にソースコードが準備されます。いささか乱暴な方法ですが、こうして展開されたソースコード上で直接修正を行い、「 debuild」コマンドでビルドすれば、独自のパッケージを作ることもできます[2] 。ビルドにはdevscriptsパッケージと、「 apt-get build-dep ( パッケージ名) 」で自動的に導入される、パッケージごとに異なるビルド時依存パッケージがインストールされている必要があります。
また、apt-lineにDebianのものを設定しておき、Debian sidにあるパッケージのソースをそのまま流用して、自前のパッケージを作ることも可能です。この方法は、第16回 を参照してください。
パッケージシステムに独自パッケージを混ぜるリスク
このように、Ubuntuでは「独自パッケージ」を簡単に作ることができます。修正したパッケージを個人のリポジトリで広く公開するPPA も準備されていますので、「 独自リポジトリ」を構成することも難しくありません。Y PPA Manager のようなソフトウェアを利用することで、「 他の人が作ったパッケージ」を検索して入手することもできます。
しかし、パッケージシステムは、非常に複雑なものです。「 あるパッケージを更新したら、依存するパッケージも同じタイミングで更新しないといけない」といったことはよくありますし、「 自作パッケージにつけたバージョン番号が間違っていて、アップグレード後に提供されるパッケージよりも新しいものになってしまっていた」ということが原因で、アップグレードに失敗する、あるいはアップグレード後に正常動作しない、という状態は非常に簡単に引き起こせてしまいます。パッケージシステムの一貫性を破壊するのは非常に簡単なのですが、これはパッケージシステムが繊細であるためではなく、パッケージを投下することが、そのまま「パッケージシステムに対してroot的な“ なんでもできる” 力を行使する」ことに等しいためです。独自パッケージを作成する場合、システムの健全性を保つために、バージョン番号や含まれるファイルに細心の注意を払う必要があります。
これは「気軽にパッケージをいじる」ためには少々面倒です。かといってtarballとconfigureを駆使してソフトウェアを管理するのも、やはり面倒なことに変わりはありません。パッケージシステムを使いつつ、必要な部分だけをカスタマイズするために、今回は「他のパッケージシステムを導入する」ことを試してみましょう[3] 。
[3] Ubuntuでは12.04 LTSを目標に、「 複数のパッケージを矛盾なく同居させる」ための仕組み(dh_ubuntuarb)を開発中なので、それがうまく機能するようになると、「 別のパッケージシステム」を取り込まなくても同じようなことができるようになります。また、chroot環境でdebootstrapし、別のシステムとしてインストールし、そこにPATHを通すことでも実現可能です。しかしながら、今回は「自分でパッチをあてやすい」「 自分でカスタマイズすることが前提の」パッケージシステムの紹介なので、詳しくは触れません。
pkgsrcを使う
pkgsrc は、NetBSDとともに開発されている、ソースツリーとパッケージシステムです。FreeBSDのportsなどと同じように、ユーザーが自分でソフトウェアをビルドし、それをパッケージ化して管理する仕組みです。もともとはNetBSD専用でしたが、現在では多くのUnix/Unixlike環境で利用でき、複数のOSを渡り歩いて同じ環境を構築するには非常に便利です。
今回はこれをUbuntu上で、かつ、ホームディレクトリ以下に構成する形で利用してみましょう。
pkgsrcの展開
pkgsrcの入手は、http://www.pkgsrc.org/ から行えます(現時点では、アクセスするとhttp://www.netbsd.org/docs/software/packages.html にリダイレクトされます) 。まず最初に、ソースツリーを入手して展開する必要があります。次のようにすると、カレントディレクトリにpkgsrc/ディレクトリが展開されます。
wget ftp://ftp.netbsd.org/pub/pkgsrc/pkgsrc-2011Q3/pkgsrc.tar.gz
tar xzf pkgsrc.tar.gz
ソースツリーを展開したら、「 コンパイルするための準備」を整えます。pkgsrcをNetBSD以外の環境で利用する場合、「 pkgsrcが動作する最低限のコマンド」を整えるため、bootstrapと呼ばれる初期展開スクリプトを実行する必要があります。さらに、bootstrapは本質的に「各種コマンドをコンパイルするバッチ処理」なので、コンパイルのための環境をあらかじめ整えておく必要があります。
まずコンパイル環境を整えるため、以下の操作を実行します。
sudo apt-get install build-essential libncurses-dev libncursesw-dev
次に、展開されたpkgsrcツリーの中でbootstrapを実行します ( 注4 ) 。
なんらかの理由でbootstrapの実行に失敗した場合、途中からやりなおすとおかしな状態になることがあります。「 すでにworkにファイルが存在する」と怒られた場合は、work/ディレクトリを削除してから再開するようにしましょう。なお、x64環境ではbootstrapに失敗するはずです。
cd pkgsrc/bootstrap
export SH=/bin/bash
./bootstrap --unprivileged
bootstrapの実行には時間がかかります。コーヒーなり紅茶なりを淹れて一服する程度の時間が経つと、pkgsrc環境が準備されます。
pkgsrcを利用するには、PATH環境変数を修正し、~/pkg以下に展開されたコマンドを利用できるように設定する必要があります。
bashを利用している場合、~/.bashrcの末尾に以下の記述を加えます。
PATH=${HOME}/pkg/bin:${HOME}/pkg/sbin:${PATH}
zshの場合は、.zshrcに次のように記述すると便利でしょう。
path=(
${HOME}/pkg/bin ${HOME}/pkg/sbin
${path}
)
この状態でシェルを起動しなおすと、「 pkg_info」などのpkgsrcのためのパッケージ管理コマンドが導入されているはずです。pkg_infoコマンドで、導入されたpkgsrcパッケージを確認してみましょう。
[4] pkgsrcは本来、システムの/usr/pkg以下にコマンドをインストールするものです。が、 ここでは「--unprivileged」オプションをつけ、ホームディレクトリ以下(~/pkg)にインストールするようにしています。こうしておくと、root権限なしで各種バイナリを導入できると同時に、システムそのものには影響を与えずに環境を構築できます。
pkgsrcによるソフトウェアのインストール
pkgsrcソースツリーが展開されたら、カスタマイズしたいソフトウェアをインストールしてみましょう。pkgsrcのツリーはpkgsrc/直下にジャンルごとに分類され、さらにその下に実際のソフトウェア、という形で並べられています。いろいろな事情で、同じソフトウェアが複数収録されていることもあります。たとえば、メールソフトのmuttであれば「mail/mutt」「 mail/mutt-devel」に分離して配置されていますが、muttは非常に古いもの、mutt-develは1.5.21ベースのものとなっています。
pkgsrcで「パッケージのインストール」を行うには、これらのディレクトリに移動し、「 bmake; bmake install」コマンドを実行します……が、bmakeを実行する前に、オプションを指定しましょう。そのパッケージで利用できるコンパイル時オプションを確認するには、「 bmake show-options」を利用します。mutt-develでshow-optionsを実行すると、以下のような選択肢が表示されます。
$ bmake show-options
Any of the following general options may be selected:
debug Enable debugging facilities in the package.
gpgme Enable gpg support, by using the gpgme library.
idn Internationalized Domain Names (IDN) support.
mutt-compressed-mbox Enable compressed mailbox support in mutt.
mutt-hcache Enable header caching in mutt.
mutt-sidebar Enable the mutt mailbox sidebar patch.
mutt-smtp Enable SMTP support in mutt.
sasl Enable SASL support.
smime Enable S/MIME support.
ssl Enable SSL support.
Exactly one of the following display options is required:
curses Enable curses support.
ncurses Enable ncurses support.
ncursesw Enable wide character ncurses support.
slang Enable S-Lang support.
These options are enabled by default:
curses smime ssl
You can select which build options to use by setting PKG_DEFAULT_OPTIONS
or PKG_OPTIONS.mutt.
これらのオプションは、~/pkg/etc/mk.confに記述することで指定します。今回は例として、以下の指定を行うことにしました[5] 。
PKG_OPTIONS.mutt=ncurses smime ssl
PKG_OPTIONS.mutt+=gpgme sasl mutt-smtp
PKG_OPTIONS.mutt+=mutt-sidebar
PKG_OPTIONS.mutt+=nmutt-hcache
PKG_OPTIONS.mutt+=slang
あとは「bmake ; bmake install」を行うと、依存するソフトウェアを含めて自動的にソフトウェアが導入されます。一般的なソフトウェアで必要な、「 さまざまなライブラリをあらかじめconfigre; make; make installする」作業をpkgsrc側で肩代わりしてくれるため、非常に楽にインストールできます。これだけであればUbuntu環境ではapt-getを利用した方が数段手軽ですが、pkgsrcにはたいていのUnix環境で動作する、というメリットがあります。Solarisや各種Linux、FreeBSD・OS Xなどを行き来しながら作業を行う場合には、pkgsrcで常用ソフトウェアを構築できるようにしておくと便利でしょう。
pkgsrcの基本的な操作
pkgsrcは「パッケージシステム」なので、Ubuntuで利用するdpkgのように、「 インストールされているソフトウェアの一覧」や「ファイル構成」を取得することができます。導入されたパッケージの一覧を確認するには、pkg_info -aコマンドを用います。
pkg_infoコマンドの引数としてパッケージ名を与えることで、パッケージの詳細情報を表示させることができます。さきほど紹介した手順でmuttをビルド・インストールしたのであれば、pkg_info muttを実行し、muttがパッケージとして導入されたことを確認してみてください。さらに、pkg_infoコマンドに「-D パッケージ名」オプションを与えると、「 パッケージをインストールした後、どのように設定すべきか」が表示されます[6] 。
もしソフトウェアが不要になった場合は、pkg_deleteコマンドを用いることで削除できます。たいていの場合、pkg_delete -rR <パッケージ名>とし、自動的にインストールされたパッケージを削除すると便利でしょう。
また、「 pkg_admin -K /home/hito/pkg/var/db/pkg fetch-pkg-vulnerabilities」を実行することで、パッケージの脆弱性チェックも可能です。この操作を行うと脆弱なパッケージのインストールが抑止されるようになります(指定を無視する場合は、mk.confでALLOW_VULNERABLE_PACKAGES=yesを宣言してください) 。
[6] ただし、パッケージ側で-Dで表示される情報を何も持っていないと、この操作では何も表示されません。pkg_info -Dで表示される内容は、Ubuntuでいう/usr/share/doc/<package名>/README.Debianに相当します。……パッケージを作成した人がものぐさだと、何も表示されないあたりも含めて。