Ubuntu Weekly Recipe

第195回 Ubuntuでpkgsrcを使う

この記事を読むのに必要な時間:およそ 4 分

Ubuntuのパッケージシステムは,Ubuntuでフルにメンテナンスしているmainコンポーネントと,Debian由来のuniverseコンポーネントにより,きわめて豊富なソフトウェア資産を擁しています。しかしながら,コンパイルオプションが気に入らない,あるいは特定のパッチを適用した状態で動作させたい,自分で修正したコードを利用したい,といったこともあるでしょう。今回はそうした「自分でコンパイルしたい」ユーザーにとって便利な,⁠ホームディレクトリの下にパッケージシステムを導入する」いくつかの方法を紹介します注1)⁠

注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回を参照してください。

注2
ただし,こうして作成したパッケージはアップデート時やアップグレード後に問題を起こしやすいので,リスクがあることは認識しておきましょう。

パッケージシステムに独自パッケージを混ぜるリスク

このように,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権限なしで各種バイナリを導入できると同時に,システムそのものには影響を与えずに環境を構築できます。

著者プロフィール

吉田史(よしだふみひと)

Ubuntu Japanese Team Member株式会社創夢所属。システム管理を中心にWindows/PC Unixを併用している。Ubuntu Japanese Teamではパッケージサーバの管理や翻訳などの作業を担当。

コメント

コメントの記入