tinypackage

Up / English / Japanese / ChangeLog / tinypackage-0.1.0.tar.gz / tinypackage-bootstrap-0.1.0.tar.gz

  tinypackage は UNIX 系システム向けの軽量なソフトウェアパッケージ管理システムです。計算機を利用する一般ユーザが、自分のホームディレクトリの中だけでソフトウェア管理を行いたい場合などに有用です。

 以下に挙げるようなものと同様に、ディレクトリとソフトウェアを1対1に対応させ、シンボリックリンクを通じて実行ファイルや共有ライブラリにアクセスする方法を採用しています。

必要なもの

  Ruby 1.6.4 以上 ( http://www.ruby-lang.org/ ) が必要です。

  Ruby が無い環境でもすぐに導入できるように、ブートストラップパッケージも用意しています。これは、パッケージルート下に自動的に Ruby をコンパイルしてインストールします。

インストール

パッケージルートの作成

 まず、パッケージルートと呼ばれるディレクトリを決める必要があります。 tinypackage はこのディレクトリの下でソフトウェアを管理します。

 ここではパッケージルートを /opt と仮定します。 tinypackage をシステム全体で使用する場合、ここをパッケージルートとすることを推奨します。一般ユーザなら ~/opt が良いでしょう。

通常インストール ( Ruby が既にインストールされている場合 )

  1. パッケージルートとなるディレクトリを作成して下さい。

    # mkdir -p /opt
  2. tinypackage のソースを展開し、 tinypkg スクリプトをパッケージルートにコピーして下さい。

    $ gunzip < tinypackage-0.1.0.tar.gz | tar -xf -
    # cp tinypackage-0.1.0/tinypkg /opt/
  3. 以上で完了です。

ブートストラップインストール ( Ruby がインストールされていない場合 )

  1. パッケージルートとなるディレクトリを作成して下さい。

    # mkdir -p /opt
  2. ブートストラップパッケージを展開し、その中身をパッケージルートにコピーして下さい。

    $ gunzip < tinypackage-bootstrap-0.1.0.tar.gz | tar -xf -
    # cp tinypackage-bootstrap-0.1.0/* /opt/
  3. bootstrap スクリプトを実行して下さい。

    # /opt/bootstrap
  4. Ruby のコンパイルが行われ、 tinypackage の管理下にインストールされます。以上で完了です。

環境変数の設定

 パッケージルートが決まったら、次は環境変数を設定します。 /etc/profile (自分だけに設定する場合は ~/.profile ) に以下の文を記述して下さい。

eval `/opt/tinypkg profile`

また、普段 C シェル (csh,tcsh) を使用している場合は、加えて /etc/csh.login (自分だけに設定する場合は ~/.login ) に以下の文を記述します。

eval `/opt/tinypkg profile -c`

 以上の設定が終ったら、一旦ログアウトして再びログインして下さい。これで以降、ログイン時に以下のような環境変数の設定が行われ、 tinypackage 下のソフトウェアが提供する実行ファイル等が利用可能になります。

export PATH="/opt/.bin:$PATH";
export LD_LIBRARY_PATH="/opt/.lib:$LD_LIBRARY_PATH";
export LIBRARY_PATH="/opt/.lib:$LIBRARY_PATH";
export MANPATH="/opt/.man:$MANPATH";
export INFOPATH="/opt/.info:$INFOPATH";
export C_INCLUDE_PATH="/opt/.include:$C_INCLUDE_PATH";
export RUBYLIB="/opt/.libruby:$RUBYLIB";
export PERLLIB="/opt/.libperl:$PERLLIB";
export PYTHONPATH="/opt/.libpython:$PYTHONPATH";

 なお、このような環境変数が利用できない状況( CGI など)から tinypackage 下のソフトウェアを利用するには、後述するマージモードと呼ばれる機能を使用します。

ソフトウェアのインストール

 ここでは、 tinypackage でソフトウェアをインストールする方法を紹介します。インストールには以下の2つの方法がありますが、順番に紹介していきます。

手動でインストールする

 それでは、例として GNU Hello というプログラムをインストールしてみます。

1. コンパイルとインストール

 まず、 http://www.gnu.org/software/hello/hello.html から hello-2.1.1.tar.gz をダウンロードし、展開して下さい。

$ gunzip < hello-2.1.1.tar.gz | tar -xf -

展開されたディレクトリでビルドとインストールを行います。この時、インストール先がパッケージルート直下のサブディレクトリとなるよう、 prefix に /opt/hello と指定して下さい。

$ cd hello-2.1.1
$ ./configure --prefix=/opt/hello
$ make
# make install

これで /opt/hello に GNU Hello がインストールされました。

2. シンボリックリンクの更新

 ひとつのソフトウェアのインストールが完了したら、 tinypkg スクリプト を実行してシンボリックリンクを更新します。

# /opt/tinypkg update
Updating: bin lib man info include libruby libperl libpython emacs-lisp 

これで、シェルが /opt/hello/bin/hello コマンドにアクセスできるようになります。確認してみましょう。

$ which hello
/opt/.bin/hello

3. インストール完了

 これで GNU Hello を実行する準備が整いました。実行してみましょう。

$ hello
Hello, world!

また、 man ページや info も見ることができます。

$ man hello
$ info hello

この時点で、ディレクトリ構造はこのようになっています。

/opt
/opt/tinypkg
/opt/hello
/opt/hello/info
/opt/hello/info/hello.info
/opt/hello/share
/opt/hello/share/locale
/opt/hello/bin
/opt/hello/bin/hello
/opt/hello/man
/opt/hello/man/man1
/opt/.bin
/opt/.bin/hello -> /opt/hello/bin/hello
/opt/.lib
/opt/.man
/opt/.man/man1
/opt/.man/man1/hello.1 -> /opt/hello/man/man1/hello.1
/opt/.info
/opt/.info/hello.info -> /opt/hello/info/hello.info
/opt/.include
/opt/.libruby
/opt/.libperl
/opt/.libpython
/opt/.emacs-lisp

他のソフトウェアをインストールする場合も、以上のような手順を踏んで下さい。

ビルドシステムを利用してインストールする

(作成中)

インストールしたソフトウェアの管理

パッケージをアンイストールする

 インストールしたソフトウェアを完全に削除するのは簡単です。パッケージのディレクトリを削除して、また tinypkg update を実行します。

# rm -rf /opt/hello
# /opt/tinypkg update
Updating: bin lib man info include libruby libperl libpython emacs-lisp 

tinypkg purge にパッケージ名を指定して実行すると同じ結果が得られます。

# /opt/tinypkg purge hello
P hello
Updating: bin lib man info include libruby libperl libpython emacs-lisp 

パッケージ一覧の取得

 インストールされたソフトウェアを表示するには、 tinypkg list を実行します。( ls /opt でも望みの結果が得られるでしょう。)

# /opt/tinypkg list
+ ruby
+ fcgi
+ hello
- ruby-1.8.0

先頭のマークは以下の意味を表します。

'+': 利用可能なパッケージ

そのソフトウェアのコマンド等が利用可能であることを表します。

'-': 一時的に利用不能なパッケージ

そのソフトウェアのコマンド等が一時的に利用不能であることを表します。インストールしたものの、別のソフトウェアと競合するなどの理由で使用したくない場合にこの状態にします。この状態になると、そのソフトウェアのコマンド等にはシンボリックリンクが貼られません。

パッケージを利用不能にする

 あるパッケージを利用不能状態にするには、 tinypkg unavail にパッケージ名(ソフトウェアをインストールしたディレクトリの名前)を指定して実行します。

# /opt/tinypkg unavail hello
- hello
Updating: bin lib man info include libruby libperl libpython emacs-lisp 

利用可能状態に復帰させるには、 tinypkg avail を実行します。

# /opt/tinypkg avail hello
+ hello
Updating: bin lib man info include libruby libperl libpython emacs-lisp 

マージモード

 通常、 tinypackage はパッケージルート直下に .bin や .lib といったディレクトリを作成し、そこにシンボリックリンクを作成します。このディレクトリのコマンドを利用するためには、そこにパスを通すための環境変数を設定します。

 しかし、 CGI などでは実行前に環境変数が一旦クリアされてしまうため、これらのディレクトリにパスが通りません。また、一部のプログラムはセキュリティ上の理由から LD_LIBRARY_PATH などをクリアしてしまいます。

 環境変数によるパスの指定がうまくいかない例があります。 GNU Emacs などは環境変数 EMACSLOADPATH により Emacs Lisp の場所へのパスが指定できますが、これはデフォルトのパスを上書きしてしてしまうという問題があります。(このため、 tinypkg profile は EMACSLOADPATH を設定しません。)

 そこで、既にパスが通っているディレクトリにシンボリックリンクを作成するマージモードという機能を使用します。これを使うと、例えば /usr/bin の中にシンボリックリンクを混ぜることができるので、確実にパスが通ります。もちろん、不要なシンボリックリンクはそこからちゃんと削除されるようになっています。

 では、 /usr/bin にシンボリックリンクを混ぜる例を紹介します。まず、 /opt/.bin を削除してしまいます。そして代わりに、これを /usr/bin へのシンボリックリンクにします。

# rm -rf /opt/.bin
# ln -s /usr/bin /opt/.bin

そして、 tinypkg update を実行します。

# /opt/tinypkg update
Updating: bin lib man info include libruby libperl libpython emacs-lisp 

すると、 /usr/bin の中にシンボリックリンクが作られます。

# ls -l /usr/bin/hello
lrwxrwxrwx    1 root     root           24 Apr 19 01:18 /usr/bin/hello -> /opt/hello/bin/hello*

このシンボリックリンクは hello パッケージを削除するか、 tinypkg clean を実行することで綺麗に取り除かれます。また、既に同じ名前のファイルや tinypackage の管理外のリンクがある場合でも、それを上書きすることはありません。

 もし、すべてのファイルをマージモードで管理したければ以下のようにすると良いでしょう。リンク先はシステムや Ruby,Perl,Python のバージョンなどによって異なります。これは Debian 3.0 (woody) での例です。

# ln -s /usr/bin /opt/.bin
# ln -s /usr/lib /opt/.lib
# ln -s /usr/info /opt/.info
# ln -s /usr/include /opt/.include
# ln -s /usr/lib/ruby/1.6 /opt/.libruby
# ln -s /usr/lib/perl5 /opt/.libperl
# ln -s /usr/lib/python2.1 /opt/.libpython
# ln -s /usr/lib/j2sdk1.3/jre/lib/ext /opt/.libjava
# ln -s /usr/share/emacs/site-lisp /opt/.emacs-lisp

 残念ながら、 /opt/.man に対してだけはマージモードには対応していません。環境変数が使えない場合、 /etc/manpath.config を利用してパスを通す必要があります。これは、セクションやローカライズされた man ページなどを管理するために多少複雑な処理を行っているためです。

処理対象となるファイル

 以下に、現在 tinypackage がシンボリックリンクを作成するファイルの一覧を示します。この一覧に追加して欲しいファイルがあれば tinypkg スクリプトをハックするか、作者に要望を送って下さい。

[共有名]   [パッケージ内の位置]       [備考] 
bin        bin/*, sbin/*              実行ファイル
lib        lib/*                      共有ライブラリ
man        man/*, share/man/*         オンラインマニュアル
info       info/*, share/info/*       info マニュアル
include    include/*                  C 言語のヘッダファイル
libruby    libruby/*                  Ruby スクリプト
libperl    libperl/*                  Perl モジュール
libpython  libpython/*                Python ライブラリ
libjava    libjava/*                  Java クラスライブラリ
emacs-lisp emacs-lisp/*               Emacs Lisp