ldd 出力を取得して、それらの .so ファイルを tarball にすることはできますか?

ldd 出力を取得して、それらの .so ファイルを tarball にすることはできますか?

これは、ユーザーの動的依存関係 (/lib64 ではなく、/usr/lib64 にあるもの) を取得するために行っています。

[root@localhost bin]# ldd Xvfb | grep '/usr/lib64/' | cut -d '=' -f1
    libcrypto.so.10 
    libGL.so.1 
    libpixman-1.so.0 
    libXfont.so.1 
    libXau.so.6 
    libxshmfence.so.1 
    libXdmcp.so.6 
    libglapi.so.0 
    libXext.so.6 
    libXdamage.so.1 
    libXfixes.so.3 
    libX11-xcb.so.1 
    libX11.so.6 
    libxcb-glx.so.0 
    libxcb-dri2.so.0 
    libxcb.so.1 
    libXxf86vm.so.1 
    libdrm.so.2 
    libfreetype.so.6 
    libfontenc.so.1 
    libfreebl3.so 

これらのファイルを /usr/lib64 から別のマシン (CentOS から CentOS、ほぼ同一のビルド) にコピーしたいと思っています。おそらく tarball を転送することになると思います。これらのほとんどは最新バージョンへのシンボリック リンクであるため、それらのファイルも含める必要があり、シンボリック リンクを他のマシンで再作成する必要があります。

ターゲット マシンにパッケージ マネージャーがなく、サンドボックス化されている (インターネットがない) ため、この方法を実行する必要があります。

このリストを tar に渡すことができる単一の文字列に変換できると考えていますが、その方法についてはよくわかりません。いくつかのバイナリに対してこれを実行する必要があるため、ワンライナーで実行できれば便利です。何かアイデアはありますか?

答え1

どちらを選ぶか決めた方が良いでしょうパッケージこれらの共有ライブラリは対応しており、そのパッケージのリストを使用して、2 番目のマシンで yum 経由でインストールします。これにより、yum が更新を見つけたときに更新が取得されます。

すぐに思いつくのはない次の場合にこれを実行したい:

  • 2台目のマシンにネットワークアクセスがない、または
  • テストの目的で、少し古いマシン (yum で特定のパッケージ バージョンが利用できなくなったマシン) の設定を複製する必要があります。

パッケージ情報の収集はrpm -qf、各ファイルに対して次のように行われます。

rpm -qf /usr/lib64/libfreebl3.so

これにより、パッケージとそのバージョンが提供されます。これは、別のマシンで yum を使用して同じパッケージをインストールするのに十分な情報です。

共有ライブラリをtarで圧縮する場合、それらが設定ファイル(にインストールされるものを含む/etc/ld.so.conf.d)に依存する可能性があることにも注意する必要があります。同じパッケージ使用rpm -ql例:

rpm -ql $(rpm -qf /usr/lib64/libfreebl3.so)

もちろん、重複するライブラリもいくつかあります。また、それらのライブラリは、他のパッケージ(独自の設定ファイルを持つ)に依存している可能性がありますが、これは明らかではありません。この場合、rpm -qR 役立つただし、必要なファイルが揃っているかどうかを確認するには、多少の作業が必要です。

ライブラリのリストから作業する:

ldd Xvfb | grep '/usr/lib64/'

パッケージのリストを作成するには

ldd Xvfb | grep '/usr/lib64/' | xargs rpm -qf

対応するファイルのリストを取得します

ldd Xvfb | grep '/usr/lib64/' | xargs -n 1 rpm -qf | xargs -n 1 rpm -ql

タールそれ上:

tar czf /tmp/blob.tar.gz $(ldd Xvfb | grep '/usr/lib64/' | xargs -n 1 rpm -qf | xargs -n 1 rpm -ql)

sort -uただし、重複するパッケージを除外するために 、 をステージに追加することもできます。 はrpm、一部の行では複数のパッケージを受け入れますが、他の行では受け入れないため、-n 1安全のためにオプションを使用しました。

提案されているように、単にライブラリ ファイルが必要な場合は、次のように実行できます。

#!/bin/sh
mkdir  /tmp/xvfb
cd /usr/lib64
tar czf /tmp/xvfb/Xvfb.tar.gz $(ldd /usr/bin/Xvfb | grep '/usr/lib64/' | cut -d '=' -f1 | awk '{print $1}' | while read IN; do OUT=`readlink $IN`; cp -rf $OUT /tmp/xvfb/$IN; echo /tmp/xvfb/$IN; done)

一方、私が提案したアプローチではrpm -q、ファイルのシンボリック リンクが提供されます。(CentOS6 で簡単に確認したところ、ldconfig ファイルはありませんが、/usr/shareフィルターで除外するファイルは多数あります)。

関連情報