Могу ли я взять вывод 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 на другой машине.

Если вы 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опцию просто для надежности(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файлов, которые вы бы отфильтровали).

Связанный контент