Для чего нужен "ln -L" (--logical)?

3034
user36520

Я могу прочитать на странице man ln:

 -L, --logical make hard links to symbolic link references 

Я читал где-то, что ln -Lможет быть использовано для повторного связывания файлов, которые были удалены, но которые все еще открыты, используя /procфайловую систему. Например:

ln -L /proc/1234/fd/12 /tmp/my-file 

Но я получаю ENOENT: нет такого файла или каталога. Если я попытаюсь использовать другую файловую систему, я получу вместо этого Неверную ссылку между устройствами.

Если я не могу использовать ln -Lдля восстановления удаленных файлов, то для чего он может быть использован?

4

2 ответа на вопрос

6
ktf

Ну, немного более дружественный для новичка ответ ...

Некоторые основы заранее

Простое представление о том, как файлы хранятся в системах UNIX / Linux: Есть запись в каталоге, состоящая из имени, которое вы видите с помощью ls -l, и номера Inode (вы можете увидеть с помощью ls -i ). Inode содержит фактическую информацию о том, где ваши данные хранятся в файловой системе (среди прочего, такие как владение, права доступа, дополнительные Inodes при необходимости и т. Д.):

(Время для UTF-8 веселья ... ;-))

Простой вид:

┌─────────────────┐ ┌───────┐ ┌─────────────┐ │ directory entry │ ─► │ Inode │ ─► │ data blocks │ └─────────────────┘ └───────┘ └─────────────┘ 

Теперь о разнице между жесткой и символической ссылкой:

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

  • Жесткие ссылки на один и тот же файл не могут иметь разные права доступа к файлу (так как они хранятся в Inode)
  • Жесткие ссылки должны находиться в одной файловой системе

Расширенный простой вид

 ┌─────────────────┐  │ hard link │ ───────┐ └─────────────────┘ ▼ ┌─────────────────┐ ┌───────┐ ┌─────────────┐ │ example_file │ ─► │ Inode │ ─► │ data blocks │ └─────────────────┘ └───────┘ └─────────────┘ ▲ └───────────────────────┐ │ ┌─────────────────┐ ┌─────────┴──────────┐ │ symbolic link │ ─► │ filename reference │ └─────────────────┘ └────────────────────┘ 

Теперь вернемся к -Lопции с -sотсутствующим: она позволяет вам создать жесткую ссылку на файл, на который указывает символическая ссылка (например, «жесткая ссылка» в приведенном выше примере).

Почему это может помочь восстановить файлы, которые были удалены, но все еще используются открытой программой?

Ну, поведение этого, безусловно, очень зависит от реализации, и ваш пробег может варьироваться на всех платформах UNIX / Linux, но я попытаюсь объяснить, как это может работать:

Когда файл удаляется (скажем, через rm (1) ), системный вызов всегда unlink (2) . Он удаляет запись каталога и уменьшает счетчик ссылок (поддерживаемый в Inode) на единицу.

Если счетчик ссылок достигает нуля, настало время очистить ОС (фактически освободить блоки данных, на которые указывает инод, а затем сам инод. НО, если файл все еще открыт, эту задачу обычно откладывают до тех пор, пока программа не использует инод завершается.

В настоящее время большинство систем UNIX поддерживают /procиерархию файловой системы, в которой можно искать ссылки на открытые файлы, которые (удивительно!) Являются символическими ссылками. Учитывая, что найдена правильная запись, ln -L может помочь воссоздать ссылку на индекс, снова увеличив счетчик ссылок и, таким образом, предотвратить удаление индекса операционной системой (если удачливый пользователь достаточно быстр и программа все еще работает).

Примечание: чтобы это работало, местоположение новой ссылки должно быть в той же файловой системе, в которой находился оригинал!

Последний пример

 ┌─────────────────┐  │ rescue_link │ ───────┐ └─────────────────┘ ▼ ┌─────────────────┐ ┌───────┐ ┌─────────────┐ │ *** removed *** │ │ Inode │ ─► │ data blocks │ └─────────────────┘ └───────┘ └─────────────┘ ▲ └───────────────────────┐ │ ┌─────────────────┐ ┌─────────┴──────────┐ │ /proc/bla/fd/n │ ─► │ filename reference │ └─────────────────┘ └────────────────────┘ 

Заключительные слова

Есть много вещей, которые могут помешать правильному созданию ссылки, и это очень зависит от того, как реализована сама символическая ссылка, и я должен признать: у меня есть серьезные сомнения, что она будет работать со многими вариантами UNIX - но, возможно, волонтер, который хочет потратить некоторое время, чтобы проверить это?

4
reinierpost

Утилиты GNU в основном документированы со infoстраницами. Из ЛУ на страницу GNU :

‘-L’ ‘--logical’ If -s is not in effect, and the source file is a symbolic link, create the hard link to the file referred to by the symbolic link, rather than the symbolic link itself.  

Так что это просто разыменовывает символические ссылки в качестве исходных аргументов.

Похожие вопросы