이번 장에서는 파일 시스템을 알아봅시다. 파일 시스템을 이해하는 것은 보다 효과적으로 파일 입출력 작업을 수행할 수 있게 해 줄 것입니다. 그리고 리눅스(유닉스) 시스템을 이해하는 시작점이라 할 수 있습니다.
유닉스 파일 시스템은 4개의 주요 블록으로 구성하고 있습니다. 운영체제를 부팅하기 위해 필요한 부트 블록과 파일 시스템의 크기를 비롯하여 주요 정보를 나타내는 슈퍼블록, 실질적인 파일 정보와 매핑하는 i-node 블록, 마지막으로 실제 데이터를 저장하는 데이터 블록입니다. 이 외에도 파일 시스템에 따라 통계 정보 등을 관리하는 블록이 있습니다.
유닉스 시스템은 파티션마다 독립적인 파일 시스템을 갖습니다. 그리고 최소한 하나 이상의 블록에는 Boot 블록을 갖고 있어야 합니다. 만약 둘 이상의 파티션에 Boot 블록이 있을 때는 첫 번째 파티션에 마스터 부트 블록 레코드(MBR)를 배치하여 어떠한 파티션의 부트 블록을 이용해서 부팅할 것인지 선택할 수 있게 합니다.
슈퍼 블록에는 파일 시스템의 크기와 i-node 블록의 크기와 i-node의 수를 비롯하여 파일 시스템의 중요 정보를 가지고 있습니다. i-node 블록은 i-node로 구성한 리스트입니다. 각 i-node는 실질적인 파일과 1:1 매핑하는 주요 정보를 가지며 파일의 소유자, 소유자 그룹 정보를 비롯하여 파일 접근 권한, 실제 데이터가 있는 위치 정보, 파일의 크기를 비롯하여 파일을 생성, 수정, 접근한 시간 등을 갖고 있습니다. 또한 하나의 파일에 접근할 수 있는 링크를 설정할 수 있기 때문에 참조 개수를 기억합니다. 그리고 파일 종류를 갖고 있습니다.
리눅스 시스템은 i-node 블록의 파일들을 논리적인 트리 구조로 관리합니다. 최상위 노드를 root 디렉토리라고 부르며 /로 나타냅니다.
유닉스 시스템에서는 터미널이나 프린터 등 모든 주변 장치들도 하나의 파일로 취급합니다. 그리고 모든 파일은 소유자, 소유자 그룹 정보를 갖고 있으며 소유자, 소유자 그룹, Other의 접근 권한이 있습니다.
다음은 /dev 디렉토리의 있는 파일의 정보를 ls 명령어를 이용하여 정보를 출력한 예입니다.
$ ls -al /dev
출력 정보의 맨 앞의 하나의 문자는 파일의 종류를 의미합니다. 그리고 9개의 문자는 소유자 쓰기, 읽기, 실행, 소유자 그룹 쓰기, 읽기, 실행, Other 쓰기, 읽기, 실행 권한을 의미합니다.
리눅스 시스템은 터미널과 프린터 등과 같은 주변 장치를 비롯한 모든 장치들도 파일로 관리합니다. 그리고 다음은 파일 종류에 따라 ls -al 명령의 결과로 출력하는 첫번째 문자의 의미입니다.
– : 정규(regrular) 파일
d : 디렉토리(directory) 파일
c : 문자 파일, 터미널 장치 파일
b : 블록 파일, 메모리 장치 파일
p : 파이프
s : 소켓
l : 링크 파일
리눅스 시스템에서는 파일의 종류에 관계없이 파일 I/O에 관한 시스템 호출을 제공하고 있는데 각 장치 파일에 따라 실제 동작하는 파일 Operation을 다루게 정의할 수 있습니다. 각 장치에 따라 동작하는 파일 I/O에 관한 시스템 호출의 구체적인 동작을 정의한 것이 디바이스 드라이버입니다. 이 책에서는 디바이스 드라이버에 관한 사항은 다루지 않을 것입니다.
보다 깊은 시스템 프로그래밍을 하려면 디바이스 드라이버와 커널에 관한 사항도 필요합니다. 여기에서는 리눅스 시스템 프로그래밍을 시작하면서 기본적으로 필요한 사항들만 다룰 것입니다. 그렇지만 특수한 처리를 요구하지 않는 범위의 대부분의 문제는 이 책에 기술한 내용으로 처리할 수 있을 것입니다. 여러분께서는 필요에 의해 다양한 형태의 레퍼런스를 참고하시기 바랍니다.