`ln -d`가 성공한 파일 시스템이 있습니까?


11

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 드라이버는 지원하지 않습니다.

Solaris의 UFS가 하드 링크를 지원하는 이유는 AT & T가이 기능에 관심이 있었기 때문입니다. BSD의 UFS는 하드 링크 된 디렉토리를 지원하지 않습니다.

ZFS가 하드 링크 된 디렉토리를 지원하지 않는 이유는 Jeff Bonwick이이 기능을 좋아하지 않기 때문입니다.

Linux와 관련하여 Linux 블록이 상위 커널 계층의 디렉토리에 하드 링크를 만들려고 시도한다고 생각합니다. 이 가정의 이유는 Linus Torvalds git clone가 하드 링크 된 디렉토리를 지원하는 플랫폼에서 루트로 호출 될 때 디렉토리를 파쇄 한 GIT 용 코드를 작성했기 때문입니다 .

하드 링크 된 디렉토리 작성을 지원하는 파일 시스템도 unlink(1)비어 있지 않은 디렉토리를 루트로 제거 하도록 지원해야 합니다.

따라서 Torvalds가 Linux의 작동 방식을 알고 있다고 가정하고 Linux가 하드 링크 된 디렉토리를 지원하는 경우 Torvalds는 unlink(2)루트 인 동안 디렉토리 를 호출 하면 오류가 발생하지 않고 해당 디렉토리를 파쇄한다는 것을 알고 있어야합니다. 다시 말해, Linux가 파일 시스템 드라이버가 하드 링크 된 디렉토리를 구현하도록 허용하지는 않습니다.


3

OP의 질문에 언급되어 mount --bind있습니다. 빠른 검사는 마운트 된 디렉토리의 링크 수를 수정하지 않음을 보여줍니다. 하드 링크는 항상 링크 수를 수정 하며을 사용하여 볼 수 있습니다 ls -ld.

일반적으로 (대부분의 유닉스 계열 시스템) 디렉토리에 대한 하드 링크 수는 해당 이름에 연결된 디렉토리 수입니다.

  • ".." (부모 디렉토리)
  • "." (디렉토리 자체)
  • 하위 디렉토리

(보통) 더 유익한 정보 페이지 를 읽으면 다른 사람들 이 한 것처럼 발견 할 수 있습니다 .

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에서 의무화하지 않습니다.

디렉토리에 대한 하드 링크 작성 및 제거는 디렉토리가 링크 해제 된 경우 파일 손실을 막기위한 제한된 기능입니다. C 운영 체제 인터페이스에서의 링크 / 링크 해제 조작은 대칭 이므로 디렉토리에 대한 링크는 일반적으로 mkdir / rmdir 호출에서만 수행됩니다.

많은 GNU coreutils는 20-30 년 전에 실제 박물관 조각이 여전히 사용 중일 때 쓰여지고 문서화되었다는 것을 명심하십시오. 하드 링크 관련 에서 언급했듯이 원래 mkdir / rmdir 호출 없었습니다. 하드 링크를 사용하여 디렉토리가 특권 작업으로 작성되었습니다. 언급 된 문제를 해결하기 위해 시스템 호출이 추가되면이 모든 것이 사라졌습니다. 그러나 문서는이 시스템을 유지 관리자의 메모리를 지나서 계속 참조합니다. 의문의 여지가있는 옵션은 전임자 fileutils( 1990 년대 중반 textutils과 결합 shellutils하여 형태 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
이것은 전혀 질문에 대답하지 않는 것 같습니다.
Michael Homer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.