방금 Linux 파일 시스템에 대해 조금 읽기 시작했습니다. 나는 이 인용문을 여러 곳에서 찾았습니다.
Unix 디렉토리는 일련의 연관 구조로, 각 구조에는 파일 이름과 inode 번호가 포함되어 있습니다.
그래서 나는 각 디렉토리에 그 아래에 있는 파일 이름이 포함되어 있고 각 파일이 inode에 매핑되어 있다는 것을 알고 싶습니다. 하지만 vim directory_name
우분투에서 이 작업을 수행하면 다음과 같은 결과가 나타납니다.
" ============================================================================
" Netrw Directory Listing (netrw v156)
" /Users/user/workspace/folder
" Sorted by name
" Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:special
" ==============================================================================
../
./
folder1/
folder2/
file1
file2
각 파일 이름 옆에 inode 번호가 있을 것으로 예상하는데, 그렇지 않은 이유는 무엇입니까?
답변1
이 문장은 Unix 파일 시스템이 어떻게 작동하는지에 대한 것입니다(논리적으로 말하면 현재 실제 구조는 종종 매우 다릅니다). 다음 -i
플래그를 사용하여 inode 번호를 볼 수 있습니다 ls
.
$ ls -li
total 8
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw-r--r-- 1 anthony anthony 70 Apr 25 12:07 b
왼쪽의 숫자는 인덱스 노드입니다. 실행하면 ln b c
(하드 링크 생성) 다음이 수행됩니다.
$ ls -li
total 12
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw-r--r-- 2 anthony anthony 70 Apr 25 12:07 b
532540 -rw-r--r-- 2 anthony anthony 70 Apr 25 12:07 c
권한과 크기는 디렉토리가 아닌 inode의 일부입니다. 통과 후 어떤 일이 발생하는지 쉽게 확인할 수 있습니다 chmod 0600 c
.
$ ls -li
total 12
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw------- 2 anthony anthony 70 Apr 25 12:07 b
532540 -rw------- 2 anthony anthony 70 Apr 25 12:07 c
둘 다 동일한 inode를 공유하므로 변경 b
되었습니다 .c
/dev/sda1
그러나 커널은 잘 정의된 API를 통해서만 파일 시스템을 사용자 공간(예: 원시 장치 제외)에 노출합니다 . 링크 생성 및 삭제, 권한 변경, 파일 읽기 및 쓰기, 이름 바꾸기 등과 같은 작업을 수행하기 위해 여러 시스템 호출에 대한 사용자 공간 액세스를 허용합니다. 원래 기본 파일 시스템 데이터 구조를 사용자 공간에 노출하지 않습니다. 여기에는 여러 가지 이유가 있습니다. 즉, 네트워크화된 파일 시스템을 허용합니다. 이는 커널이 권한을 적용하고 파일 시스템 데이터 구조를 올바르게 유지할 수 있음을 의미하며, 이는 사용자 공간을 변경하지 않고도 다른 파일 시스템(다른 데이터 구조 포함)을 사용할 수 있음을 의미합니다.
따라서 기본적으로 vim dir
디렉토리 목록이 표시됩니다. 대략 다음과 같습니다 ls
. Netrw라는 vim 모듈을 통해 수행됩니다. 이 모듈은 위에서 설명한 것과 정확히 일치합니다( :help netrw
vim에서 시도해 보세요). 기본 파일 시스템 데이터 구조는 실제로 편집할 수 없습니다.
답변2
의미상 디렉토리는 파일 이름에서 inode로의 매핑입니다. 이는 애플리케이션과 파일 시스템 간의 인터페이스에 해당하는 디렉토리 트리 추상화가 설계되는 방식입니다. 응용 프로그램은 이름으로 파일을 지정하고 각각 "inode"라는 고유 식별자를 사용하여 디렉터리의 파일 목록을 열거할 수 있습니다.
이 의미 체계가 구현되는 방법은 파일 시스템 유형에 따라 다릅니다. 디렉터리가 인코딩되는 방식은 각 파일 시스템에 따라 다릅니다. 대부분의 Unix 파일 시스템에서 디렉토리는 파일 이름에서 inode 번호로의 매핑이며, inode 번호에서 inode 데이터로 매핑되는 별도의 테이블이 있습니다. (inode 데이터에는 권한, 타임스탬프, 파일 내용 위치 등과 같은 파일 메타데이터가 포함되어 있습니다.) 맵은 목록, 해시 테이블, 트리 등이 될 수 있습니다.
Vim을 사용하여 이 매핑을 볼 수 없습니다. Vim은 디렉터리를 나타내는 저장 영역을 표시하지 않습니다. 다른 많은 최신 Unix 시스템과 마찬가지로 Linux에서는 응용 프로그램이 디렉터리 표현을 직접 볼 수 없습니다. 디렉토리 항목과 메타데이터에 있어서 디렉토리는 일반 파일처럼 작동하지만 내용에 있어서는 그렇지 않습니다. open
, read
, 등과 write
같은 시스템 호출을 통해 일반 파일에서 읽는 응용 프로그램 close
입니다. 디렉토리의 경우 다른 시스템 호출이 있습니다. opendir
, readdir
, closedir
디렉토리 수정은 파일 생성, 이동 및 삭제를 통해 수행됩니다. 이와 같은 응용 프로그램은 , , 를 cat
사용하여 파일의 내용을 읽습니다. 이와 같은 응용 프로그램은 , , 를 사용하여 디렉토리의 내용을 읽습니다. Vim은 일반적으로 파일의 내용을 읽는 것처럼 작동 하지만, 디렉토리를 열도록 요청하면 Vim은 그렇게 작동하며 올바른 형식으로 데이터를 인쇄합니다.open
read
close
ls
opendir
readdir
closedir
cat
ls
디렉토리의 내부 구조를 보려면 debugfs
ext2/ext3/ext4와 같은 도구를 사용할 수 있습니다. 아무것도 수정하지 않았는지 확인하세요! 이와 같은 도구는 debugfs
파일 시스템을 우회하여 완전히 손상시킬 수 있습니다. ext2/ext3/ext4 debugfs
는 명령줄 옵션을 통해 명시적으로 쓰기를 허용하지 않는 한 읽기 전용 모드이므로 안전합니다.
# debugfs /dev/root
debugfs 1.42.12 (29-Aug-2014)
debugfs: dump / /tmp/root.bin
debugfs: quit
# od -t x1 /tmp/root.bin
/
여러 다른 문자 중에서 디렉토리 항목의 이름을 볼 수 있으며 그 중 일부는 인쇄할 수 없습니다. 이를 이해하려면 파일 시스템 형식의 세부 사항을 알아야 합니다.
답변3
나는 당신이 Unix 파일 시스템이 어떻게 작동하는지에 대한 매우 오래된 설명을 읽고 있을 것이라고 생각합니다. 당신이 설명하는 내용은 1970년대 후반에는 사실이었지만 현대 파일 시스템에서는 더 이상 사실이 아닙니다.
많은 최신 플랫폼에는 일반적으로 사용되는 여러 파일 시스템이 있으며 각 파일 시스템은 사용자 공간에서 내부 구조를 숨깁니다. 어떻게 생겼는지 보고 사용할 수 있지만, 특별히 파일 시스템을 디자인하려는 것이 아니라면 이 책의 저자가 너무 자세히 설명하지 않고도 디자인에 대한 기본적인 이해를 제공할 것이라고 신뢰하는 것이 가장 좋습니다(어쨌든 일부는 이러한 세부정보는 다시 필요할 때 최신 정보가 아닙니다.)