続・玩式草子 ―戯れせんとや生まれけん―

第6回 Plamoメンテナのすゝめ(余)

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

前回までにmake_PlamoBuild.pyで作成されるPlamoBuildスクリプトを使って,ソースコードからパッケージを作成する流れを紹介してきました。今回は少し視点を変えて,作成したパッケージをインストールする際の処理を紹介します。

パッケージに含まれる不思議なファイル

Plamo Linuxのパッケージは,rpmやdebといったパッケージ用に開発された独自形式ではなく,インストールしたいファイルをtarでまとめ,それを圧縮しただけの簡単な構造になっています。そのためパッケージの中身もtarやlessといった基本コマンドで確認できます。

$ less FD-3.01h-x86_64-B1.txz 
drwxr-xr-x root/root         0 2019-01-26 10:18:54 usr/
drwxr-xr-x root/root         0 2019-01-26 10:18:54 usr/bin/
-rw-r--r-- root/root     46382 2019-01-26 10:18:54 usr/bin/fd-unicd.tbl
-rw-r--r-- root/root     20429 2019-01-26 10:18:54 usr/bin/fd-dict.tbl
-rw-r--r-- root/root     12841 2019-01-26 10:18:54 usr/bin/fd-cat.ja
-rw-r--r-- root/root     12340 2019-01-26 10:18:54 usr/bin/fd-cat.C
-rwxr-xr-x root/root    719488 2019-01-26 10:18:54 usr/bin/fd
hrwxr-xr-x root/root         0 2019-01-26 10:18:54 usr/bin/fdsh usr/bin/fd へのリンク
...

さらにはemacsを使って内部のテキストファイルを直接確認することも可能です。

図1 emacsでzlib-1.2.8-x86_64-P2.txzパッケージを開いたところ

図1 emacsでzlib-1.2.8-x86_64-P2.txzパッケージを開いたところ

こうしていくつかのパッケージを眺めていると,パッケージによってはusr/lib以下にサイズ0のファイルが複数含まれていたり,作った覚えのないinstall/doinst.shというファイルが含まれていたりすることに気づくでしょう。

たとえばzlib-1.2.8パッケージには,"usr/lib/libz.so"と"usr/lib/libz.so.1"というサイズ0のファイルと,"install/doinst.sh"という作成した覚えのないファイルが存在しています。

$ less ~/Srcs/Plamo-7/Plamo-7.x/x86_64/plamo/00_base/zlib-1.2.8-x86_64-P2.txz 
drwxr-xr-x root/root         0 2016-06-15 19:26:04 usr/
drwxr-xr-x root/root         0 2016-06-15 19:26:04 usr/lib/
drwxr-xr-x root/root         0 2016-06-15 19:26:04 usr/lib/pkgconfig/
-rw-r--r-- root/root       252 2016-06-15 19:26:04 usr/lib/pkgconfig/zlib.pc
-rw-r--r-- root/root    144182 2016-06-15 19:26:04 usr/lib/libz.a
-rwxr-xr-x root/root    110976 2016-06-15 19:26:04 usr/lib/libz.so.1.2.8
-rw-r--r-- root/root         0 2016-06-15 09:00:00 usr/lib/libz.so
-rw-r--r-- root/root         0 2016-06-15 09:00:00 usr/lib/libz.so.1
...
drwxr-xr-x root/root         0 2016-06-15 19:26:04 install/
-rw-r--r-- root/root       160 2016-06-15 09:00:00 install/doinst.sh

さて,これらサイズ0のファイルと,作った覚えのないinstall/doinst.shというファイルは,一体どういう役割を果しているのだろうか,というのが今回の話題です。

install/doinst.shスクリプト

謎解き風に話題を展開する筆力もないので先に答を言ってしまうと(苦笑)⁠このinstall/doinst.shというファイルは,パッケージを展開した直後に実行されるシェルスクリプトで,tarアーカイブを展開しただけでは対応できない処理をするために用意されています。

このスクリプトの主な使い道は,tarアーカイブに収めるべきではないシンボリックリンクを復元させることで,PlamoBuildスクリプトや/sbin/makepkgコマンドは,パッケージ化しようとしているディレクトリツリー中にシンボリックリンクを見つけた場合,そのリンクがtarアーカイブ中に含まれないように刈り取って,tarアーカイブを展開後に復元するような操作をinstall/doinst.shに追加します。

シンボリックリンクは,ファイルの実体とは関係ない,ファイル名に対する参照なため,ファイルの実体をまとめるように設計されているtarアーカイブとは相性がよくありません。そのため,昔のbusyboxのようにシンボリックリンクには対応していないtarの実装もありましたし,Linuxで標準のGNU tarでも,バージョンによってシンボリックリンクが既存ファイルを上書きする際の動作が異なっていたことがありました。これらの事情から,Plamo Linux(正確にはその元となったSlackaware Linux)では「パッケージにはシンボリックリンクを含めない」という方針を取っています。

シンボリックリンクをスクリプトに変換する処理は,先に見たzlibパッケージのような共有ライブラリを提供するパッケージでは必須です。というのも,共有ライブラリの場合,libz.so.1.2.8という完全なバージョン番号を含んだライブラリ名から,メジャーバージョン番号のみを含んだlibz.so.1ライブラリ名のみを含んだlibz.soというシンボリックリンクを用意することになっており,共有ライブラリを含むパッケージでは,install/doinst.shスクリプトでそれらシンボリックリンクを再現する必要があるからです。

共有ライブラリは,動的リンクされる際にはメジャーバージョンまでを指定した"libz.so.1"という名前,コンパイル時にリンカから呼び出される際はバージョン番号を略した"libz.so"という名前で参照されます。

そのため,上記zlib-1.2.8パッケージのinstall/doinst.shには,以下のような「同名のファイルがあれば削除してシンボリックリンクを張る」という処理が設定されています。

  1  ( cd usr/lib ; rm -rf libz.so )
  2  ( cd usr/lib ; ln -sf libz.so.1.2.8 libz.so )
  3  ( cd usr/lib ; rm -rf libz.so.1 )
  4  ( cd usr/lib ; ln -sf libz.so.1.2.8 libz.so.1 )

一方,パッケージに含まれるファイルを調べると,"libz.so"と"libz.so.1"はそれぞれサイズが0のファイルになっています。

-rw-r--r-- root/root         0 2016-06-15 09:00:00 usr/lib/libz.so
-rw-r--r-- root/root         0 2016-06-15 09:00:00 usr/lib/libz.so.1

これらサイズが0の,展開はされるもののinstall/doinst.shスクリプトで即座に削除,置き換えられるファイルは,⁠このパッケージにはこういう名前のシンボリックリンクが作成される」ことを示す目印,いわゆる「プレースホルダー」として置かれているわけです。

このシンボリックリンクをスクリプトに変換する処理は,PlamoBuildスクリプトが自動的に行うので,通常は気にする必要ありません。具体的には,makepkgを実行する直前の"convert_links"がそのための処理になっています。

 91  #############################
 92  #   convert symlink to null file and 
 93  #   add "ln -sf" command into install/doinst.sh
 94  ################################
 95    convert_links
 96  
 97    cd $P
 98    /sbin/makepkg ../$pkg.$compress <<EOF

このconvert_linksの実体は,ビルド用の処理をまとめた"/usr/share/plamobuild_functions.sh"に定義されているので,興味ある方は調べてみてください。

なお,convert_linksの処理は,共有ライブラリに限らず,パッケージ化しようとしているディレクトリツリーにある全てのシンボリックリンクに適用されるので,"make install"が作成する以外のリンクも事前に用意しておけばinstall/doinst.shに変換できます。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html