Вопрос или проблема
Как создать архив, содержащий ссылки и связанные файлы. У меня есть несколько общих библиотек, из которых я хочу создать архив. Вот что я попробовал
mkdir dest
#abc.so - это ссылка, указывающая на abc.so.1
#abc.so.1 - это ссылка, указывающая на abc.so.1.1
#abc.so.1.1 - это фактический файл
cp /usr/local/lib/abc.so* dest/
tar -czvf dest.tar.gz -C dest/ .
Но получившийся файл dest.tar.gz
перечисляет ссылки и связанные файлы с одинаковым размером и без типа файла l
для ссылок в выводе tar -tvf dest.tar.gz
.
Ответ или решение
Ваша проблема с архивацией символьных ссылок возникает из-за того, что команда tar
по умолчанию не всегда корректно обрабатывает символические ссылки, особенно если они указывают на файлы, находящиеся в другой директории. В вашем случае файлы abc.so
, abc.so.1
и abc.so.1.1
, похоже, не были корректно распознаны как символьные ссылки при упаковке с помощью tar
. Давайте подробно разберем, как правильно упаковывать файлы, включая символические ссылки, чтобы они корректно сохранялись в архиве.
Объяснение
Символические ссылки представляют собой лишь указатели на реальные файлы, они не содержат данных непосредственно, а лишь указывают на путь к файлу, на который ссылаются. Когда при создании архива tar
не сохраняет информацию о том, что определенный файл является символьной ссылкой, это приводит к тому, что в архиве ссылка будет выглядеть как обычный файл с тем же размером, что и её целевой файл.
Основная причина, по которой tar
может неправильно обработать символические ссылки, заключается в том, как команда вызывается. В вашем случае, использование опции -C dest/ .
может быть причиной проблемы. Эта опция изменяет текущую директорию на dest
, а затем архивирует все файлы и директории, которые находятся в этой директории. Однако, символьные ссылки могут "разворачиваться" в реальные файлы при архивации.
Решение на примере
Давайте рассмотрим правильный способ создания архива, который будет корректно сохранять символьные ссылки:
-
Сохранение символических ссылок: Используйте опцию
-h
(или--dereference
), когда нужно архивировать файлы, на которые указывают ссылки, вместо самих ссылок. Но так как вам требуется сохранить именно ссылки, эту опцию использовать не нужно. -
Корректная сборка архива:
- Убедитесь, что ваш
tar
архив делается из директории, где ссылки созданы изначально, и без разворачивания самих ссылок.
- Убедитесь, что ваш
Пример команды, которая должна решить вашу проблему:
tar -czvf dest.tar.gz -C /usr/local/lib abc.so abc.so.1 abc.so.1.1
Здесь мы архивируем все три файла прямо из их исходной директории, что помогает tar
распознать их как символические ссылки.
Применение и заключение
Используя данный подход, вы сможете правильно сохранить символические ссылки в вашем архиве. Чтобы убедиться, что все работает правильно, после создания архива выполните команду для проверки содержимого:
tar -tvf dest.tar.gz
В результате, в списке архива вы должны увидеть символические ссылки, обозначенные буквой l
(например, lrwxrwxrwx
) в начале строки. Ссылки должны показывать на правильные файлы, и указатели должны быть сохранены корректно.
Этот способ упаковки более предпочтителен в случае, если необходимо сохранить структуру и свойства исходных файлов, особенно в контексте библиотек и других файлов, где важно сохранить ссылки для корректной работы программ.
Эта характеристика полезна для бэкапов и перемещения программных пакетов, где важно сохранить целостность и структуру файловой системы, включая символические ссылки, которые могут использоваться в различных сценариях деплоя и конфигурации систем. Понимание и корректное использование возможных опций tar
позволит избежать распространённых ошибок при создании и развертывании архивов в вашем окружении.