하드 링크가 원본과 동일한 공간을 차지하는 이유는 무엇입니까?


14

여기 와이 페이지 주변의 좋은 Q & A 덕분에 이제 링크를 이해합니다. 하드 링크가 다른 이름으로 동일한 inode를 참조하고 사본이 다른 "노드이며 다른 이름을 갖습니다. 또한 소프트 링크는 원래 파일 이름과 경로를 inode로 사용하므로 파일이 이동하면 링크가 끊어집니다.

그래서 나는 내가 배운 것을 일부 파일 (아래의 "saluton_mondo.cpp")로 테스트하여 단단하고 부드러운 링크와 복사본을 만들었습니다.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

그러나 하드 링크는 원본 및 논리적으로 사본의 크기와 동일합니다. 하드 링크와 원본이 동일한 inode를 공유하고 데이터가 있고 파일 이름 만 다른 경우 하드 링크가 205 바이트 대신 이름의 공간 만 차지해서는 안됩니까? 아니면 원래 파일의 크기가 ls -lh반환됩니까? 그렇다면 파일 이름이 어떤 공간을 차지하는지 어떻게 알 수 있습니까? 여기서 하드 링크는 크기가 없다고 말합니다. 파일 이름이 원래 파일 이름과 함께 유지됩니까? 하드 링크의 파일 이름은 어디에 저장됩니까?

답변:


16

파일은 메타 데이터가있는 inode이며, 그 사이에 데이터를 찾을 수있는 포인터 목록이 있습니다.

파일에 액세스하려면 파일 을 디렉토리 (폴더가 아닌 전화 디렉토리로 생각)에 링크 해야합니다. 즉, 하나 이상의 항목을 하나 이상의 디렉토리에 추가하여 이름 을 해당 파일과 연관시킵니다 .

모든 해당 링크와 해당 파일 이름은 동일한 파일을 가리 킵니다. 원본과 링크 인 것은 없습니다. 이들은 디렉토리 트리에서 동일한 파일 (동일한 inode)에 대한 액세스 지점입니다. 파일 크기 ( lstat시스템 호출)를 가져 오면 inode에 저장된 정보 (위에서 언급 한 메타 데이터)를 검색하는 것입니다. 파일 이름, 해당 파일을 참조하기 위해 사용하는 링크는 중요하지 않습니다. .

반대로 심볼릭 링크는 내용이 대상 파일 의 경로 인 다른 파일 (다른 inode)입니다 . 다른 파일과 마찬가지로 해당 심볼릭 링크는 디렉토리에 연결되어 있어야하며 (이름이 있어야 함) 액세스 할 수 있습니다. 심볼릭 링크에 대한 여러 링크를 가질 수도 있습니다. 즉, 심볼릭 링크에는 여러 이름 (하나 이상의 디렉토리에 있음)을 지정할 수 있습니다.

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

파일 번호 10486707 위에는 일반 파일이 있습니다. 현재 디렉토리에있는 두 개의 항목 (하나는 name a, 하나는 name b)에 연결됩니다. 링크 수가 2 이므로 현재 디렉토리 나 다른 디렉토리에 해당 파일의 다른 이름이 없다는 것을 알고 있습니다. 파일 번호 10502404는 다른 파일이며, 이번에는 symlink 유형의 파일이 현재 디렉토리에 두 번 링크되었습니다. 내용 (대상)은 상대 경로 "a"입니다.

10502404가 현재 디렉토리가 아닌 다른 디렉토리에 링크 된 경우, 일반적으로 액세스 방법에 따라 다른 파일을 가리 킵니다.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

파일은 링크 된 디렉토리 이외의 다른 이름과 연관되어 있지 않습니다. 이름에 의해 사용 된 공간은 해당 디렉토리의 항목이며 디렉토리의 파일 크기 / 디스크 사용에 설명됩니다.

파일을 제거하기위한 시스템 호출은 unlink입니다. 즉, 파일을 제거하지 않고 참조 된 디렉토리에서 파일을 링크 해제합니다. 주어진 파일에 대한 항목이있는 마지막 디렉토리에서 링크를 해제하면 해당 파일은 프로세스가없는 한 파기됩니다. 열림).


아 ... 이제 알겠습니다. 따라서 "hi"라는 파일과 "ajhĝjdmjefsjmksgskgjkmŝŭna"라는 정확한 사본은 정확히 동일한 공간을 차지합니다. 이름은 lstat크기를 얻는 시스템 호출에 포함 되지 않기 때문 입니다.
JMCF125 16:27에

@ JMCF125, 예. 이름으로 취한 크기는 해당 디렉토리의 항목이며 디렉토리의 파일 크기로 설명됩니다.
Stéphane Chazelas

감사. 답변에 포함시킬 수 있습니까? 잠깐, 먼저 질문을 명확하게하겠습니다.
JMCF125 16:27에

5

하드 링크는 기본적으로 원본 파일입니다. 따라서보고되는 크기는 링크되는 파일의 크기입니다. 그것은이다 부드러운 그들의 이름 (좀)의 공간을 차지 링크.

파일 시스템과 관련하여 하드 링크와 원본은 동일한 것이므로 동일한 inode를 가리 키므로 동일한 크기가보고됩니다.


그러나 하드 링크의 이름은 공간을 차지해야합니다. 맞습니까?
JMCF125

아래의 @stephan의 답변을 참조하십시오.
terdon

2
@ JMCF125 네,하지만 그 공간은 디렉토리 안에 있습니다. 충분한 파일을 만들면 디렉토리 크기가 커지는 것을 알 수 있습니다. 파일 크기에는 이름과 같은 메타 데이터가 포함되지 않습니다.
Gilles 'SO- 악마 그만'

@Gilles, 감사합니다. 그러나 @Stephane은 이미 해당 정보로 그의 답변을 업데이트했습니다. 또한 이제는 더 잘 생각 /합니다. 마치 마치 마치 마치 마치 마치 마치 마치 cd ..안에 /머물러 있어야 /합니다.
JMCF125
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.