경희대 소융

[운영체제] Virtual File System In Linux

JuniorEinstein 2023. 12. 29. 01:00
728x90

운영체제 수업 시간에 리눅스의 가상 파일을 주제로 발표를 하게 되었다.

"가상"

운영체제를 공부하다 보면 '가상'이라는 표현이 간혹 등장한다. 가상 메모리, 가상 머신 등등. 운영체제에서 '가상'이라는 표현은 실제로 존재하지 않는 공간에 존재하는 객체들을 나타내며, 추상화를 통해 하드웨어에 직접 접근하지 않고 더 편하게 작업들을 처리할 수 있게 도와준다. 가상 파일 시스템(VFS)도 마찬가지이다. 추상화를 통해 운영체제가 혹은 응용프로그램이 직접 물리적 혹은 특별한 파일 시스템에 접근하는 것이 아니라, VFS를 거쳐 안정적이고 일관된 (uniformed way) 방식으로 접근할 수 있게 도와준다.

File System

가상 파일 시스템을 알아보기 전에 파일 시스템을 먼저 알아보자. 파일 시스템 디스크에 파일을 읽고 쓸 수 있게 도와주는 시스템이다. 이 파일 시스템에는 다양한 '포맷'이 존재한다. 외장 하드를 초기화해야 하는 상황을 떠올려보자. 초기화하고자 하는 디스크를 선택하고 '지우기'를 누르면 디스크를 어떤 포맷으로 지울지 선택할 수 있는 창이 나온다. 이 포맷은 다양한 파일 시스템의 한 종류로, 포맷마다 다른 방식으로 물리 디스크에 데이터를 저장하고 관리한다. 윈도우에서는 NTFS, ExFAT 등을 사용하고 맥OS에서는 APFS 등을 사용한다.

그리고 디스크 혹은 디스크의 파티션을 운영체제가 사용할 수 있게 특정 디렉토리와 연결해주는 작업을 '마운트'라고 한다. 우리는 외장하드를 연결하면 자동으로 D 드라이브, G 드라이브(윈도우)에서 외장하드를 사용할 수 있다고 생각하는데, 운영체제가 자동으로 마운트를 도와주기 때문이다. 그리고 D, G와 같이 마운트가 되는 디렉토리를 '마운트 포인트'라고 부른다.

Virtual File System

다른 포맷을 가진 여러 개의 파일 시스템이 마운트 되어 있는 상황을 가정해보자.
마운트된 디스크 : ExFAT, NTFS, EXT4
당신이 만약 응용프로그램이라면 각각의 디스크에서 파일을 불러오는 작업을 어떻게 수행하겠는가?

파일 시스템 마다 다른 방식으로 디스크를 관리하기 때문에 각 디스크 마다 다른 명령어를 사용해 접근해야 한다. 그렇게 되면 응용프로그램을 개발하는 개발자가 각각의 포맷에 따라 파일을 읽고 쓰는 함수들을 일일이 구현해 주어야 한다. 그리고 개발자가 구현하지 않은 포맷의 디스크에서는 데이터를 불러올 수 없을 것이다.

하지만 가상 파일 시스템이 있다면 훨씬 간단하게 서로 다른 디스크에 접근할 수 있다. 가상 파일 시스템 각기 다른 파일 시스템에 접근할 수 있는 일관된 방식(uniformed way)을 제공한다. 응용프로그램이 open(), read(), write() 함수를 호출하면 가상 파일 시스템에서 마운트 되어 있는 디스크의 포맷을 확인해 그에 맞는 명령어를 대신 수행해준다. 이렇게 되면 개발자가 프로그램을 개발할 때 다양한 파일 시스템을 고려하지 않아도 된다.

Other File Systems

가상 파일 시스템을 이용하면 물리적인 파일 시스템 이외에도 다양한 파일 시스템에 같은 방식으로 접근할 수 있다.  아래의 그림에서 볼 수 있듯이 'Network File System'이나 이후 설명할 'Special File System'이 그 예시이다.

Network File System은 한 컴퓨터가 네트워크를 통해 연결된 다른 컴퓨터의 파일 시스템에 접근하는 것이다. 맥북 유저 같은 경우는 두 개의 맥북을 썬더볼트 케이블로 연결하면 Finder에서 연결된 컴퓨터의 파일 시스템에 접근할 수 있는데, 내 컴퓨터에 접근하는 것과 동일한 방식으로 접근할 수 있다. (남의 집 안방을 내 집처럼 드나들 수 있다.) 이것이 가능하게 해주는 것이 바로 '가상 파일 시스템'이다. 기본적으로 내 컴퓨터의 파일 시스템에 접근하는 것과 같은 명령어들을 호출하기 때문에 별도의 설정이나 조작 없이 접근할 수 있게 되는 것이다.

