본문 바로가기

개발/리눅스 프로그래밍

유닉스 파일 시스템

출처 : 아주대학교 시스템 소프트웨어 보안 강의자료

/*
 * 공부한거 정리하는거라 틀린게 있을 수도 있어요...
 * 내용에 틀린게 있으면 알려주세요!!
*/

  유닉스 시스템의 가장 중요한 특징중 하나는 파일 시스템이다. 유닉스 파일 시스템은 수직적 구조, access control 등의 특징이 있지만 이번 포스팅에선 프로그래밍에서 파일을 사용하기 위해 파일 관련 시스템 호출 구조와 주로 사용하는 함수에 대해 정리한다.

File Descriptor Table

  유닉스의 프로세스는 각각 파일 디스크립터 테이블을 갖는다. 테이블에는 각 파일의 플래그와 시스템 파일 테이블의 위치 정보가 저장된다. 파일 디스크립터 테이블의 인덱스를 파일 디스크립터라고 한다. 파일 디스크립터는 0부터 시작하는 정수인데 0은 표준입력, 1은 표준출력, 2는 표준에러로 사용된다. 그래서 파일을 열면 일반적으로 3이상의 파일 디스크립터 값을 받는다.

System File Table

  유닉스 커널엔 사용중인 모든 파일에 대한 정보를 가진 시스템 파일 테이블이 있다. 파일 디스크립테 테이블에서 참조하는 내용이 이것이다. 이 테이블에는 파일의 상태 flag와 작업offset, refCnt, incore inode table의 위치가 저장된다. 

  두 프로세스에서 같은 파일을 연다고 가정하자. 그럼 시스템 파일 테이블엔 두 개의 엔트리를 생성한다. 하지만 동일한 파일이기 때문에 두 엔트리는 하나의 아이노드를 참조하게 된다. 이를 file sharing이라 한다.

Incore INODE Table

  Incore INODE Table도 커널에 위치하는데, 테이블에는 아이노드가 저장된다. 아이노드는 파일 시스템의 기본 단위이다. 아이노드는 구조체로 이루어져 있는데 파일의 모드, 소유자, 크기과 같은 파일에 대한 정보가 저장된다. 또한 커널에서는 아이노드를 통해서 디스크에 저장된 파일에 접근하기 때문에 디바이스와 디스크 주소 또한 아이노드에 저장된다. 즉, 파일 시스템에 접근하기 위한 마지막 단계이다. 이 과정을 그림으로 나타내면 다음과 같다.

  그림에서처럼 파일 시스템에서 프로세스에 데이터를 줄 때엔 버퍼 캐시를 사용해 바로 줄 수 있다.