Существуют ли какие-либо файловые системы, для которых `ln -d` преуспевает?


11

С man-страницы для ln :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

Есть ли драйверы файловой системы, которые действительно позволяют это, или это единственный вариант mount --bind <src> <dest>? Или это поведение блокируется ядром еще до того, как оно попадает в драйвер, специфичный для файловой системы?

ПРИМЕЧАНИЕ: я не планирую делать это на каких-либо машинах, просто любопытно.

Ответы:


6

Сначала примечание: lnкоманда не имеет опций , как -d, -F, --directory, это непереносимая GNUism.

Функция, которую вы ищете, реализуется link(1)командой.

Вернуться к исходному вопросу:

В типичной системе UNIX решение о том, возможны ли жесткие ссылки на каталоги, принимается драйвером файловой системы.

Драйвер Solaris UFS поддерживает жесткие ссылки на каталоги, драйвер ZFS - нет.

Причина, по которой UFS в Solaris поддерживает жесткие ссылки, заключается в том, что AT & T заинтересовалась этой возможностью - UFS из BSD не поддерживает жестко связанные каталоги.

Причина, по которой ZFS не поддерживает жестко связанные каталоги, заключается в том, что Джеффу Бонвику не нравится эта функция.

Что касается Linux, я бы предположил, что Linux блокирует попытки создания жестких ссылок на каталоги на верхних уровнях ядра. Причиной такого предположения является то, что Линус Торвальдс написал код для GIT, который уничтожал каталоги, когда git cloneвызывался как root на платформе, которая поддерживает жестко связанные каталоги.

Обратите внимание, что файловая система, которая поддерживает создание жестко связанных каталогов, также должна поддерживать unlink(1)удаление непустых каталогов как корневых.

Поэтому, если мы предположим, что Торвальдс знает, как работает Linux, и если Linux действительно поддерживает жестко связанные каталоги, Торвальдс должен был знать, что вызов unlink(2)каталога, будучи корневым, не вернется с ошибкой, а уничтожит этот каталог. Другими словами, маловероятно, что Linux позволяет драйверу файловой системы реализовывать жестко связанные каталоги.


3

Вопрос ОП упоминает mount --bind. Быстрая проверка показывает, что он не изменяет счетчик ссылок для подключенного каталога. Жесткая ссылка всегда изменяет количество ссылок, которое вы можете увидеть, используя ls -ld.

Обычно (в большинстве Unix-подобных систем) количество жестких ссылок на каталог будет количеством каталогов, связанных с этим именем, например,

  • ".." (родительский каталог)
  • "." (сам каталог)
  • подкаталоги

Если вы прочитаете (обычно) более информативную информационную страницу, вы можете обнаружить, как это сделали другие :

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

хотя в настоящее время он сформулирован

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

Создание (и удаление) жестких ссылок на каталог - это ограниченная функция для защиты от потери файлов, если каталог не связан. Поскольку операции link / unlink на интерфейсе операционной системы C симметричны , связь с каталогами обычно выполняется только в вызовах mkdir / rmdir.

Имейте в виду, что большая часть coreutils GNU была написана (и задокументирована) 20-30 лет назад, когда некоторые настоящие музейные экспонаты еще использовались. Как отмечено в отношении Hard Link , изначально не было вызовов mkdir / rmdir; каталоги были созданы (как привилегированная операция) с использованием жестких ссылок. Все это прошло, когда были добавлены системные вызовы для решения упомянутых проблем. Но документация продолжает ссылаться на эти системы, оставаясь в памяти их сопровождающих. Вариант, который был поставлен под сомнение, был в предшественнике fileutils(который был объединен textutilsи shellutilsв середине 1990-х годов, чтобы сформировать coreutils). Несколько пунктов из журнала изменений могут помочь прояснить происхождение функции:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

Например, вы можете видеть, что одним из антиквариата, для которого эта функция была применима, был SunOS. Соответствующая страница руководства гласила:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

Как отмечено в документации, эта функция (и соответствующая опция отсутствуют в POSIX (и см. Раздел « Обоснование », в котором объясняется, почему). Скорее, эта функция была перемещена в новую команду (также предоставляемую GNU coreutils), которая называется link. Описание сама команда расплывчата, вы должны прочитать описание вызова функции, чтобы получить какое-либо использование от стандарта. Однако стандарт не проясняет условия, в которых будет работать команда, кроме переноса заявления об отказе от требуемых привилегий. Для этого вам нужно перейти к системно-зависимым функциям за пределами стандарта:

Связывание с каталогом ограничено суперпользователем в большинстве исторических реализаций, поскольку эта возможность может создавать петли в файловой иерархии или иным образом повреждать файловую систему. Этот том POSIX.1-2008 продолжает эту философию, запрещая link()и unlink()делая это. Другие функции могут сделать это, если разработчик разработал такое расширение.

Там являются системы , которые используют жесткие ссылки на каталоги за пределами нормального числа (2 плюс подкаталоги).

OSX использует несколько жестких ссылок на каталоги для обычных файлов . Он не поддерживает это использование ln(см. Страницу руководства ). В соответствии с тем, как Time Machine работает в своей магии , он делает это для предоставления версий, используемых для резервного копирования Time Machine.

Дальнейшее чтение:


3
Это, кажется, не отвечает на вопрос вообще.
Майкл Гомер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.