Ubuntu Weekly Recipe

第195回Ubuntuでpkgsrcを使う

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]⁠。

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パッケージを確認してみましょう。

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を宣言してください⁠⁠。

おすすめ記事

記事・ニュース一覧