Linux 커널이 파일 시스템을 보는 방식

Linux 커널이 파일 시스템을 보는 방식

저는 여전히 커널과 파일 시스템의 개념이 혼란스럽습니다.

파일 시스템에는 다양한 메모리에 있는 다양한 파일과 디렉터리를 검색하는 데 사용되는 inode 테이블이 포함되어 있습니다.

이 inode 테이블은 커널의 일부입니까? 즉, 커널이 다른 파일 시스템을 마운트하면 inode 테이블이 업데이트됩니까?

아니면 파일 시스템 자체의 일부이고 커널이 드라이버와 inode 테이블 주소를 사용하여 어떻게든 읽습니까?

답변1

커널 소스 코드와 문서에서 "inode"라는 용어를 엉성하게 사용하기 때문에 여기에는 약간의 혼란이 있습니다.

파일 시스템은 메모리의 파일 시스템 코드와 데이터, 디스크의 파일 시스템이라는 두 부분으로 구성되어 있다고 생각할 수 있습니다.

디스크의 파일 시스템은 독립적이며 파일의 모든 비휘발성 데이터와 메타데이터를 포함합니다. 대부분의 Linux 파일 시스템의 경우 여기에는 디스크의 inode와 파일에 대한 기타 메타데이터 및 데이터가 포함됩니다.

그러나 파일 시스템이 마운트되면 파일 시스템 코드는 메모리에서 사용되는 파일의 inode에 대한 캐시된 복사본도 유지합니다. 모든 파일 활동은 inode의 메모리 복사본을 사용하고 업데이트하므로 커널 코드는 실제로 메모리 복사본만 고려하며 대부분의 커널 문서에서는 디스크 inode와 메모리 inode를 구별하지 않습니다. 또한 메모리 내 inode에는 inode의 디스크 복사본에 포함되지 않은 추가 임시 메타데이터(예: 파일의 캐시된 페이지가 메모리 내 어디에 있는지, 파일이 열려 있는 프로세스)도 포함되어 있습니다. 메모리 내 inode는 주기적으로 동기화되어 디스크에 다시 기록됩니다. 커널은 그렇지 않습니다모두메모리 내 inode - 사용 중인 파일과 최근에 사용한 파일의 inode만 해당됩니다. 결국 메모리 내 인덱스 노드가 플러시되고 메모리가 해제됩니다. 디스크의 inode는 항상 존재합니다.

UNIX의 파일 활동은 inode와 밀접하게 연결되어 있으므로 inode를 사용하지 않는 파일 시스템(예: vfat)은 여전히 ​​커널 메모리에 파일 시스템 코드에 의해 동적으로 생성되는 가상 inode를 가지고 있습니다. 이러한 인메모리 가상 inode는 필요에 따라 디스크의 파일 시스템에 동기화되는 파일 메타데이터를 계속 보유합니다.

전통적인 Unix 파일 시스템에서 inode는 파일의 핵심 데이터 구조입니다. 파일 이름은 단지 inode에 대한 포인터일 뿐이며 inode는 여러 파일 이름을 연결할 수 있습니다. inode를 사용하지 않는 다른 파일 시스템에서 파일은 일반적으로 하나의 이름만 가질 수 있으며 메타데이터는 inode가 아닌 파일 이름과 연결됩니다.

답변2

Inode, 여유 블록 등은 파일 시스템 드라이버에 의해 처리됩니다. 이 파일 시스템 코드는 커널에 대한 공통 인터페이스를 제공합니다. 즉, 커널은 이 "사용자 측"에서 조정할 필요 없이 다양한 파일 시스템의 파일에 액세스할 수 있습니다.

그러나 많은 파일 시스템 드라이버도 커널(소스 코드의 별도 영역)에 포함되어 있습니다. 여기에는 ext4 및 기타 Linux 기본 파일 시스템용 드라이버와 논리가 포함됩니다.

두 번째 파일 시스템이 마운트되면 해당 파일 시스템의 또 다른 인스턴스(RAM의 데이터 구조)가 생성되므로 각 디스크 파티션은 서로 별도로 처리됩니다. 두 디스크의 파일 액세스는 동일한 드라이버 코드(예: ext4 파일 시스템의 루틴)를 사용할 수 있지만 데이터는 다릅니다.

파일 시스템 드라이버 자체는 그 아래의 블록 장치 액세스("읽기 블록 17", "쓰기 블록 23")만 필요합니다. 즉, 수정 없이 디스크, 파티션, LUKS 또는 LVM 추상화 계층 등에 배치될 수 있습니다.

관련 정보