이 경로를 사용하기 위해 설치해야 하는 모든 운영 체제 패키지를 검색합니다.

이 경로를 사용하기 위해 설치해야 하는 모든 운영 체제 패키지를 검색합니다.

경로가 주어지면 이를 사용하기 위해 설치해야 하는 모든 운영 체제 패키지를 검색하고 싶습니다. 예를 들어:

> /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")

종속성 트리

관련 정보