ubuntu at u-aizu

.debパッケージを改造して依存関係を直す

Ubuntuにソフトウェアをインストールするとき、必ずといっていいほど必要になるのが、ソフトウェアパッケージである、拡張子が.debのファイル(.debパッケージ)である。
通常、これらのパッケージは依存関係を満たされるように作られており、インストールに際にそれがチェックされるようになっているので、問題になることはまずないのだが、困ったことに、例えばUbuntuのディストリビューションによっては、すでにメンテナンスが終了しているパッケージを依存関係上要求するような古い.debパッケージが存在する場合もある。
このような場合には、.debパッケージ内に存在するファイルを取り出し、依存関係を書き直して、再度パッケージにまとめた上でインストールするという手段を取ることで逃げることが可能な場合がある。もちろん、この場合には、依存関係を修正してもソフトウェアが正常に動く、ということがわかっていることが前提である。
例えば、libxml(バージョン1)を要求するパッケージの場合、Ubuntu 12.04ではすでにこのメンテナンスが終わっているため、libxml2に依存関係を書き直すことで、インストール、及び動作する可能性が高くなる。
この.debパッケージの依存関係を書き直す方法は以下の通りである。

(1) 問題となっている.debファイルを改造するための作業領域のディレクトリを作る。ここではtmpというディレクトリを作ることにする。

mkdir tmp
作成が完了したら、このディレクトリに問題となる.debパッケージを移しておく。また、自分自身もこのディレクトリに移動する。
なお、後ほどパッケージを変更するので、オリジナルのパッケージを別の名前でコピーしておくとよい。

(2) この.debパッケージをarというツールで展開する。arはtarの原型のようなツールで、使い方も似ている。

ar x package.deb
この作業によって、debian-binary, data.tar.gz, control.tar.gzという3つのファイルがtmpディレクトリに作成される。

(3) .debパッケージ内で依存関係を記したcontrolsというファイルは、control.tar.gz内に存在するので、さらにこの書庫を展開する。
まずは下準備として、control.tar.gzを展開するためにさらにディレクトリを1つ作る。ここではtmp2としよう。

mkdir tmp2
このディレクトリに移った上で、control.tar.gzの中身をここに展開する。
tar zxf ../control.tar.gz

(4) tmp2内にcontrolsというファイルが存在することを確かめる。ここに、依存関係が記されている。
ここで、置き換えるべきパッケージ名がわかっていたら、それを一斉に置換してあげればよい。例えば、sedを使うのであれば、

sed -i 's/oldpackage/newpackage/g'
としてもよいし、geditやemacsなどのエディタを使って、置換機能で編集してもよい(個人的にはエディタの使用をおすすめする)。

(5) 編集が終了したら、まず、古いcontrol.tar.gzを削除する。

rm ../control.tar.gz

(6) 編集したファイルで改めてcontrol.tar.gzを作成する。作成場所を1つ上のディレクトリ(tmp直下)にしておくと便利である。

tar zcf ../control.tar.gz *

(7) あとは改めて、新しく作成されたcontrol.tar.gzを使って、.debファイルを作成すればよい。
3つのファイルから改めてパッケージを新しく作るのであれば、

ar c package.deb debian-binary data.tar.gz control.tar.gz
control.tar.gzだけ変更しているので、それだけを置き換えるのであれば、
ar r package.deb control.tar.gz
となる。こうやって作成されたパッケージファイルは、もとのパッケージと名前を変えておくとよいだろう。

(8) 以上でパッケージ作成は完了だが、あとは作業に使ったtmpディレクトリをまるごと削除し、きれいに「掃除」することが必要である。

rm -fr tmp

参考: Ubuntu Forums: http://ubuntuforums.org/showthread.php?t=1427098

トップへ戻る