Перенаправлення жорстких посилань


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дізнатися, що файл - це міцне посилання? Як це слідкувати за ним?

Що робити, якщо я не вибираю цей варіант? Як це не важко розпустити?

Відповіді:


24

За замовчуванням, якщо ви скажете tarзаархівувати файл із твердими посиланнями, і більше одного такого посилання включено до файлів, що підлягають архівуванню, він архівує файл лише один раз, а друге (та будь-які додаткові імена) записує як жорсткі посилання. Це означає, що коли витягнете цей архів, жорсткі посилання будуть відновлені.

Якщо ви використовуєте --hard-dereferenceопцію, то tarзовсім НЕ зберігає жорсткі посилання. Натомість він розглядає їх як незалежні файли, які просто мають однаковий вміст та метадані. Коли ви витягуєте архів, файли будуть незалежними.

Примітка. Він розпізнає жорсткі посилання, попередньо перевіривши кількість посилань у файлі. Він записує номер пристрою та inode кожного файлу з більш ніж одним посиланням та використовує це для виявлення, коли той самий файл знову архівується. (Коли ви користуєтесь --hard-dereference, це не робить.)


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, яке заповнюється stat()системним викликом.

Наскільки я можу сказати, працює tarз --hard-dereferenceозначає , що замість того , щоб отримати один файл з двома різними іменами файлів (як в прикладі вище), ви отримаєте два файли, кожен з одним ім'ям. tarймовірно, перевіряє кількість посилань для кожного файлу, і за замовчуванням під час вилучення створюється тверда посилання на друге ім’я файлу для даних жорсткого зв’язку. При --hard-dereferenceвиклику при створенні архіву, як видається, створюється абсолютно новий файл для другого імені файлу, коли tarзапускається вилучення вилучення .


Тепер я розумію, що "слідувати жорсткими посиланнями" - це неправильне формулювання. Дякую. Але що робити, якщо один з двох однакових файлів не архівується? Кількість посилань вводить в оману в таких випадках.
musa

2
Це не "два однакових файли", це один файл з двома іменами. Не має значення, який файл tar не архівує, оскільки вони ідентичні. За замовчуванням tar, мабуть, просто зберігає якийсь "покажчик" від другого імені файлу назад до першого, як і файлова система.
Брюс Едігер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.