내가 이해한 바로는 Linux는 inode 테이블을 사용하여 디스크에서 파일을 찾습니다. Linux 파일 시스템은 inode 테이블을 메모리에 유지합니까? ext2, ext3, ext4에 관계없이 동일합니까?
이것을 설명하는 좋은 참고 자료를 아는 사람이 있습니까?
답변1
이 내용은 이미 여기에서 다루었습니다.파일 테이블이 파일 시스템에 있습니까, 아니면 메모리에 있습니까?
꽤 철저한 것 같습니다. 하지만 여전히 좋은 질문입니다. 보시다시피, 이 질문은 실제로 귀하의 질문이 암시하는 것보다 더 구체적입니다.
http://140.120.7.21/LinuxKernel/LinuxKernel/node17.html다음은 동일한 질문을 다루는 것으로 보이는 더 기술적인 설명입니다. 동일한 답변으로 올바르게 읽으면 메모리와 디스크에 다른 유형의 inode 테이블이 있습니다. 이것은 2008년의 일이지만, 적어도 ext 파일 시스템에서는 별로 변한 것이 없는 것 같지만 확실하지는 않습니다.
이전 커널 설명은 실제로 꽤 좋습니다.
일반 파일은 이름이 첨부되지 않은 일부 물리적 장치에 저장된 일련의 데이터 바이트입니다. 소유자, 권한, 크기, 시간 등과 같은 파일 관리 정보는 파일의 inode 구조에 저장됩니다. 파일 시스템의 모든 inode가 함께 수집되어 inode 테이블을 형성합니다. 각 파일 시스템은 하나의 논리 디스크를 차지합니다. 커널은 논리 디스크의 $2^{nd}$ 블록부터 시작하여 파일 시스템의 inode 테이블을 인접한 디스크 블록에 저장합니다. 각 inode(inode 테이블의 항목)는 파일에 대한 다음 정보를 저장하기 위해 시스템에서 사용하는 데이터 구조입니다.
....
마지막으로 Linux 소스 트리(include/linux/fs.h)에 정의된 inode 구조가 있습니다. 이것은 메모리에 로드된 inode 구조인 In-Core inode입니다. 이 코어 내 inode가 로드되면 관련 디스크 inode 정보가 관련 필드에 채워집니다.
답변2
Linux(및 실제로 다른 Unix)에는 다음이 필요하지 않습니다.인덱스 노드디스크에서 파일 찾기,찾기 작업단지 필요하다디렉토리 항목( dentry
), 즉 경로의 경우 /foo/bar
찾기 루틴은 "foo" 디렉터리에 있는 "bar" 디렉터리 항목에 액세스해야 합니다.
Linux 커널에는 디렉토리 항목 캐시라고 하는 디렉토리 항목 캐싱을 위한 교차 파일 시스템 계층이 있습니다.데이터 캐시요컨대. 그러나 inode
객체에 대한 포인터도 유지합니다. 커널 문서에 설명되어 있습니다.파일 시스템/vfs.txt:
VFS는
open(2)
,stat(2)
,chmod(2)
및 유사한 시스템 호출을 구현합니다. VFS는 전달된 경로 이름 매개변수를 사용하여 디렉토리 항목 캐시(dentry 캐시 또는 dcache라고도 함)를 검색합니다. 이는 번역을 위한 매우 빠른 조회 메커니즘을 제공합니다.경로명(파일 이름) 콘크리트로디렉토리 항목. 디렉토리 항목은 RAM에 존재하며 디스크에 저장되지 않습니다. 성능을 위해서만 존재합니다.dentry 캐시는 전체 파일 공간을 보기 위한 것입니다. 대부분의 컴퓨터는 모든 디렉토리 항목을 동시에 RAM에 넣을 수 없기 때문에 캐시의 일부 비트가 손실됩니다. dentry에 대한 경로 이름을 확인하기 위해 VFS는 도중에 dentry를 생성한 다음 inode를 로드해야 할 수도 있습니다. 이는 인덱스 노드를 조회하여 수행됩니다.
답변3
일반적으로 Linux는 파일이 열릴 때만 메모리에 inode를 로드합니다. 파일이 닫힌 후 데이터는 캐싱 논리를 통해 디스크에 플러시되거나 사용되지 않은 것으로 표시되기 전까지 일정 기간 동안 메모리에 업데이트된 형식으로 남아 있을 수 있습니다.
특정 파일을 반복적으로 열고 닫는 것은 파일 시스템을 자주 사용하는 패턴입니다. 이후에 다시 열 때 inode를 다시 읽지 않으면 효율성이 향상될 수 있습니다.
신뢰할 수 있는 참조는 Linux 커널 소스 코드입니다. 소스 트리의 소스/문서 디렉토리에는 찾고 있는 세부 정보가 포함되어 있지만 소스 코드와 일치하도록 완전히 업데이트되지 않을 수 있습니다.