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

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

На странице руководства 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()системным вызовом.

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

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