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

1

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), muito provavelmente por meio da transferência de um tarball. A maioria deles provavelmente são links simbólicos para a versão mais recente, então esses arquivos também devem ser incluídos, e os links simbólicos precisam ser recriados na outra máquina.

Isso tem que ser feito dessa forma porque não há gerenciadores de pacotes na máquina de destino e é em modo seguro (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 o que fazer. Eu tenho que fazer isso por alguns binários, então um one-liner seria ótimo se pudesse ser feito. Alguma idéia?

    
por Drakes 03.10.2016 / 01:30

1 resposta

1

Provavelmente, é melhor determinar em que pacotes essas bibliotecas compartilhadas correspondem e usar 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 improviso, você pode não querer 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 pacote específicas disponíveis).

A coleta das informações do pacote é feita usando rpm -qf para 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 o yum em outra máquina.

Se você distribuir bibliotecas compartilhadas, 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 mesmo pacote usando rpm -ql , por exemplo,

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

Claro que você terá alguns duplicados. 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 caso, rpm -qR ajuda , mas é necessário algum trabalho para ver que você tem os arquivos necessários.

Trabalhando na 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 tar :

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

embora você queira lançar em um estágio com sort -u para filtrar pacotes duplicados. rpm aceitará vários pacotes em algumas linhas, mas não em outras, por isso usei a opção -n 1 apenas para estar seguro (r).

Se, como sugerido, você quer apenas os arquivos da biblioteca, isso pode 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 usando rpm -q fornecerá os links simbólicos para os arquivos. (Em uma verificação rápida com o CentOS6, não há arquivos ldconfig, mas sim muitos arquivos /usr/share que você filtraria).

    
por 03.10.2016 / 01:38

Tags