파일은 메타 데이터가있는 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
입니다. 즉, 파일을 제거하지 않고 참조 된 디렉토리에서 파일을 링크 해제합니다. 주어진 파일에 대한 항목이있는 마지막 디렉토리에서 링크를 해제하면 해당 파일은 프로세스가없는 한 파기됩니다. 열림).
lstat
크기를 얻는 시스템 호출에 포함 되지 않기 때문 입니다.