이것은 약간 이론적인 질문이지만 사물에 적절한 이름을 사용하는 것이 중요합니다.
UNIX/Linux 파일 시스템에서는 ..
상위 디렉터리를 가리킵니다.
그러나 우리는 알고 있다하드 링크는 디렉터리를 가리킬 수 없습니다., 이는 파일 시스템의 비순환 그래프 구조를 손상시키고 명령이 무한 루프에서 실행될 가능성이 있기 때문입니다.
따라서 이것은 ..
실제로 하드 링크입니다(좋다.
)? 이렇게 하면 디렉토리에 의해 제한되지 않고 모든 목적에 대해 하드 링크처럼 작동하는 특별한 유형의 하드 링크가 됩니다.
아니면 파일 시스템에 하드코딩된 특수 inode 매핑이므로 하드 링크라고 부르면 안 됩니까?
답변1
파일 시스템에 따라 다릅니다. 대부분의 파일 시스템은 전통적인 Unix 디자인을 따릅니다. 여기서 .
및 ..
는 하드 링크입니다. 즉, 파일 시스템의 실제 디렉토리 항목입니다. 디렉토리의 하드 링크 수는 2 + n입니다. 여기서 n은 하위 디렉토리 수, 즉 디렉토리의 상위 디렉토리에 있는 항목, .
디렉토리 자체에 있는 항목 및 각 하위 디렉토리에 있는 항목입니다 ..
. 하드 링크 수는 디렉토리가 생성, 삭제되거나 디렉토리 안팎으로 이동할 때마다 업데이트됩니다. 바라보다무엇인가 추가되기 전에 새 디렉토리의 하드 링크 수가 2인 이유는 무엇입니까?더 자세한 설명을 원하시면.
일부 파일 시스템은 이러한 전통에서 벗어났습니다. 특히BTFS.
우리는 하드 링크가 디렉토리를 가리킬 수 없다는 것을 알고 있습니다.
이는 부정확한 표현입니다. 보다 정확하게는 ln
유틸리티나 시스템 호출 등을 사용하여 link
디렉토리에 대한 하드 링크를 생성 할 수 없습니다 . 커널이 이를 방지하기 때문입니다. 호출은 mkdir
새 디렉터리의 상위 디렉터리에 대한 하드 링크를 생성합니다. 이는 파일 시스템의 디렉터리에 대한 새 하드 링크를 생성하는 유일한 방법입니다. 반대로 디렉터리를 삭제하는 것은 디렉터리에 대한 하드 링크를 제거하는 유일한 방법입니다.
또한 하드 링크가 메인 파일을 "가리키는" 것으로 생각하는 것은 오해의 소지가 있다는 점에 유의하십시오. 심볼릭 링크와 달리 하드 링크는 방향이 지정되지 않습니다. 파일에 여러 개의 하드 링크가 있는 경우 해당 링크는 동일합니다. 다음 순서를 실행한 후:
mkdir a b
touch a/file
ln a/file b/file
파일 시스템의 어떤 것도 b/file
보조 파일 로 만들 수 없습니다 a/file
. 두 디렉토리 항목 모두 동일한 파일을 참조합니다. 그것들은 모두 파일에 대한 하드 링크입니다.
답변2
구현 세부정보입니다.
POSIX 호환 파일 시스템에서는 ..
하드 링크처럼 작동합니다.
그러나 일부 파일 시스템에서는 이를 에뮬레이션만 하고 실제로 디스크에 저장하지 않습니다.
기능적 목적을 위해 파일 시스템이 손상되지 않았다고 가정하면 이러한 구별은 의미가 없습니다. (이렇게 하면 fsck가 이 문제를 해결하도록 설계되었습니다.)
하드 링크를 완전히 에뮬레이트하는 데 있어 POSIX 이외의 오류 중 하나는 하드 링크 수가 디렉토리 내의 올바른 하위 디렉토리 수를 표시하지 못한다는 것입니다. 옵션은 이 링크 수를 사용하여 최적화를 find
비활성화합니다 .-noleaf
답변3
보충제로자일스의 대답나는 다음 단어들에 초점을 맞추고 확장해 볼 가치가 있다고 생각합니다.
또한 하드 링크가 메인 파일을 "가리키는" 것으로 생각하는 것은 오해의 소지가 있다는 점에 유의하십시오.
Linux에서 파일의 개념적 모델을 이해하는 것이 중요합니다.모든디렉터리 내의 이름은 데이터를 가리킬 수 있는 "인덱스 노드"에 대한 "링크"입니다.
여기서 혼란스러운 점은 "하드 링크"와 "기호 링크"의 명명 규칙이 같은 것의 두 가지 맛처럼 들린다는 것입니다. 그들은 그렇지 않습니다!
일반 파일은 다음과 같습니다.
link -> x
| Inode -> Data
"하드 링크 파일"도 다르지 않습니다.
link_a -> x
| Inode -> Data
link_b -> x
그러나 심볼릭 링크는 다음과 같습니다.
original_file_name -> x
| Inode -> Data
sym_link_name -> x
| Inode -> File name "original_file_name"
그렇다면 왜 디렉토리를 하드링크할 수 없습니까?
내가 얻은 가장 좋은 설명은 다음에서 나왔습니다.이것. 항목 ..
은 디렉토리에 남아 있어야 합니다. 디렉터리 자체를 가리키는 단일 이름이 두 개 이상 있는 경우 부모가 여러 개 있을 수 있습니다 ..
. 이는 디렉터리의 다른 모든 가능한 이름이 한 번만 존재할 수 있는 것처럼 한 번만 존재할 수 있기 때문에 불가능합니다 .
답변4
그렇다면 ..은(는) 정말 하드 링크인가요(예:)?
그와 같은 일은 없다물건(목적)을 하드 링크로 사용합니다.
어떤 파일 이름( .
또는 포함 ..
)도 하드 링크가 될 수 없으며, 어떤 파일 이름( .
또는 포함 ..
)도 하드 링크가 아닐 수 있습니다. 하드 링크는 그러한 속성이 아니기 때문입니다.
하드링크는추출둘 이상의 디렉토리 목록 항목이 동일한 객체(inode)를 가리킵니다. 이는 재계산(re-count)의 개념으로, 재계산은 1보다 클 수 있습니다.
실제로 게임의 .
일부로 ..
그들은 항상 다른 곳을 가리키는 개체를 가리킵니다. 즉, 항상 최소 2번의 재검토가 있습니다.