디렉토리에 하드 링크가 허용되지 않는 이유는 무엇입니까?


129

우분투 12.04를 사용하고 있습니다. 디렉토리에 대한 하드 링크를 만들려고하면 실패합니다. 파일 시스템 경계 안에있는 파일에 대한 하드 링크를 만들 수 있습니다. 파일 시스템 이외의 파일에 대한 하드 링크를 만들 수없는 이유를 알고 있습니다.

나는이 명령들을 시도했다 :

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

나는 이것의 이유를 알고 싶습니다. 모든 GNU / Linux 배포판 및 Unix 버전 (BSD, Solaris, HP-UX, IBM AIX) 또는 우분투 또는 Linux에서만 동일합니까?



2
시도 ln -F <src> <dst>하면 효과 가있을 수 있습니다. 확실히 이전 버전의 Unix에서 수퍼 유저를 위해 사용되었습니다. 누구나 UCB인지 System V인지 기억하십니까? 그렇습니다. 나쁜 일이 일어날 수 있지만 보통은 그렇지 않습니다. 내가 기억하는 것처럼 rmdir, 하드 링크를 지나서 삭제하는 것을 계속하지 않았다. 그러나 사용자는 혼란스러워 오류가 발생한 것을 삭제할 수 있습니다.
Steve Pitchers

@StevePitchers 어떻게 rmdir특별한 방법으로 하드 링크를 처리 할 수 있습니까? 하드 링크는 일반 링크 일 뿐이지 만 추가 링크입니다. 추가 기록없이 비정상적인 추가 링크가 있는지 여부를 찾는 것은 쉽지 않습니다.
Volker Siegel

1
각 노드는이를 가리키는 하드 링크 수를 저장합니다. 나머지 링크가없는 경우에만 컨텐츠가 해제됩니다. 따라서 rmdir디렉토리에 다른 위치의 링크가 있는지 여부를 알 수 있습니다. rm -r"permission denied"와 같은 오류가 있어도 올바르게 작동하도록 재귀 제거 는주의해서 코딩해야합니다. BTW, UCB = BSD,도!
Steve Pitchers

2
나는 ln -F디렉토리에서 작업했고 그것을 작동시켰다. 그러나 나중에 파일 시스템이 손상 될 우려가 있으므로 디렉토리를 삭제하지 마십시오.
Edward Falk 2016 년

답변:


159

디렉토리 하드 링크는 여러 가지 방법으로 파일 시스템을 손상시킵니다

그들은 당신이 루프를 만들 수 있습니다

디렉토리에 대한 하드 링크는 자신의 부모에 링크 될 수 있으며, 이로 인해 파일 시스템 루프가 생성됩니다. 예를 들어,이 명령은 백 링크로 루프를 만들 수 있습니다 l.

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

디렉토리 루프가있는 파일 시스템의 깊이는 다음과 같습니다.

cd /tmp/a/b/l/b/l/b/l/b/l/b

그러한 디렉토리 구조를 순회 할 때 무한 루프를 피하는 것은 다소 어렵습니다 (예를 들어 POSIX는이 find를 피해야합니다).

이러한 종류의 하드 링크가있는 파일 시스템은 트리가 아닙니다. 트리는 정의상 루프를 포함하지 않아야하기 때문입니다.

부모 디렉토리의 모호함을 깨뜨립니다.

파일 시스템 루프를 사용하면 여러 상위 디렉토리가 존재합니다.

cd /tmp/a/b
cd /tmp/a/b/l/b

첫 번째 경우 /tmp/a는의 상위 디렉토리입니다 /tmp/a/b.
두 번째 경우 /tmp/a/b/l는의 상위 디렉토리이며 /tmp/a/b/l/b와 동일합니다 /tmp/a/b.
따라서 두 개의 상위 디렉토리가 있습니다.

그들은 파일을 곱합니다

심볼릭 링크를 확인한 후 경로로 파일을 식별합니다. 그래서

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

다른 파일입니다.
파일의 추가 경로는 무한히 많습니다. 물론 그들의 inode 수는 동일합니다. 그러나 루프를 명시 적으로 기대하지 않으면 확인할 필요가 없습니다.

