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

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

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

install/initpkgスクリプト

ソフトウェアの中には,インストール時に「初期化」作業が必要なものがあります。たとえば,新しくフォントをインストールする際には,"fc-cache"コマンドを実行してfontconfigのキャッシュデータを更新する必要がありますし,独自のデータ形式を利用するアプリケーションを追加した場合は,"update-mime-database"や"update-desktop-database"コマンドを実行し,拡張子やファイルの種類とアプリケーションの関連づけデータを更新しなければなりません。

このような「初期化」処理は,手動でソフトウェアをビルド,インストールする際は,ドキュメント等に記載されている手順をそのまま用いて問題ないものの,パッケージに組み込む際には少し考えないといけません。

というのも,パッケージ化したソフトウェアの場合,動作中の環境にインストールする場合(追加インストール)とインストーラから全く新しい環境にインストールする場合(新規インストール)では適用すべき対象が異なり,単純に「インストール後に初期化処理を行う」だけでは通用しなくなるからです。

Plamo Linuxを例にとると,インストーラとして公開しているDVDイメージから起動すると,ramdiskをルートパーティションとするインストール用の最小規模なLinuxシステムが起動します。このインストール用Linuxシステムは,インストール先として指定したHDDパーティションを/mntにマウントし,選択されたパッケージを/mnt以下にインストールしていきます。

このような状況で,⁠インストール後の初期化処理」を単純に実行すると,その処理は,本来適用されるべき/mnt以下の新環境ではなく,電源を落したら消えてしまうramdisk上の環境に適用されてしまいます。

このような問題に対応するため,Plamo Linuxではinitpkgという仕組みを導入して,新規インストールの場合,⁠インストール後の初期化処理」はインストール時ではなく,再起動して新システムを立ちあげた際に実行するようにしています。

initpkgの例としてuimのビルドスクリプトを取りあげてみましょう。uim(Universal Input Method)はさまざまな言語やかな漢字変換エンジンに対応したインプットメソッドで,XfceやMateといったデスクトップ環境の基盤であるGTK2/GTK3にも対応しています。

一方,GTK2/GTK3では,さまざまな言語に柔軟に対応するため,任意の入力メソッドをモジュールとして追加できるようになっているものの,追加した入力メソッドを有効にするには,"gtk-query-immodules"というコマンドを実行する必要があります。

gtk-query-immodulesコマンドは,GTK2/GTK3それぞれに用意されており,GTK2ではgtk-query-immodules-2.0,GTK3ではgtk-query-immodules-3.0という名前になっています。

そのため,uimのビルドスクリプト(PlamoBuild.uim-1.8.6)では,"make install"した後,install/initpkgというファイルへGTK2,GTK3それぞれの環境用に"gtk-query-immodules"を呼び出す処理を書き込んでいます。

 82    make install DESTDIR=$P
 83    mkdir -p $P/install
 84    cat <<"EOF" > $P/install/initpkg
 85  if [ -x /usr/bin/gtk-query-immodules-2.0 ]; then
 86      /usr/bin/gtk-query-immodules-2.0 --update-cache
 87  fi
 88  
 89  if [ -x /usr/bin/gtk-query-immodules-3.0 ]; then
 90      /usr/bin/gtk-query-immodules-3.0 --update-cache
 91  fi
 92  
 93  EOF
 94  

このinstall/initpkgに書き込まれたコードは,makepkgコマンドによってinstall/doinst.shファイルにマージされ,パッケージに取り込まれます。その際,元々のinstall/doinst.shの処理(シンボリックリンクの復元)とは区別できるように,前後に"#%% begin initialize"と"#%% end"の行が挿入されます。

$ cat -n install/doinst.sh
   1  ( cd usr/lib ; rm -rf libgcroots.so.0 )
   2  ( cd usr/lib ; ln -sf libgcroots.so.0.1.0 libgcroots.so.0 )
 ...
 263  ( cd usr/share/uim/pixmaps ; rm -rf m17n-zh-zhuyin.png )
 264  ( cd usr/share/uim/pixmaps ; ln -sf /usr/share/m17n/icons/zh-zhuyin.png m17n-zh-zhuyin.png )
 265  #%% begin initialize 
 266  if [ -x /usr/bin/gtk-query-immodules-2.0 ]; then
 267      /usr/bin/gtk-query-immodules-2.0 --update-cache
 268  fi
 269  
 270  if [ -x /usr/bin/gtk-query-immodules-3.0 ]; then
 271      /usr/bin/gtk-query-immodules-3.0 --update-cache
 272  fi
 273  
 274  #%% end

このパッケージをインストールする際,/sbin/installpkgコマンドは,tarアーカイブを展開後,マージされたinitpkgのコードをinstall/doinst.shから/var/log/initpkg/に移した上で,残りの部分(シンボリックリンクの復元)処理を実行します。

一方,/var/log/initpkg/に切り出された初期化処理は,追加インストールの場合は即座に,新規インストールの場合は再起動して新しい環境が立ち上がった際に,/etc/rc.d/rc.initpkgから実行され,環境に応じた初期化処理を実現します。

実行されたinstall/doinst.shのコードは,/var/log/scripts/に,パッケージ名をファイル名にして保存され(この例では/var/log/scripts/uim)⁠切り出して別途実行された初期化用のコードは/var/log/initpkg.log/に同じくパッケージ名のファイル(/var/log/initpkg.log/uim)として保存されるので,それぞれのパッケージがどのような初期化処理を行ったのかを後から確認することもできます。

/var/log/initpkg/に切り出したパッケージの初期化処理は,正常に実行できるまで/var/log/initpkg/に留まり,システムを起動するたびに再実行が試みられます。あるパッケージをインストールした後,起動時にエラーメッセージが表示され続けるようになった場合は,このディレクトリに何かファイルが残っていないかをチェックしてください。


今回は作成したパッケージをインストールする際に必要となるinstall/doinst.shスクリプトを紹介しました。

もっとも,前半で紹介したシンボリックリンクをスクリプトに変換する処理はPlamoBuildスクリプトが自動的にやってくれますし,後半で紹介したinitpkgの仕組みも「インストール後に必要な初期化処理はinstall/initpkgファイルに記述する」ことだけ覚えておけば,後の処理はmakepkgやinstallpkgといったパッケージ管理ツールがよろしくやってくれるので,通常のパッケージ作りの際にはそれほど気にする必要はありません。

しかしながら,パッケージ作りに慣れてくると,より便利に,より使いやすくなるように,インストール後のシステム環境をあれこれ調整したくなるはずで,その際には,今回紹介したような知識も役に立つことでしょう。ぜひこれらの機能を使いこなして,Plamo Linuxのメンテナにご参加ください。

著者プロフィール

こじまみつひろ

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

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