Linux는 매핑 폴더 -> file_name -> inode를 어떻게 저장합니까?

Linux는 매핑 폴더 -> file_name -> inode를 어떻게 저장합니까?

방금 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

왼쪽에 있는 숫자가 inode입니다. 그리고 실행하면 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

그러나 커널은 잘 정의된 API를 통해서만 파일 시스템을 사용자 공간에 노출합니다( 와 같은 원시 장치 제외 /dev/sda1). 이는 링크 생성 및 제거, 권한 변경, 파일 읽기 및 쓰기, 이름 바꾸기 등과 같은 작업을 수행하기 위해 여러 syscall에 대한 사용자 공간 액세스를 제공합니다. 원시 기본 파일 시스템 데이터 구조를 사용자 공간에 노출하지 않습니다. 여기에는 여러 가지 이유가 있습니다. 네트워크 파일 시스템을 허용하고, 커널이 권한을 적용하고 파일 시스템 데이터 구조를 올바르게 유지할 수 있으며, 사용자 공간을 변경하지 않고도 다른 파일 시스템(다른 데이터 구조 포함)을 사용할 수 있다는 의미입니다.

따라서 기본적으로 vim dir디렉토리 목록을 보여주는 것뿐입니다. 거의 비슷 ls합니다. 이는 Netrw라는 vim 모듈을 통해 수행됩니다( :help netrwvim에서 시도). 기본 파일 시스템 데이터 구조는 실제로 편집할 수 없습니다.

답변2

디렉토리는 의미상 파일 이름에서 inode로의 매핑입니다. 이는 애플리케이션과 파일 시스템 간의 인터페이스에 해당하는 디렉토리 트리 추상화가 설계된 방식입니다. 응용 프로그램은 이름으로 파일을 지정하고 디렉터리의 파일 목록을 열거할 수 있으며, 각 파일에는 "inode"라는 고유 지정자가 있습니다.

이 의미 체계가 구현되는 방법은 파일 시스템 유형에 따라 다릅니다. 디렉토리가 인코딩되는 방식은 각 파일 시스템에 달려 있습니다. 대부분의 Unix 파일 시스템에서 디렉토리는 파일 이름을 inode 번호로 매핑하며, inode 번호를 inode 데이터로 매핑하는 별도의 테이블이 있습니다. (inode 데이터에는 권한, 타임스탬프, 파일 내용의 위치 등과 같은 파일 메타데이터가 포함되어 있습니다.) 매핑은 목록, 해시 테이블, 트리 등이 될 수 있습니다.

Vim에서는 이 매핑을 볼 수 없습니다. Vim은 디렉터리를 나타내는 저장 영역을 표시하지 않습니다. 다른 많은 최신 Unix 시스템과 마찬가지로 Linux에서는 응용 프로그램이 디렉터리 표현을 직접 볼 수 없습니다. 디렉토리는 디렉토리 항목과 메타데이터에 있어서 일반 파일처럼 작동하지만 내용에 있어서는 그렇지 않습니다. open, read, write, 와 같은 시스템 호출을 사용하여 일반 파일에서 응용 프로그램을 읽습니다 close. 디렉토리에는 다른 시스템 호출( opendir, readdir, )이 있으며 closedir디렉토리 수정은 파일 생성, 이동 및 삭제를 통해 수행됩니다. , , 와 같은 애플리케이션은 cat파일 내용을 읽습니다. , , 와 같은 애플리케이션은 디렉토리 의 내용을 읽습니다. Vim은 일반적으로 파일 내용을 읽는 것처럼 작동 하지만, 디렉토리를 열도록 요청하면 Vim은 다음과 같이 작동 하고 데이터를 올바른 형식으로 인쇄합니다.openreadcloselsopendirreaddirclosedircatls

내부 디렉토리가 어떻게 보이는지 확인하려면 debugfsext2/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년대 후반쯤에는 사실이었겠지만, 현대의 어떤 파일 시스템에서도 더 이상 사실이 아닙니다.

많은 최신 플랫폼에는 일반적으로 사용되는 여러 파일 시스템이 있으며 각 파일 시스템은 사용자 공간에서 내부를 숨깁니다. 그것들이 어떻게 생겼는지 알아보고 가지고 놀 수 있지만, 파일 시스템 설계를 전문으로 하고 싶지 않다면 책의 저자가 디자인에 대한 기본적인 이해를 충분히 제공할 것이라고 신뢰하는 것이 더 나을 것입니다. 너무 많은 세부사항(그 중 일부는 어쨌든 다시 필요할 때 쓸모없게 될 것입니다).

관련 정보