관리 메뉴

개발자비행일지

파일시스템(File System) 본문

▶ Computer Science

파일시스템(File System)

Cyber0946 2020. 2. 6. 12:09
실습과 그림으로 배우는 리눅스 구조 학습 정리를 위한 내용입니다. 

파일시스템

우리는 컴퓨터 시스템에 파일시스템이 있는 것은 당연한 일이라고 여기며 이것이 의미하는 것이 무엇인지 정확히 인식하지 못할 수 있다.  하지만 파일시스템, 파일이라는 추상화된 개념을 통해서 우리는 데이터를 하나의 객체로 인식하고 고민 없이 쉽게 다룰 수 있어진다. 

저장장치의 기능은 단순화해서 '저장 장치 안에 지정된 주소에 대해 특정 사이즈의 데이터를 읽거나 씀'이다. 예를 들어 128기가 스토리지에 5기가 바이트의 메모리 영역을 50기가 바이트 지점에 씀'을 수행하면 그림과 같이 된다. 

만약 파일 시스템이 없는 상태에서 우리가 아래한글, 원드 등의 오피스 프로그램을 사용하여 문서를 작성하고 저장한다면, 메모리에 있는 문서 데이터를 저장 장치에 저장해야 한다. 

즉, 파일 시스템이 없다면 데이터를 저장할 때, 저장 지점과 크기를 직접적으로 요청해주어야 하며, 읽어 올 때는 해당 데이터가 어느 지점에서 어디까지 저장되어 있는지를 고려해야 한다. 

또한 이와 함께 데이터를 저장하기 위해 빈 영역을 관리할 필요가 있다. 

파일 시스템은 이러한 복잡한 처리를 피하고자 어디에 어느 정도의 데이터가 있는지 , 어디가 빈 영역인지를 관리하는 방법이다. 

파일시스템은 사용자에게 의미가 있는 하나의 데이터를 이름, 위치, 사이즈 등의 보조 정보를 추가하여 파일이라는 단위로 관리한다. 어느 장소에 어떤 파일을 패치할지 등의 데이터 구조는 사양으로 미리 결정된다. 그리고 커널 안에서 파일시스템을 조작할 때, 이 사양으로 바탕으로 하게 된다. 

단순한 파일시스템은 아래의 그림으로 그 기능을 알 수 있으며, 그 사양은 아래와 같다. 

  • 0기가바이트의 지점부터 파일이 리스트를 기록한다. 
  • 하나의 파일에 대해 이름, 장소, 사이즈라는 세 가지 정보를 기록한다.

사용자의 프로세스가 파일의 데이터를 읽기위해 read()를 통해 파일이름과 파일상의 오프셋 및 사이즈를 지정하여 시스템 콜을 보내면 커널에서 파일시스템을 통해 해당하는 데이터를 찾아서 프로세스에게 리턴해 준다. 

이 일련의 과정을 그림으로 확인하면 아래와 같다. 

리눅스의 파일시스템

파일을 카테고리별로 정리할 수 있도록 리눅스의 파일시스템에서는 디렉터리 라고 부르는 파일을 보관하는 특수한 파일이 존재한다. 디렉터리 안에는 일반적인 파일 또는 다른 디렉터리를 보관하는 것이 가능하며 각각 다른 디렉터리 안에 존재한다면 여러 파일이 같은 이름을 가져도 된다. 이러한 방식을 위해 리눅스의 파일 시스템은 아래의 그림과 같은 트리 구조로 구현 되어 있다. 

리눅스가 다루는 파일 시스템은 1개가 아니라 ext4, XFS, Btrfs등 여러 개의 파일 시스템을 다룬다. 그리고 각각의 파일 시스템은 다룰 수 있는 파일의 크기, 파일시스템의 크기, 파일의 처리(파일작성, 삭제, 파일을 읽기 쓰기 등)의 속도가 다르다. 하지만 아래와 같은 공통적인 시스템 콜을 통해 커널로 파일의 처리를 요청한다.  

이러한 시스템 콜을 통해 파일의 데이터가 처리되는 순서는 아래와 같다. 

  • 1. 커널 내으 ㅣ모든 파일시스템의 공통 처리가 동작하고 대상 파일의 파일 시스템을 판별한다. 
  • 2. 각 파일 시스템을 처리하는 프로세스를 호출하여 시스템 콜에 대응되는 처리를 한다.ㅣ 
  • 3. 데이터의 읽기를 하는 경우에는 디바이스 드라이버에 처리를 의뢰한다. 
  • 4. 디바이스 드라이버가 데이터를 읽고 반환한다.

아래의 그림은 파일시스템들이 공통적으로 가지는 인터페이스이다.

데이터와 메타데이터

파일시스템에는 데이터(data)와 메타데이터(metadata)라는 두 종류의 데이터가 있다. 

  • 데이터 : 사용자가 작성한 문서나 사진, 동영상, 프로그램 등의 내용
  • 메타데이터 : 파일의 이름이나 저장 장치 내에 위치 사이즈 등의 보조 정보

메타데이터에서 다루는 정보들

  • 종류 : 데이터를 보관하는 일반 파일인지 아니면 디렉토리 인지 또는 다른 종류의 데이터인지 판별하는 정보
  • 시간정보 : 작성한 시간, 최후에 저근한 시간, 최후에 내용이 변경된 시간 등 
  • 권한정보 : 어느 사용자가 파일에 대해서 어떠한 접근이 가능한지에 대한 정보

용량제한

우리는 시스템을 여러 가지 용도로 사용한다. 하지만 만약 파일시스템에서 사용 용량에 제한을 두지 않는다면 한 가지 프로그램이 파일시스템의 용량을 독점하여 다른 프로그램들이 파일 시스템을 사용하지 못하는 현상이 발생한다. 특히 root 권한으로 동작하는 프로세스가 이용하는 시스템 관리 처리를 위한 용량이 부족하게 되면 시스템의 정상동작이 불가능해 진다.

이러한 상황을 피하기 위해 파일 시스템의 용량을 용도별로 사용할 수 있도록 제한하는 기능이 존재 하며, 이를 쿼터(quota)라고 부른다. 

 

이러한 쿼터에는 다음과 같은 종류가 있다. 

  • 사용자 쿼터 : 파일의 소유자인 사용자별로 용량을 제한하는 것으로 예를 들어 사용자 떄문에 /home이 가득 차게 되는 사태를 방지한다. 
  • 디렉토리 쿼터 : 특정 디렉토리 별로 용량을 제한하는 것으로 예를 들어 프로젝트 멤버가 공유하는 디렉토리에 용량 제한을 걸어둔다. 
  • 서브볼륨 쿼터 : 파일시스템내의 서브 볼륨이라는 단위별 용량을 제한하는 것으로 거의 디렉토리 쿼터와 사용법이 유사하다.