디렉토리 하드 링크는 하위 디렉토리 또는 하위 또는 상위가 아닌 디렉토리를 가리킬 수도 있습니다. 이 경우 링크의 하위 인 파일은 두 개의 경로로 식별되는 두 개의 파일로 복제됩니다.

당신의 예

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

그러면 디렉토리에 대한 소프트 링크는 어떻게 작동합니까?

소프트 링크 및 소프트 링크 된 디렉토리 루프를 포함 할 수있는 경로는 종종 파일을 식별하고 열기 위해 사용됩니다. 일반적인 선형 경로로 사용할 수 있습니다.

그러나 경로를 사용하여 파일을 비교할 때 다른 상황이 있습니다. 이 경우 경로의 기호 링크를 먼저 해석하여 최소 로 변환 하고 표준 경로를 작성하는 데 일반적으로 동의합니다 .

소프트 링크는 링크없이 경로로 확장 될 수 있기 때문에 가능합니다. 경로에있는 모든 소프트 링크를 사용하여이 작업을 수행 한 후 나머지 경로는 트리의 일부이며 경로는 항상 명확합니다.

이 명령 readlink은 정식 경로의 경로를 확인할 수 있습니다.

$ readlink -f /some/symlinked/path

소프트 링크는 파일 시스템이 사용하는 것과 다릅니다

소프트 링크는 파일 시스템 내부의 링크와 다르기 때문에 모든 문제를 일으킬 수 없습니다. 하드 링크와 구별 될 수 있으며 필요한 경우 심볼릭 링크가없는 경로로 분석 될 수 있습니다.
어떤 의미에서 심볼릭 링크를 추가해도 기본 파일 시스템 구조가 변경되지는 않지만 유지되지만 응용 프로그램 계층과 같은 더 많은 구조가 추가됩니다.


보낸 사람 man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]

1
소프트 링크가이 모든 것을 할 수없는 이유는 무엇입니까?
Tanay

1
@Tanay 맞아, 확장이 소프트 링크가있는 유사한 경우와 비교하는 데 도움이 될 수 있습니다. 노력하겠습니다.
Volker Siegel

정확히 이것이 디렉토리에만 어떤 관련이 있습니까? 내가 이해하는 방식으로, 이러한 문제는 하드 링크 된 파일의 문제이기도합니다. 또한 하드 링크는 부모 체인 내부를 허용하지 않고도 내부의 다른 사람들을 허용하도록 주어진 디렉토리의 권한을 변경하는 쉬운 방법이라고 생각합니다. 소리 아주 당신이 그룹을 추가 / 수정할 수없는 경우 ... 유용한
inetknght

좋은 대답이지만 ... Apple은 Time Machine의 이러한 문제를 어떻게 해결 했습니까?
Damien

매우 흥미로운 소리! 그러나 나는 그 문제가 무엇인지 전혀 모른다. 힌트를 줄 수 있습니까?
Volker Siegel 2018

77

"어쨌든 일반적으로 하드 링크를 사용해서는 안됩니다"가 너무 광범위합니다. 하드 링크와 심볼릭 링크의 차이점을 이해하고 각각 적절하게 사용해야합니다. 각각 고유의 장단점이 있습니다.

심볼릭 링크는 다음을 수행 할 수 있습니다.

  • 디렉토리를 가리킴
  • 존재하지 않는 객체를 가리킴
  • 동일한 파일 시스템 외부의 파일 및 디렉토리를 가리 킵니다.

하드 링크는 다음을 수행 할 수 있습니다.

  • 참조하는 파일이 삭제되지 않도록 유지

하드 링크는 "쓰기시 복사"응용 프로그램을 수행 할 때 특히 유용합니다. 두 버전 사이에서 변경되는 파일 공간 만 사용하면서 디렉토리 구조의 백업 사본을 유지할 수 있습니다.

