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

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

좋은 Q&A를 보내주셔서 감사합니다.이 페이지, 이제 링크를 이해했습니다. 동일한 인덱스 노드를 다른 이름으로 참조하는 하드 링크가 보이고 복사본은 다른 이름을 가진 다른 "노드"입니다. 또한 소프트 링크는 원래 파일 이름과 경로를 인덱스 노드로 가지므로 파일이 이동되면 링크가 끊어집니다.

그래서 일부 파일(아래 "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? 하지만 파일 이름이 얼마나 많은 공간을 차지하는지 어떻게 알 수 있나요?여기하드링크에는 크기가 없다고 나옵니다. 파일 이름이 원래 파일 이름으로 저장됩니까? 하드 링크의 파일 이름은 어디에 저장됩니까?

답변1

파일은 데이터를 찾을 위치에 대한 포인터 목록이 포함된 메타데이터가 있는 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는 현재 디렉토리에 두 번 연결된 기호 링크 유형의 또 다른 파일입니다. 해당 내용(대상)은 상대 경로 "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. 즉, 파일을 삭제하는 것이 아니라 해당 파일이 참조하는 디렉터리에서 링크를 해제하는 것입니다. 파일은 해당 파일에 대한 항목이 있는 마지막 디렉터리에서 연결이 해제되는 즉시 삭제됩니다(열려 있는 프로세스가 없는 한).

답변2

하드 링크는 기본적으로 원본 파일입니다. 따라서 표시되는 보고서 크기는 연결된 파일의 크기입니다. 이것은부드러운네임스페이스(일종의)만 차지하는 링크입니다.

파일 시스템에 관한 한 하드 링크와 원시 링크는 동일하며 동일한 inode를 가리키므로 보고된 크기도 동일합니다.

관련 정보