Debianでほしいファイルがどのパッケージに含まれるか検索

DebianUbuntu)システムに特定のコマンドやライブラリをインストールしたくても、そのファイルがどのパッケージに含まれているか、わからないときがある。そのようなときには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を知ったのはつい最近。もっと早く知っていれば、パッケージ探しにかけていた時間を短縮できたのにな、と悔やまれる。