cp -al이 점에서 명령 이 특히 유용합니다. 모든 파일이 원본 파일에 대한 하드 링크로 표시되는 디렉토리 구조의 완전한 사본을 만듭니다. 그런 다음 구조에서 파일을 계속 업데이트 할 수 있으며 업데이트 한 파일 만 추가 공간을 차지합니다. 이는 여러 세대의 백업을 유지 관리 할 때 특히 유용합니다.


41
마지막 단락과 관련하여 "복사 된"하드 링크 된 파일을 편집하면 원본 파일도 변경됩니다. unix.stackexchange.com/questions/70531/…
marcin

32
하드 링크에 대한이 설명은 다소 오해의 소지가 있습니다. 기본적으로 하드 링크는 "참조하는 파일이 삭제되지 않도록 유지"한다는 것이 사실이지만 하드 링크의 부작용 일뿐입니다. 하나의 디렉토리에 하드 링크를 작성하고 "원본"파일을 변경 한 다음 하드 링크가 이전 컨텐츠를 가리킬 것으로 예상하는 것은 사실이 아닙니다. 실제로, 하드 링크의 지침은 그것이 링크가 아니라는 것입니다. 최소한 파일을 가리키는 이름 인 원래의 "파일"보다 더 이상은 아닙니다. 하드 링크는 단순히 동일한 파일을 가리키는 다른 이름입니다.
matty

7
백업 아이디어가 좋고 실제로 많이 사용하지만 파일을 변경하면 백업도 변경된다는 경고가 사용자에게 표시됩니다.
Mark

3
도대체 심볼릭 링크는 아무것도 가리킬 필요가 없습니다. ln -s "Don't use this directory" README합법적입니다. 실제로 생각하면 디렉토리를 관계형 데이터베이스로 사용할 수 있으며 실제 파일이 전혀 포함되지 않습니다.
Edward Falk 2016 년

5
-1이 질문에 대한 답변이 아니며 일부 정보가 잘못되었습니다.
wjandrea

43

참고로, mount를 사용하여 디렉토리의 하드 링크와 동일한 것을 얻을 수 있습니다.

mount -t bind /var/www /home/user/workspace/www

대부분의 도구와 프로그램이 바인딩을 인식하지 못 하기 때문에 이것은 매우 위험 합니다 . 한 번 위의 예와 같은 작업을 수행 한 다음로 진행했습니다 rm -rf /home/user. 다행히 관련이 없습니다 /var/www.


6
사용했습니다 mount --bind <src> <dest>. src;)
kachar

1
mount: unknown filesystem type 'bind'
Wizek

4
Busybox에서, 그것은mount -o bind src dest
M :

@MatM은 데비안과 동일
hanshenrik

2
읽기 전용으로 마운트해야하는 경우 마운트 지점에 대한 권한을 설정하고 rm -rf문제를 피할 수 있습니다. superuser.com/questions/320415/…
zanerock

19

하드 링크 디렉토리가 허용되지 않는 이유는 약간 기술적 인 것입니다. 본질적으로 파일 시스템 구조를 손상시킵니다 . 어쨌든 일반적으로 하드 링크를 사용해서는 안됩니다. 기호 링크는 문제를 발생시키지 않고 대부분의 동일한 기능을 허용합니다 (예 :) ln -s target link.


17
하드 링크에는 유용한 사용 사례가 있습니다. 일반적으로 사용하지 말아야한다는 말은 너무 광범위합니다.
샌더 스테판

4
실제로 OP의 질문에 답하는 링크를 제공하는 +2 (및 광산) -1 의견 제공 ( "어쨌든 일반적으로 하드 링크를 사용해서는 안 됨"-지원하는 링크가 있으면 괜찮습니다). 어쨌든 +2를 줄 수 없기 때문에 좋았습니다. ; D
msb

3
"파일 시스템 구조를 손상시킵니다"링크가 작동하지 않습니다.
Charlie Parker

5
답변에 링크의 내용을 요약하고 링크를 참조로 유지하십시오. 이것은 링크 썩음을 피하기위한 스택 교환 모범 사례입니다.
Oxwivi

3
잘했다 @CharlieParker; 최선의 의도하지 않은 : 모든 시대의 아이러니 코멘트를 (?)
Eliran 말카에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.