我可以獲取 ldd 輸出並將這些 .so 檔案打包嗎?

我可以獲取 ldd 輸出並將這些 .so 檔案打包嗎?

我這樣做是為了獲取用戶動態依賴項(不是 /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

您可能最好確定哪一個包包這些共用庫對應並使用該軟體包清單透過 yum 在第二台電腦上安裝。透過這樣做,當 yum 找到更新時,您將獲得更新。

順便說一句,你可能不是想要執行此操作,如果:

  • 第二台機器沒有網路存取權限,或者
  • 出於測試目的,您需要為稍微過時的機器(其中 yum 不再提供那些特定的軟體包版本)複製配置。

收集rpm -qf每個文件的包信息,例如,

rpm -qf /usr/lib64/libfreebl3.so

這將為您提供軟體包及其版本 — 足夠的資訊來使用 yum 在另一台電腦上安裝相同的軟體包。

如果您壓縮共享庫,您還應該意識到它們可能依賴於設定檔(包括那些將安裝到 的設定檔/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選項只是為了安全(r)。

如果您按照建議您只需要庫文件,可以這樣做:

#!/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需要過濾掉的文件)。

相關內容