tar не сохраняет символические ссылки

Вопрос или проблема

Как создать архив, содержащий ссылки и связанные файлы. У меня есть несколько общих библиотек, из которых я хочу создать архив. Вот что я попробовал

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, а затем архивирует все файлы и директории, которые находятся в этой директории. Однако, символьные ссылки могут "разворачиваться" в реальные файлы при архивации.

Решение на примере

Давайте рассмотрим правильный способ создания архива, который будет корректно сохранять символьные ссылки:

  1. Сохранение символических ссылок: Используйте опцию -h (или --dereference), когда нужно архивировать файлы, на которые указывают ссылки, вместо самих ссылок. Но так как вам требуется сохранить именно ссылки, эту опцию использовать не нужно.

  2. Корректная сборка архива:

    • Убедитесь, что ваш 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 позволит избежать распространённых ошибок при создании и развертывании архивов в вашем окружении.

Оцените материал
Добавить комментарий

Капча загружается...