Special File System

리눅스 가상 파일 시스템의 꽃은 역시 'Special File System'이라고 생각한다. Special FIle System리눅스에서 운영체제의 정보, 연결된 디바이스 등을 관리하는 'Special Files'에 접근하는 파일 시스템이다.

리눅스를 좀 사용해보거나 웹 서버를 세팅해본 경험이 있는 사람이라면 리눅스의 Root Directory에 있는 아래 그림의 폴더들을 많이 보았을 것이다. 그림에서 빨간색 네모 박스가 되어 있는 디렉토리들이 바로 Special File System이 관리하는 '가상의 디렉토리'들이다. 가상의 디렉토리인 이유는 Special File들이 물리적 디스크에 존재하는 파일이 아니기 때문이다.

리눅스의 Root Directory

Special File들은 운영체제가 시작되면 메모리 공간에 올라가 있다가, 사용자가 해당 파일을 조회하면 그때 값을 계산하여 사용자에게 보여준다. Special File들을 기본적으로 파일과 같이 관리되기 때문에 일반적인 폴더를 탐색하는 것과 같은 명령어를 사용할 수 있다.

이것이 정말 매력적인 이유는 운영체제와 관련된 수많은 정보들을 우리에게 가장 익숙한 인터페이스로 접근할 수 있다는 것이다. Special File들이 가상 파일 시스템으로 관리되지 않았다면 우리는 운영체제의 정보들을 조회하기 위한 수많은 명령어들을 모두 외워야 했을 것이다. CPU의 정보를 확인하는 명령어를 살펴보자. /proc 폴더 안에 있는 cpuinfo라는 Special File을 일반적인 파일을 조회하는 것과 같이 'cat' 명령어를 통해 읽을 수 있었다.

Virtual File System의 장점

  • 추상화 & 편의성 (Abstract & Convenience)
    • 여러 파일시스템을 쉽고 통일된 방식으로 접근할 수 있다.
    • 시스템과 관련된 정보에 쉽게 접근할 수 있다. (Special File Systems)
  • 유연성 & 이식성 (Flexibility & Portability)
    • 하나의 인터페이스로 다양한 파일시스템을 지원한다.
    • 개발자가 만든 프로그램이 특정 파일시스템에 종속되지 않는다.

Virtual File System의 단점

  • 제한된 표현력
    • 모든 것을 파일로 표현하는 것을 때론 특정 타입의 리소스를 과하게 간단하게(Oversimplify) 표현해버릴 수도 있다.
    • 때문에 항상 직관적이진 않다.
  • 보안 문제
    • 민감한 정보나 시스템 제어와 관련된 메커니즘이 파일 시스템을 통해서 노출될 수도 있다.

 

결론

이렇게 가상 파일 시스템이 무엇인지 간략하게 살펴보았다. 가상 파일 시스템은 다양한 파일 시스템에 접근할 수 있는 하나의 인터페이스를 제공하고 이를 추상화하여 개발자가 다양한 파일 시스템을 직접 고려하지 않게 만들어준다.

실제로 아래의 링크에서 리눅스의 소스코드를 보면 "fs(File System)" 폴더 안에 /proc, /dev 등의 Special File System이 구현되어 있는 것을 볼 수 있다. 그 외에도 실제 exfat, ext4 등등의 파일 시스템들에 접근할 수 있는 명령어들이 있고, 그 명령어들을 가상 파일 시스템의 명령어들에 연결하는 과정도 살펴볼 수 있다.

이렇게 리눅스에서 시스템과 관련된 정보를 파일로 관리하는 것은 'Everything is File'이라는 UNIX 운영체제의 디자인 원칙 때문이라고 한다. GUI 없이 정보들에 접근해야 하는 리눅스 운영체제의 특성상 이런 정보들을 가장 익숙한 방식인 '파일'의 형태로 관리하는 것이 유리하였고, 이를 가상 파일 시스템이라는 추상 레이어를 통해 하나의 인터페이스로 접근할 수 있게 하였다. 나는 가상 파일 시스템을 조사하면서 이런 발상이 정말 기똥차고 멋지다는 생각이 들었었다.

https://github.com/torvalds/linux/tree/master/fs

마치며, 발표자료를 첨부하겠다. 발표자료에는 이 글에서 다루지 않은 가상 파일 시스템을 구현하는 4가지 객체에 대한 설명을 열심히 그린 그림으로 풀어서 설명해 놓았으니, 살펴보면 이해에 도움이 될 것이다. 그럼 이만.

Virtual File System in Linux 한글.pdf
1.15MB

728x90