![Разыменование жестких ссылок](https://rvso.com/image/23933/%D0%A0%D0%B0%D0%B7%D1%8B%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B6%D0%B5%D1%81%D1%82%D0%BA%D0%B8%D1%85%20%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA.png)
На странице руководства tar
команды указана опция перехода по жестким ссылкам.
-h, --dereference
follow symlinks; archive and dump the files they point to
--hard-dereference
follow hard links; archive and dump the files they refer to
Как tar
узнать, что файл является жесткой ссылкой?следоватьэто?
А что если я не выберу эту опцию? Как этонетжесткое разыменование?
решение1
По умолчанию, если вы указываете tar
архивировать файл с жесткими ссылками, и среди файлов, которые нужно архивировать, есть более одной такой ссылки, файл архивируется только один раз и второе (и любые дополнительные имена) записывается как жесткие ссылки. Это означает, что при извлечении этого архива жесткие ссылки будут восстановлены.
Если вы используете эту --hard-dereference
опцию, то tar
делает ли этонетсохранить жесткие ссылки. Вместо этого он обрабатывает их как независимые файлы, которые просто имеют одинаковое содержимое и метаданные. Когда вы извлекаете архив, файлы будут независимыми.
Примечание: он распознает жесткие ссылки, сначала проверяя количество ссылок файла. Он записывает номер устройства и индексный дескриптор каждого файла с более чем одной ссылкой и использует это для обнаружения повторной архивации того же файла. (Когда вы используете --hard-dereference
, он этого не делает.)
решение2
Вы можете отличить файл с жесткой ссылкой(ями) на него от файла без жесткой ссылки с помощью "счётчика ссылок". Я вижу два способа получить это из командной строки:
% stat original
File: ‘original’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 804h/2052d Inode: 932815 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 500/ bediger) Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
Birth: -
Или
1010 % ls -li
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary
Одинокая цифра '2' перед "bediger" — это счетчик ссылок. Обратите внимание, что оба имени файла имеют одинаковый номер inode, 932815.
Я уверен, что обе эти команды получают количество ссылок из поля st_nlink структуры struct stat, которое заполняется stat()
системным вызовом.
Насколько я могу судить, запуск tar
with --hard-dereference
означает, что вместо получения одного файла с двумя разными именами (как в примере выше) вы получаете два файла, каждый с одним именем. tar
вероятно, проверяет количество ссылок на каждый файл, и по умолчанию при извлечении создает жесткую ссылку на второе имя файла, которое у него есть для жестко связанных данных файла. При вызове with --hard-dereference
при создании архива, похоже, создается совершенно новый файл для второго имени файла, когда запускается вызов извлечения tar
.