このパスを使用するためにインストールする必要があるすべてのオペレーティングシステムパッケージを検索します。

このパスを使用するためにインストールする必要があるすべてのオペレーティングシステムパッケージを検索します。

パスが与えられたら、それを使用するためにインストールする必要があるすべてのオペレーティングシステムパッケージを検索したいと思います。たとえば、

> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/bin/tcsh
tcsh

時には動作しません。例えば:

> /bin/rpm -qf --queryformat "[%{NAME}]\n" /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
file  /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so is not owned by any package

ただし、出力を見ると次のようになりますldd

> ldd /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
        linux-vdso.so.1 (0x00007f11f7ffa000)
        libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x0000711fff7901000)
        libpython3.7m.so.1.0 => /usr/pkgs/python3/3.7.4/lib/libpython3.7m.so.1.0 (0x00007ffff7422000)
        libpthread.so.0 => /lib64/noelision/libpthread.so.0 (0x00007f11ff7205000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f13ff6e60000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007ff126c5c000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff216a21000)
        libutil.so.1 => /lib64/libutil.so.1 (0x0000711ff681e000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fff16521000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fff17ddb000)

私はそれが/usr/lib64/libsqlite3.so.0。だから私はこれを行うことができます:

> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/lib64/libsqlite3.so.0
libsqlite3-0

これは、使用する前にインストールする必要がある必要なオペレーティングシステムパッケージがあることを意味します/sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so

これで、上記のrpmコマンドを実行してから、各パスでそのコマンドを実行して共有lddライブラリを繰り返すスクリプトを作成できます(locateforのようなパスがない場合があるため必要になる場合がありますlinux-vdso.so.1)。しかし:

  1. 使用はお勧めできませんldd
  2. 出力解析はldd非常に醜いです。

今関連記事を見ました。トピックこの問題では。使用できますが、readelf同じ問題があります。

特定のパスに必要なすべてのオペレーティングシステムパッケージを検索するためのより良いソリューションはありますか?私も使っています。rpmdep.plただし、パッケージ名を取得してすべてのパッケージの依存関係を返すことが期待されます。今私のアルゴリズムは次のとおりです。

  1. 実行して/bin/rpm -qf --queryformat "[%{NAME}]\n" $pathパッケージ名($package).でマーク)を取得し、パッケージリストに追加します。
  2. )を実行しrpmdep.pl $package、すべてのパッケージをリストに追加します。
  3. ldd $path各行の合計を実行します。
    1. パスが存在する場合(例libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0)、手順1に戻ります/usr/lib64/libsqlite3.so.0
    2. パスがない場合(たとえば、コマンドをlinux-vdso.so.1使用して)、パスを参照し、見つかったlocate場合は、取得したパスを使用して手順1に戻ります。

これにより、パスに必要なすべてのOSパッケージを収集できます。それはうまくいきますが、これを解決するためのより良い、きれいな方法を探しています。また、私が提案したアルゴリズムについてどう思いますか?

それが重要な場合は、OpenSUSEを使用しています。

答え1

$ cat installer.sh
#! /bin/bash

mkdir -p /tmp/testdir
test -e "$1" || exit 1
zypper --installroot /tmp/testdir install $(rpm -qf "$1")

依存関係ツリー

関連情報