Разыменование жестких ссылок

22

На странице руководства 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узнать, что файл является жесткой ссылкой? Как это следует за этим?

Что если я не выберу эту опцию? Как это не хард-разыменование?

Musa
источник

Ответы:

24

По умолчанию, если вы указываете tarархивировать файл с жесткими ссылками, и среди архивируемых файлов имеется более одной такой ссылки, он архивирует файл только один раз и записывает вторую (и любые дополнительные имена) как жесткие ссылки. Это означает, что при извлечении этого архива жесткие ссылки будут восстановлены.

Если вы используете --hard-dereferenceопцию, то tarвовсе не сохраняет жесткие ссылки. Вместо этого он рассматривает их как независимые файлы, которые просто имеют одинаковое содержимое и метаданные. Когда вы извлекаете архив, файлы будут независимыми.

Примечание. Он распознает жесткие ссылки, сначала проверив количество ссылок в файле. Он записывает номер устройства и индекс каждого файла с более чем одной ссылкой и использует его для определения того, когда тот же файл снова архивируется. (Когда вы используете --hard-dereference, это не делает.)

CJM
источник
7

Вы можете отличить файл с жесткими ссылками на него от файла, не связанного с жесткой связью, с помощью «количества ссылок». Я вижу два способа получить это из командной строки:

% 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» - это количество ссылок. Обратите внимание, что оба имени файла имеют одинаковый номер инода 932815.

Я уверен, что обе эти команды получают счетчик ссылок из поля st_nlink структуры stat, которое заполняется stat()системным вызовом.

Насколько я могу судить, запуск tarс --hard-dereferenceозначает, что вместо получения одного файла с двумя разными именами файлов (как в примере выше), вы получите два файла, каждый с одним именем файла. tarвероятно, проверяет счетчик ссылок для каждого файла, и по умолчанию при извлечении он создает жесткую ссылку на второе имя файла, которое имеет для данных файла с жесткой привязкой. Когда вызывается при --hard-dereferenceсоздании архива, создается впечатление, что он создает совершенно новый файл для второго имени файла при вызове извлечения tarпрогонов.

Брюс Эдигер
источник
Теперь я понимаю, что «следовать жестким ссылкам» - неправильная формулировка. Спасибо. Но что, если один из двух идентичных файлов не заархивирован? В таких случаях количество ссылок вводит в заблуждение.
Муса
2
Это не «два одинаковых файла», это один файл с двумя именами. Неважно, какой файл tar не архивирует, поскольку они идентичны. По умолчанию tar, вероятно, просто сохраняет какой-то «указатель» от второго имени файла в любом случае, как и файловая система.
Брюс Эдигер