본문 바로가기

학부_대학원/대학원_학과공부정리

VFS - Virtual File System[1]

SMALL

Unix 시스템을 공부하다 보면, VFS 라는 개념이 나온다.

먼저 VFS가 나오게 된 배경을 알아본다.


하나의 시스템에서 하나의 파일 시스템만 사용하지 않는다.

예를들어서 하나의 hdd를 여러 파티션을 나누어서 사용하는 경우를 생각해보자.


하나의 파티션은 fat 파일시스템, 다른 하나는 ext2 파일 시스템, 나머지는 msdos 파일 시스템으로 나누어서 사용한다고 생각하자.

각 파티션에 TXT AVI IMG 파일을 분산해서 저장 해 놓았다.

이럴 경우 사용자 입장에서 해당 파일에 접근해서 데이터를 읽기 위해서 어떠한 과정이 필요한지 생각해보자.

Passwrod.txt 파일을 가져오기 위해서는 fat 파일 시스템에 맞는 open으로 핸들을 획득하고 그 다음 fat_read 나 fat_write 함수를 사용할 것이다.

Movie.avi 파일의 경우에는 ext2 파일 시스템에 맞는 open, read, write 함수를 사용할 것이다.

현실적으로 이러한 매커니즘으로 파일에 접근한다고 하면, 코딩을 할 때 미치고 팔짝 뛸 노릇일 것이다.

어떠한 파일 시스템에 데이터가 저장되어 있는줄 알고 해당 파일 시스템의 함수를 사용하느냐...

이러한 문제점을 해결하기 위한 방안으로 나온 것이 VFS(Virtual File System) 이다.



개념은 간단하다. 

실제 저장되어 있는 위치에 접근하기 전에 하나의 가상적인 층[VFS]를 거치게 하여서, 특정 파일 시스템에 맞는 함수를 사용하게 하자이다.

예를 들어서 우리가 파일에 접근할 때 open 함수를 사용하는데, 어떠한 파일 시스템에 접근하는지 알 필요 없이 그냥 open으로 접근하고 있다.

이러한 일은 VFS 도움으로 가능한 것이다. 


1.open(Password.txt)

2. VFS 파일 저장 위치의 파일 시스템 확인

3. fat 파일 시스템의 접근 함수 선택하여서 작업

4. 결과 값을 반환


정리하면 다양한 파일 시스템과 소통할 수 있게 하는 통역자 역활이라고 생각하면 편할 것 같다.


VFS가 통역자의 기능을 수행하기 위해서 필요한 4개의 object가 필요하다.


1. super block object

각 연결되어 있는 저장 매체나 파티션의 파일 시스템 당 하나의 super block 객체를 유지한다.

즉, fat, ext2. msdos 파일 시스템이 연결되어 있으면 3개의 super blcok 객체를 유지하는 것이다.

이를 통해서, 자신이 관리하고 있는 파일 시스템들이 무엇인지 파악하고, super block 을 통해서 적절한 행동을 할 수 있다.


2. inode_object

요구된 파일들의 정보를 담기 위해서 필요한 객체이다.

각 파일 시스템에서도 자신이 가지고 있는 파일들의 메타 데이터와 같은 정보를 가진 구조체가 존재 할 것이다.

그러면 VFS 는 inode_object를 통해서 각 파일 시스템에 속해있는 파일들의 정보를 읽어와서 자신의 inode_object에 저장한다.


사용자 요구[password.txt] --> vfs inode_object 생성 --> 요청된 파일이 존재하는 파일시스템[fat]의 정보 요구 및 반환-->

inode_object는 password.txt가 fat 파일 시스템의 어디에 존재하는지 알 수 있음.


3. file_object

task가 파일에 접근하는 요구 사항을 관리하기 위해서 필요하다.

task 1은 2번째 줄의 데이터를 요구하고, task 2는 3번째 3은 1번째 줄을 요구한다고 가정한다.

이 경우 password.txt 파일은 하나 뿐이고 작업하는 내용이 다르기 때문에 task와 연관된 정보를 유지할 필요가 있다.

이를 위해서 존재하는게 file_object이다. 우리가 파일 크기를 구할때, fseek와 같이 file_offset 같은 내용이 저장되어 있다.



4. dentry_object

task가 파일에 접근하기 위해서는 해당 파일의 inode_object를 자신의 task와 연결시켜놓아야 한다.

이때 이러한 연결을 빠르게 연결하기 위해서 사용되는 케시 개념의 entry이다.


뒷 부분에서는 실제 작동 원리를 자세히 보면서 어떠한 부분에서 공격이 이루어 질수 있는지 생각해본다~


출처 : [리눅스 커널 내부구조], book


LIST