Linux VFS(Virtual File System)

  크악 리눅스 VFS에 대해서 적다가 다 날라갔다 엉엉엉. 뭐, 하늘에서 더 요약하라는 뜻인가라고 생각하자.

 

 간단하게 말하면, 리눅스에는 여러가지 다른 파일 시스템을 이용하는 데, 각각의 파일 시스템 안에 있는 파일에 접근하는 방법은 파일 시스템 마다 다 틀리다. 예를 들어 FAT 은 Fat Table 을 이용하고 Ext2/3는 inode (일종의 BTree)방식이고,  이걸 비유하자면, 하나의 클래스가 비슷한 동작을 하는 다른 클래스와 통신하는데, Interface 로 통신하지 않고 Concrete 클래스와 통신한다고 생각하면 된다. 그리고 그 클래스 수가 무지 많다.

 

즉, 코드 자체가 interface 라면 filesystem_interface->Read 형태면 되는걸

 

if( filesystem_type == EXT2 )

  Ext2FileSystem->Read(…)

else if( filesystem_type == FAT )

 FatFileSystem->Read(…)

 

이런식으로 늘어난다는 것이다. 그래서 VFS 라는 추상화 파일 시스템 계층이 들어간것이다.

최초의 VFS는 (썬의 SunOS에 들어갔다고 한다. 1986년)

 

사용자 삽입 이미지 

 

 VFS 에서는 공통 파일 모델(Common File Model)을 이용한다. 즉 이게 Interface 인것이다. 두둥!!!

 

즉, 리눅스 등에서 파일시스템을 추가할려면 이 VFS에 맞춰서 만들어주는 것이 필요하다.

VFS의 공통 파일 모델은 다음과 같은 4개의 핵심 객체 타입을 가진다.

 

  •  Super Block 개체

    • 마운트 된 파일 시스템에 대한 정보를 저장한다. 실제로 Ext2 등에는 슈퍼 블럭이라는 게 있다. 그런데 FAT 같은건 이런 부분이 없으므로 추가적으로 정보를 담도록 구현해줘야한다.
  • Inode 객체

    • 특정 파일에 대한 정보를 닮고 있다. 파일 시스템 내에 있는 파일의 유일한 식별자 등으로 보면된다.
  • 파일 객체

    • 열린 파일과 프로세스 사이의 상호 작용과 관련한 정보를 저장한다. 이 정보는 각 프로세스가 열린 파일을 가지고 있는 동안 커널 메모리에만 존재한다. 즉, 디스크로 저장되어 있는 부분에는 없다는 얘기다.
  • 디엔트리 객체

    • 디렉토리 항목과 이에 대응하는 파일의 연결에 대한 정보를 저장한다.

 

각각의 개체에 대한 자세한 내용은 리눅스 커널의 이해 12장 가상 파일 시스템 부분을 참고하자.