我可以获取 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需要过滤掉的文件)。

相关内容