Debianでほしいファイルがどのパッケージに含まれるか検索
Debian(Ubuntu)システムに特定のコマンドやライブラリをインストールしたくても、そのファイルがどのパッケージに含まれているか、わからないときがある。そのようなときにはapt-fileというコマンドが使える。
apt-file
apt-fileはDebianシステム固有のコマンドで、特定のファイルがどのパッケージに含まれているか検索したり、特定のパッケージによりインストールされるファイル群をリスト表示する。同じようなことはdpkgコマンドでもできるが、dpkgではインストールされているパッケージのみ対象とする。apt-fileではインストールされていないパッケージやファイルも対象とした検索が行える。というわけで、これを使えば簡単にほしいコマンドを探し出してインストールできる。
使い方は簡単。serchサブコマンドに探したいファイル名を与えればよい。
$ apt-file search ファイル名
ただし、aptitudeと同様に、updateコマンドで定期的にデータベースを更新する必要がある。
$ sudo apt-file update
例: killall
Debian Sargeまでは最小構成インストールをしてもkillallは入ったけど、Etchからは入らなくなった。killallをインストールするパッケージを調べたい場合は次のように実行。
$ apt-file search killall
いくつか候補が出てくるが、明らかに違うと思われるパッケージは除外して、「aptitude show パッケージ名」でパッケージについて調べてインストールすることになる。また、killallが/usr/bin/killallにインストールされることがわかっていれば、次のように検索できる。
$ apt-file search usr/bin/killall psmisc: usr/bin/killall systemimager-boot-i386-standard: usr/share/systemimager/boot/i386/standard/initrd_template/usr/bin/killall systemimager-boot-ia64-standard: usr/share/systemimager/boot/ia64/standard/initrd_template/usr/bin/killall
killallはpsmiscパッケージに入っていることがわかる。
例: Java Swingアプリの実行に必須なX11ライブラリ
先日の日記で書いたAspectJをインストールするとき、VMware内のDebianにはX11関連のパッケージを一切入れてなかったため、X11のライブラリもインストールすることになったんだ。そこでもapt-fileを利用した。具体的には、AspectJのインストーラを起動し、発生した例外メッセージの中からライブラリ名を見つけ、apt-fileでそのライブラリを含むパッケージを捜し出しインストールした。
まず、X11ライブラリが入っていないため、インストーラを実行しても次のようなエラーが発生する。
$ java -jar aspectj-1.6.1.jar Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/stow/jdk1.6.0_04/jre/lib/i386/xawt/libmawt.so: libXext.so.6: cannot open shared object file: No such file or directory at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1647) at java.lang.Runtime.load0(Runtime.java:770) at java.lang.System.load(System.java:1005) at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1668) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1030) at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50) at java.security.AccessController.doPrivileged(Native Method) at sun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:38) at sun.awt.DebugHelper.<clinit>(DebugHelper.java:29) at java.awt.Component.<clinit>(Component.java:552) at $installer$.org.aspectj.Installer.runGUI(Main.java:491) at $installer$.org.aspectj.Main.main(Main.java:148)
例外メッセージには「libXext.so.6」がないと書かれている。そこで、apt-fileを使ってlibXext.so.6をインストールするパッケージを捜し出す。
$ apt-file search libXext.so libxext-dev: usr/lib/libXext.so libxext6: usr/lib/libXext.so.6 libxext6: usr/lib/libXext.so.6.4.0 libxext6-dbg: usr/lib/debug/usr/lib/libXext.so.6.4.0 lsb-build-base2: usr/lib/lsb2/libXext.so lsb-build-base3: usr/lib/lsb3/libXext.so
aptitude showなども駆使して、libxext6をインストールすればよいとわかったので、これをインストール。
これをインストーラ起動時に例外が発生しなくなるまで繰り返す。
結局以下の3つのパッケージをインストールすることになった。実際には依存関係を満たすために、合計8個のパッケージがインストールされたけど、手動で入れたのはこの3つ。
- libxext6
- libxtst6
- libxi6
まとめ
Debianはかれこれ5年ほどしようしているけど、apt-fileを知ったのはつい最近。もっと早く知っていれば、パッケージ探しにかけていた時間を短縮できたのにな、と悔やまれる。