Posso pegar a saída do ldd e compactar esses arquivos .so?

Posso pegar a saída do ldd e compactar esses arquivos .so?

Estou fazendo isso para obter as dependências dinâmicas do usuário (não aquelas em/lib64, mas em/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 

Eu gostaria de copiar esses arquivos de /usr/lib64 para outra máquina (CentOS para CentOS, compilações quase idênticas), provavelmente por meio da transferência de um tarball. A maioria deles provavelmente são links simbólicos para sua versão mais recente, portanto, esses arquivos também teriam que ser incluídos e os links simbólicos precisariam ser recriados na outra máquina.

Isso tem que ser feito dessa maneira porque não há gerenciadores de pacotes na máquina de destino e ela está em área restrita (sem internet).

Estou pensando que essa lista pode ser transformada em uma única string que pode ser passada para o tar, mas não estou familiarizado com como fazer isso. Eu tenho que fazer isso para alguns binários, então uma linha única seria ótima se pudesse ser feita. Alguma ideia?

Responder1

Provavelmente é melhor você determinar qualpacotesessas bibliotecas compartilhadas correspondem e usam essa lista de pacotes para instalar via yum na segunda máquina. Ao fazer isso, você receberá atualizações quando o yum as encontrar.

De imediato, você podenãoquero fazer isso se:

  • a segunda máquina não tem acesso à rede ou
  • para fins de teste, você deseja duplicar a configuração de uma máquina um pouco desatualizada (onde o yum não tem mais essas versões de pacotes específicas disponíveis).

A coleta das informações do pacote é feita usando rpm -qfpara cada arquivo, por exemplo,

rpm -qf /usr/lib64/libfreebl3.so

que lhe dará o pacote e sua versão — informações suficientes para instalar o mesmo pacote usando yum em outra máquina.

Se você criar bibliotecas compartilhadas, você também deve estar ciente de que elas podem depender de arquivos de configuração (incluindo aqueles que seriam instalados em /etc/ld.so.conf.d). Você pode encontrar os arquivos que fazem parte do mesmopacoteusando rpm -ql, por exemplo,

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

Claro que você terá algumas duplicatas. Além disso, essas bibliotecas podem depender de outros pacotes (com seus próprios arquivos de configuração) que não são aparentes. Nesse casorpm -qR ajuda, mas é necessário algum trabalho para verificar se você tem os arquivos necessários).

Trabalhando a partir da lista de bibliotecas:

ldd Xvfb | grep '/usr/lib64/'

você pode fazer uma lista dos pacotes por

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

e obtenha uma lista correspondente de arquivos

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

e alcatrãoqueacima:

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

embora você possa querer lançar um estágio para sort -ufiltrar pacotes duplicados. rpmaceitará vários pacotes em algumas linhas, mas não em outras, então usei a -n 1opção apenas por segurança (r).

Se, como sugerido, você simplesmente deseja os arquivos da biblioteca, isso poderia ser feito assim:

#!/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)

enquanto a abordagem que sugeri rpm -qfornecerá os links simbólicos para os arquivos. (Em uma verificação rápida com o CentOS6, não há arquivos ldconfig, mas muitos /usr/sharearquivos que você filtraria).

informação relacionada