openSUSEでファイルがどのパッケージのものなのか調べる方法
この記事はopenSUSE Advent Calendar 2019の20日目です。
openSUSEのパッケージ管理はYaSTやzypperなどで行うのですが、パッケージそのものはRPMです。ですので、そのRPMパッケージが含んでいるファイルを一覧表示するなどの、rpmのコマンドを利用することができます。
ここでは、次のことををしてみたいと思います。
- パッケージに含まれているファイルの一覧を取得する
- コマンドやファイルがどのパッケージに含まれているかを調べる
(なお、zypperで直接行う方法や、もっとよい方法などがあると思いますので、そういった情報をお持ちの方は是非ご提供ください。)
パッケージに含まれているファイルの一覧を取得する
以下のrpmコマンドで可能です。
$ rpm -ql [パッケージ名]
例:
$ rpm -ql podman
(含まれているファイルのフルパスの一覧)
私は、そのパッケージがどんな設定ファイルを使っているか、また、どこにインストールしているか、などを調べたい時などに使っています。
コマンドやファイルがどのパッケージに含まれているかを調べる
以下のrpmコマンドで可能です。
$ rpm -qf [調べたいファイルやコマンドのフルパス]
例:
$ rpm -qf /usr/bin/podman
podman-1.4.4-lp151.3.6.1.x86_64
ここで、幾つかのコマンドを組み合わせて便利に使ってみましょう。
まず、コマンドのフルパスを取得します。which、typeなどありますが、ここではtypeを使ってみます。
$ type -p podman
/usr/bin/podman
-pオプションで、パス名だけを取得しています。これをrpmコマンドと組み合わせると、次のようになります。
$ rpm -qf $(type -p podman)
podman-1.4.4-lp151.3.6.1.x86_64
これで、rpmのパッケージ名が取得できます。この名前をそのままzypper infoに渡しても識別してくれないので(そんなパッケージは無いと言われてしまうので)、さしあたって、最初の「-(ハイフン)」までの文字を取得してみます。これで「podman」が取得できます。
$ rpm -qf $(type -p podman) | awk -F ‘-‘ ‘{print $1}’
podman
awkはテキストの加工とパターン処理を行ってくれるコマンドです。 -F ‘-‘ で、ハイフンを区切り文字に指定し、 ‘{print $1}’ で、区切られた最初の部分を出力します。
これを、zypper infoに渡せば、zypperでのパッケージ情報を取得できます。
$ zypper info $(rpm -qf $(type -p podman) | awk -F ‘-‘ ‘{print $1}’)
リポジトリのデータを読み込んでいます…
インストール済みのパッケージを読み込んでいます…
パッケージ podman に関する情報:
——————————-
リポジトリ : openSUSE:Leap:15.1:Update
名前 : podman
バージョン : 1.4.4-lp151.3.6.1
アーキテクチャ : x86_64
ベンダ : openSUSE
インストール後のサイズ : 103.1 MiB
インストール済み : はい (y)
状態 : 最新
ソースパッケージ : podman-1.4.4-lp151.3.6.1.src
概要 : Daemon-less container engine for managing containers, pods and images
説明 :
Podman is a container engine for managing pods, containers, and container
images.
It is a standalone tool and it directly manipulates containers without the need
of a container engine daemon.
Podman is able to interact with container images create in buildah, cri-o, and
skopeo, as they all share the same datastore backend.
見事、zypperで情報が取得できました。
見返してみれば、「そもそも、zypper info podmanでよくないか?」と思えますが、コマンド名とパッケージ名が違う場合や、コマンドではなく設定ファイルから情報を引き出したい時などに利用できます。
ただ、間にハイフンが入るパッケージ名では、当然うまく動きませんね・・・typeでパスを取得するためにrootになって、brctlで試してみたのですが、rpmのパッケージ名がbridge-utils-1.6-lp151.2.3.x86_64だったため、ハイフンの前がbridgeとなってしまい、zypper infoで情報を取得できませんでした。まだ改良の余地ありです。
このように、いろいろな方法でrpmコマンドで取得できる情報の活用を試してみて下さい。