파일 시스템
파일 시스템은 저장 장치에서 데이터를 조직화하는 소프트웨어입니다. 파일 시스템은 사용자와 저장 관리의 두 가지 관점에서 볼 수 있습니다.
사용자의 관점에서의 파일 시스템
사용자 관점에서의 파일 시스템은 어떻게 사용자에게 파일 시스템을 보여줄 것인가에 초점을 맞춥니다. 파일, 디렉토리, 속성, 그리고 연산이 사용자에게 어떻게 표시되는지에 대한 인터페이스를 제공합니다. 일반적으로 트리 구조로 데이터를 조직화합니다.
저장 관리의 관점에서의 파일 시스템
저장 관리 관점에서의 파일 시스템은 논리적인 파일 시스템을 실제 저장 장치에 어떻게 매핑할 것인가에 대한 구현을 다룹니다. 저장 장치의 레이아웃, 데이터 구조, 알고리즘 등을 이해하는 것이 필요합니다.
파일 시스템의 목표
파일 시스템의 주된 목표는 데이터를 신뢰성 있게, 효과적으로, 그리고 편리하게 저장, 검색, 공유하는 것입니다.
파일 개념
파일은 관련 정보의 명명된 집합입니다. 파일은 단순히 바이트의 연속이며, 보조 저장 장치에 저장됩니다. 파일은 데이터 파일과 프로그램 파일로 나눌 수 있습니다. 데이터 파일은 사용자가 생성하는 문서, 이미지, 비디오 등의 데이터를 저장하며, 프로그램 파일은 실행 가능한 프로그램 또는 프로그램 데이터를 포함합니다.
파일 속성
파일을 관리하기 위한 속성들이 있습니다:
이름: 사람이 읽을 수 있는 형태로 유지되는 유일한 정보입니다.
식별자: 파일 시스템 내에서 파일을 식별하는 고유 태그(번호)입니다.
유형: 정규 파일, 디렉토리, 심볼릭 링크, 명명된 파이프 등의 유형이 있습니다.
위치: 장치 내에서 파일 위치를 가리키는 포인터입니다.
크기: 현재 파일의 크기입니다.
보호: 읽기, 쓰기, 실행 권한을 설정합니다.
시간, 날짜, 사용자 식별: 파일의 마지막 수정 시간, 생성 날짜, 그리고 파일의 소유자 정보 등을 포함합니다.
디렉토리
Unix의 디렉토리 구조를 예로 들면, 디렉토리 항목은 파일 이름과 inode 번호를 포함하고, inode는 속성과 파일 데이터에 대한 포인터를 가집니다.
디렉토리에서 수행할 수 있는 연산들에는 다음과 같은 것들이 있습니다:
트리 구조 디렉토리
비순환 그래프 디렉토리
하나의 파일(또는 하위 디렉토리)이 두 개의 다른 디렉토리에 존재할 수 있습니다. 이런 경우에는 파일 시스템을 순회하거나 파일을 삭제하는 데 문제가 발생할 수 있습니다.
예를 들어, Kim이 X라는 파일을 가지고 있고, Lee가 자신의 디렉토리 아래에 동일한 X를 가져야 하는 상황을 생각해봅시다. 이런 경우 UNIX에서는 Lee의 디렉토리에 "링크"를 생성합니다. 이 링크에는 두 가지 형태가 있습니다.
하드 링크: X의 메타데이터를 Lee의 디렉토리로 복사합니다. 만약 X를 삭제한다면 어떻게 될까요? 이럴 때는 참조 횟수를 사용합니다. 하드 링크가 참조하는 원본 파일이 삭제되더라도, 참조 횟수가 0이 될 때까지 해당 파일은 계속 유지됩니다. 이로써, 하드 링크를 통해 여전히 파일에 접근할 수 있게 됩니다.
심볼릭 링크(또는 소프트 링크): X의 경로명을 Lee의 디렉토리에 생성합니다. 심볼릭 링크는 원본 파일을 가리키는 경로를 저장하므로 원본 파일의 위치나 이름이 변경되더라도 영향을 받지 않습니다. 하지만 만약 X를 삭제한다면 어떻게 될까요? 이 경우 "댕글링 참조"가 발생합니다. 원본 파일이 삭제되면 심볼릭 링크는 더 이상 유효한 대상을 가리키지 않게 되는데, 이를 댕글링 참조라고 합니다. 이런 경우 심볼릭 링크를 따라갈 때 오류가 발생하게 됩니다.
따라서 하드 링크와 심볼릭 링크는 모두 파일이나 디렉토리를 공유할 수 있게 해주지만, 원본이 삭제되거나 변경될 때 처리 방식이 다릅니다.
파일 시스템 마운팅은 운영체제에게 파일 시스템이 사용 준비가 되었음을 알리고, 그것을 시스템의 파일 시스템 계층 구조에서 특정 포인트(마운트 포인트)와 연결하는 과정입니다.
마운트는 일종의 '부착'을 의미하는데, 이를 통해 우리는 여러 저장 장치들을 하나의 파일 시스템 구조 안에서 접근 가능하게 만들 수 있습니다.
예를 들어, 아래 그림에 표시된 것처럼, 운영 체제는 여러 디스크를 하나의 연속적인 파일 시스템으로 보게 됩니다.
디스크 2와 디스크 3의 파일에 어떻게 접근할 수 있을까요? 이것이 바로 마운팅을 통해 이루어집니다. 파일 시스템은 각 디스크를 마운트 포인트에 연결하여 전체 파일 시스템 구조에 통합합니다.
예를 들어, 디스크 2는 '/disk2'라는 마운트 포인트에 연결되고, 디스크 3는 '/disk2/disk3'라는 마운트 포인트에 연결될 수 있습니다. 이렇게 되면 '/disk2' 경로를 통해 디스크 2의 파일에 접근할 수 있으며, '/disk2/disk3' 경로를 통해 디스크 3의 파일에 접근할 수 있습니다.
따라서 파일 시스템 마운팅은 운영 체제가 복수의 디스크를 하나의 연속적인 파일 시스템으로 처리할 수 있게 해주며, 사용자가 이 디스크들에 있는 파일을 쉽게 접근하고 관리할 수 있게 해줍니다.
파일 보호는 파일의 소유자가 누가 어떤 작업을 할 수 있는지 제어할 수 있게 해주는 메커니즘입니다.
"무엇을 할 수 있는지"는 권한에 대한 것으로, 이는 읽기, 쓰기, 실행, 추가, 삭제, 목록 등과 같은 허용된 작업을 지칭합니다. "누가"는 사용자를 의미하며, 이는 슈퍼유저, 사용자 이름(예: foo, kim, park, jane 등)으로 식별될 수 있습니다.
사용자들을 그룹화하는 것이 필요하며, 이를 통해 접근 권한을 제어할 수 있습니다. 접근 권한은 일반적으로 읽기, 쓰기, 실행으로 분류되며, 이는 사용자를 세 가지 클래스로 분류하는데 활용됩니다: 소유자, 그룹, 기타 사용자.
예를 들어, 아래 그림에서는 파일 보호와 접근 권한에 대한 UNIX 시스템의 예시를 보여줍니다.
이 예시에서 "r"은 읽기 권한, "w"는 쓰기 권한, "x"는 실행 권한을 나타냅니다. 첫 번째 세트는 소유자의 권한을 나타내고, 두 번째 세트는 그룹의 권한을, 세 번째 세트는 다른 사용자의 권한을 나타냅니다.
요약하자면, 파일 시스템은 스토리지 장치의 데이터를 구성하는 소프트웨어입니다. 파일 시스템 인터페이스는 파일 시스템을 사용자에게 어떻게 보여줄지를 결정합니다. 파일은 관련된 정보의 명명된 컬렉션으로, 디렉토리는 파일 그룹과 가능하다면 다른 디렉토리를 담는 가상의 컨테이너입니다. 파일 시스템 마운트는 운영 체제에게 파일 시스템이 사용 준비가 되었음을 알리고 이를 마운트 포인트에 연결하는 작업을 수행합니다.
추가
Inode는 UNIX와 같은 파일 시스템에서 파일의 메타데이터를 저장하는 데 사용되는 데이터 구조입니다. "inode"는 "index node"의 줄임말로, 파일 시스템의 인덱스에서 각 파일을 대표하는 노드를 의미합니다.
Inode에는 다음과 같은 정보가 포함됩니다:
파일 유형 (일반 파일, 디렉토리, 심볼릭 링크 등)
파일의 소유자와 그룹
파일 크기
파일에 대한 접근 권한 (읽기, 쓰기, 실행)
파일의 생성, 수정, 접근 시간
파일 데이터가 저장된 디스크 상의 블록 위치
이러한 정보를 사용하여 파일 시스템은 사용자의 요청 (예: 파일 열기, 파일 내용 읽기, 파일 삭제 등)을 처리합니다.
유의할 점은, inode는 파일의 이름이나 위치 정보를 포함하지 않는다는 것입니다. 이 정보는 디렉토리 엔트리에서 관리되며, 각 디렉토리 엔트리는 파일 이름과 관련 inode 번호의 쌍으로 구성됩니다. 이 방식으로 파일 시스템은 파일의 이름, 위치, 그리고 메타데이터를 효과적으로 관리합니다.