무엇인가 추가되기 전에 새 디렉토리의 하드 링크 수가 2인 이유는 무엇입니까?

무엇인가 추가되기 전에 새 디렉토리의 하드 링크 수가 2인 이유는 무엇입니까?

newDirectory 디렉토리를 생성한 다음 ls -ld 명령을 실행한다고 가정합니다. 하드링크 개수는 2개로 확인됩니다. 애초에 하드 링크 2를 정확히 만드는 것은 무엇입니까? 또한 현재 디렉터리의 하위 디렉터리 수는 하드 링크 수 - 2와 동일합니까?

답변1

역사 속, 첫 번째 Unix 파일 시스템은 각 디렉터리에 두 개의 항목을 만들었습니다. .디렉터리 자체를 가리키는 항목과 ..상위 디렉터리를 가리키는 항목입니다. 이는 응용 프로그램과 운영 체제 자체가 파일 시스템을 쉽게 탐색할 수 있는 방법을 제공합니다.

따라서 디렉터리당 링크 수는 2+n입니다. 여기서 n은 하위 디렉터리 수입니다. 링크는 상위 디렉토리에 있는 디렉토리 항목, 디렉토리 자체 .항목 및 ..각 하위 디렉토리에 있는 항목입니다. 예를 들어 다음이 루트의 하위 트리 /parent, 모든 디렉터리 의 내용이라고 가정합니다 .

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

그러면 dir링크 수는 5개입니다. 즉, dir의 항목 /parent, .의 항목, , /parent/dir및 의 항목 각각 3개입니다. 하위 디렉토리가 없으므로 해당 링크 수는 2개입니다(의 항목 및 항목).../parent/dir/sub1/parent/dir/sub2/parent/dir/sub3/parent/dir/sub1sub1/parent/dir./parent/dir/sub1

"적절한" 상위 디렉토리가 없는 루트 디렉토리의 특수한 대소문자 구분을 최소화하기 위해 루트 디렉토리에는 ..자신을 가리키는 항목이 포함됩니다. 따라서 해당 링크 수는 2에 하위 디렉터리 수를 더한 값입니다. 여기서 2는 /.합계 입니다 /...

최신 파일 시스템은 메모리의 상위 디렉토리를 추적하는 경향이 있으며 실제 항목으로 필요하지 않거나 존재하지 않는 경우가 많습니다 .. ..일반적인 최신 UNIX 시스템에서는 ...파일 시스템 유형과 관계없이 파일 시스템 코드의 일부로 특수 값으로 처리됩니다. 일부 파일 시스템에는 디스크에 아무것도 나타나지 않더라도 여전히 항목이 포함되어 있거나 .포함 ..된 척합니다.

파일 시스템 자체에 항목이 포함되어 있더라도 ..커널은 여전히 ​​특수한 경우를 처리해야 합니다. 마운트된 파일 시스템의 루트 디렉터리에서 명명된 항목은 디렉터리 자체를 가리킵니다. 루트 디렉터리가 inode 2인 경우 ..루트 디렉터리의 .및 항목은 ..모두 inode 2를 가리킵니다. 그러나 ..해당 디렉토리에서의 액세스는 실제로 마운트 지점의 상위 디렉토리에 액세스해야 합니다 /. 즉, /media/foo마운트 지점이라고 가정하면 마운트된 파일 시스템이 루트 디렉토리에 있더라도 대신 /media/foo/..지정해야 합니다 . 진입 점은 inode 2를 가리킵니다./media/media/foo../media/foo

.대부분의 파일 시스템은 항목 존재 여부 에 관계없이 여전히 디렉토리의 링크 수를 2+n으로 보고 ..하지만, 이를 수행하지 않고 이 설정을 변경하는 btrfs와 같은 예외가 있습니다.거부됨으로 표시된 아이디어내부에위키피디아.

답변2

하나는 디렉토리 자체용이고 다른 하나는 .디렉토리 내부용입니다.

또한 현재 디렉터리의 하위 디렉터리 수는 하드 링크 수 - 2와 동일합니까?

..이는 각 하위 디렉터리가 하드 링크를 생성하고 그 이상으로는 디렉터리에 대한 하드 링크를 생성할 수 없기 때문에 의미가 있습니다 . 1 그러나 나는 이것이 심각한 것이라고 생각하지 않습니다. 하위 디렉터리를 계산하고 실제 숫자를 얻는 것이 쉽기 때문입니다.

ls얼마나 많은 하위 항목이 있는지 확인하기 위해 출력을 보면 꽤 좋은 아이디어를 얻을 수 있습니다.

1 또는 적어도 사용할 수 없습니다 ln. 프로그래밍 방식으로 시도한 적이 없으며 man 2 link명확하지 않습니다. 일부는 적용될 수 있지만 디렉토리에 연결하는 데는 명백한 문제가 없습니다( EMLINK, EPERM). 따라서 디렉토리에 대해 가능한 유일한 하드 링크는 .등 이라는 표준이 없는 한 .., 나는 하드 링크 수를 임시 단서로만 간주할 것입니다.

답변3

파일 시스템에 따라 다릅니다. BTRFS는 이 규칙을 위반합니다.

# dd if=/dev/zero of=btrfs.img bs=114294784 count=1
1+0 records in
1+0 records out
114294784 bytes (114 MB, 109 MiB) copied, 0.172979 s, 661 MB/s
# mkfs.btrfs btrfs.img 
btrfs-progs v4.20.1 
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               ad5f6c58-ec7a-41db-9d19-ec98db96d725
Node size:          16384
Sector size:        4096
Filesystem size:    109.00MiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP              32.00MiB
  System:           DUP               8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1   109.00MiB  btrfs.img
# mount btrfs.img /mnt
# mkdir -p /mnt/{1,2,3}/{1,2,3}
# find /mnt/ -links 2
# find /mnt/ -links 1
/mnt/
/mnt/1
/mnt/1/1
/mnt/1/2
/mnt/1/3
/mnt/2
/mnt/2/1
/mnt/2/2
/mnt/2/3
/mnt/3
/mnt/3/1
/mnt/3/2
/mnt/3/3

링크 카운터는 BTRFS의 디렉터리에는 의미가 없습니다.

# find /mnt/ -printf '%n %p\n'
1 /mnt/
1 /mnt/1
1 /mnt/1/1
1 /mnt/1/2
1 /mnt/1/3
1 /mnt/2
1 /mnt/2/1
1 /mnt/2/2
1 /mnt/2/3
1 /mnt/3
1 /mnt/3/1
1 /mnt/3/2
1 /mnt/3/3

관련 정보