파일 시스템

'''파일 시스템'''(file system)은 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제를 가리키는 말이다.
파일 시스템은 통상 하드 디스크나 CD-ROM 같은 실제 자료 보관 장치를 사용하여 파일의 물리적 소재를 관리하는 것을 가리키나 네트워크 프로토콜(NFS, SMB, 9P 등)을 수행하는 클라이언트를 통하여 파일 서버 상의 자료로의 접근을 제공하는 방식과 가상의 형태로서 접근 수단만이 존재하는 방식(procfs 등)도 파일 시스템의 범위에 포함될 수 있다. 디렉터리 서비스나 레지스트리와는 의미가 조금 다르다.
컴퓨터가 출현하기 이전에 파일 시스템(file system)이라는 용어는 종이 문서들을 저장하고 검색하는 방식을 기술하는데 사용되었다. 1961년에 이 용어는 원래의 의미와 동시에 전산화된 기록물에 적용되었다. 1964년에 일반적으로 사용되었다.
=== 전반 ===
파일 시스템은 일반적으로 크기가 일정한 블록들의 배열(섹터라고도 불리며 통상 512바이트, 1키비바이트, 2키비바이트같은 - 2를 제곱한 수만큼의 크기를 갖는다)에 접근할 수 있는 자료 보관 장치 위에 생성되어 이러한 배열들을 조직함으로 파일이나 디렉터리를 만들며 어느 부분이 파일이고 어느 부분이 공백인지를 구분하기 위하여 각 배열에 표시를 해 둔다. 또한 자료를 '클러스터' 또는 '블록'이라고 불리는 일정한 단위(이것은 각 디스크 배열들에 대한 식별할 수 있는 번호를 제공하는데 통상 1부터 64까지가 쓰인다)에 새겨 넣는데 이것이 바로 파일 하나가 필요로 하는 디스크의 최소 공간이다.
=== 파일 이름 ===
파일에 이름이 존재함은 컴퓨터 메모리 안에서 해당 파일의 소재 위치를 보장하기 위함이다. 파일 시스템 안에서 디렉터리는 통상 파일 이름과 해당 파일을 연결해 주는데 도스의 FAT나 유닉스 계열 운영 체제의 아이노드의 경우 파일 이름을 색인과 연결한다. 디렉터리 구조는 수평형일 수도 있고 수직형(하위 디렉터리 있음)일 수도 있다. 어떤 파일 시스템에서는 파일 이름이 이름, 확장자, 판 수 이런 식으로 특별한 문법을 따르기도 하며 또 어떤 파일 시스템에서는 파일 이름은 그저 문자열 정도로만 취급되고 각 파일마다 어딘가에 메타데이터가 보관된다.
일반적으로 파일 시스템은 '저장 장치 - 입출력 제어 - 기본 파일시스템 - 파일조직 모듈 - 가상 파일시스템'과 같이 여러 개의 계층으로 구성되어 있다. 그렇게 함으로써 하드 디스크, 시디롬 드라이브, 플래시 메모리 등 다양한 형태의 저장 장치를 지원할 수 있고, 하나의 시스템에 여러 개의 파일 시스템을 사용하는 것이 가능해진다.
파일 시스템은 크게 디스크, 네트워크, 그리고 특수 용도의 파일 시스템으로 나눌 수 있다.
=== 디스크 파일 시스템 ===
자료 기억 장치, 특히 컴퓨터에 연결된 디스크 드라이브에 파일을 저장하도록 설계된 시스템이다.
'''보기'''
* 파일 할당 테이블(FAT)
* NTFS
* HFS
* APFS
* NNFS
* ext2
* ext3
* ext4
* ISO 9660
* ODS-5
* UDF
* 유닉스 파일 시스템
* ZFS
* ReFS
=== 데이터베이스 파일 시스템 ===
데이터베이스 기반의 파일 시스템은 최근에 등장한 새로운 개념의 파일 시스템이다. 파일을 계층 구조로 관리하지 않고 파일의 형식, 주제, 만든이, 내용과 같은 여러 특성에 따라 시스템에서 자동으로 분류하여 관리하는 것이다. 따라서 쿼리 언어나 자연어 등으로 파일을 빠르게 찾을 수 있다.
'''보기'''
* 그놈 VFS
* BFS
* WinFS
=== 트랜잭션 기반 파일 시스템 ===
트랜잭션 기반 파일 시스템은 파일에 일어난 이벤트나 트랜잭션을 기록하는 시스템이다. 사용자가 수행하는 작업은 여러 개의 파일의 내용을 바꿀 수 있다. 이 바뀐 내용들은 서로 연관되어 있는 경우가 많으므로 이 내용들이 논리적으로 서로 연결되어 있어야 하는 시스템에서는 이 변화들이 동시에 일어난다는 것이 보장되어야 한다. 은행 계좌에서 돈을 이체하는 경우를 예로 들어 보자. 당신이 온라인으로 돈을 이체할 때 은행 컴퓨터는 상대방의 은행 컴퓨터에 "전송" 명령을 보내고 동시에 당신의 계좌에서 같은 금액을 줄일 것이다. 그런데 이때 시스템에 우연히 사고가 일어나 전송 명령이 보내지지 않았다면 상대방의 계좌에 돈은 입금되지 않았는데 당신의 계좌에서는 돈이 사라지는 일이 일어날 수 있다. 트랜잭션 기반 시스템은 이렇게 논리적으로 동시에 수행되어야 하는 작업들을 하나의 "트랜잭션"으로 묶어 만약의 사고가 일어났을 때 양쪽에서 트랜잭션을 다시 수행하여 오류를 막는다. 또한 모든 트랜잭션은 기록으로 남아 어디서 무슨 일이 언제 수행되었는지가 기록된다. 이러한 파일 시스템은 시스템의 오류를 막기 위해 설계되었으며, 느리지만 안전하다고 볼 수 있다.
=== 특수 용도의 파일 시스템 ===
유닉스와 같은 파일 중심의 운영 체제는 여러 가지 특수 용도의 파일 시스템을 사용한다. 예를 들면, 어떤 종류의 유닉스는 '/proc'이라는 파일 시스템에서 프로세스나 운영 체제 여러 기능에 접근할 수 있다.
심우주 탐사선인 보이저 1호와 2호에는 디지털 테이프 기반의 파일 시스템이 탑재되어 있다. 카시니-하위헌스 호와 같은 현대 우주선들은 실시간 운영 체제를 위한 파일 시스템을 탑재한다. 화성 탐사선들도 실시간 운영 체제를 탑재하고 있는데, 이들의 파일 시스템은 플래시 메모리를 사용한다.
대부분의 운영 체제는 파일 시스템을 갖고 있으며, 파일은 현대의 모든 운영 체제의 기본 구성 요소이다. 마이크로컴퓨터의 초창기 운영 체제 도스(곧, 디스크 운영 체제)의 주 목적은 파일 관리였다. 이러한 초창기 운영 체제들은 디스크를 관리하는 시스템을 따로 설계했다. 이러한 운영 체제들은 내부에 단 하나의 파일 시스템만을 지원했다.
=== 유닉스 계열의 파일 시스템 ===
유닉스나 다른 유닉스 계열 운영 체제들은 여러 개의 주변 장치에 각각의 이름을 붙이지만, 그 주변 장치에 존재하는 파일들은 전부 하나의 계층 구조 아래 관리된다. 다시 말하면, 유닉스에서는 하나의 루트 디렉터리가 있고, 운영 체제에서 접근할 수 있는 모든 파일들은 전부 루트 디렉터리 아래의 어느 디렉터리에 들어 있다. 또한, 루트 디렉터리는 어떤 특정한 하드 디스크에 존재할 필요가 없고, 심지어 네트워크 위의 가상 파일 공간을 루트 디렉터리로 삼을 수도 있다.
다른 주변 장치에 있는 파일에 접근하려면, 이 주변 장치의 파일 시스템을 어떤 디렉터리로 놓을 것인지를 운영 체제에게 알려야 한다. 이것을 가리켜 "파일 시스템을 마운트한다"고 일컫는다. 예를 들어, 유닉스에서 시디롬을 읽으려면 시디롬의 파일 시스템을 루트 밑의 /mnt 디렉터리 밑에 나타나게 하는 명령을 내린다. 일반적으로 컴퓨터의 관리자만이 파일 시스템을 마운트할 수 있다.
=== 리눅스의 파일 시스템 ===
* 확장 파일 시스템 (ext, ext2, ext3, ext4)
* ZFS
* ResierFS
* XFS
=== 솔라리스의 파일 시스템 ===
* ZFS
* UFS
=== 맥 OS X의 파일 시스템 ===
맥 OS X은 맥 OS에서 쓰던 HFS를 개량한 HFS 플러스를 사용한다. 많은 메타데이터를 가지며 대소문자를 구분하지 않는다. HFS와 달리 유닉스식 접근 권한 관리 기능이 있으며 나중에는 저널링과 함께 파일 시스템 단편화 관련 여러 알고리즘이 더해졌다.
파일 이름은 255자까지 지을 수 있고 파일 이름을 저장할 때 유니코드를 쓴다. 맥 OS X에서 파일 형식은 파일 이름의 확장자로 알 수도 있고 메타데이터에 저장된 타입 코드로부터 알 수도 있다.
HFS 플러스는 다음의 세 가지 링크를 사용한다.
* 하드 링크
* 심볼릭 링크
* 에일리어스(alias): 파일이 옮겨지거나 이름이 바뀌어도 링크가 깨지지 않는다.
2017년 공개된 macOS High Sierra부터는 APFS 파일 시스템을 기본으로 채택하고 있다. 저장 공간을 다른 볼륨 간에 공유하는 기능으로, 솔리드 스테이트 드라이브(SSD)에 최적화된 것이 특징이다.
=== 마이크로소프트 윈도우의 파일 시스템 ===
윈도 명령 셸에서 나열된 디렉터리 목록.
마이크로소프트 윈도우는 초창기 운영 체제(CP/M-80을 바탕으로 만든 MS-DOS) 기반으로 제작되었지만, 다른 운영 체제(유닉스, OS/2 등)의 파일 시스템과 사용자 인터페이스에서 많은 아이디어를 빌려왔다. 윈도우는 FAT와 NTFS를 사용한다. 초창기 FAT 파일 시스템은 파일 이름의 길이에 제한이 있었고, 디스크와 파티션 수에도 마찬가지로 제한이 있었다.
윈도우 NT에 탑재되어 함께 출시된 NTFS는 접근 제어 리스트 기반의 권한 설정과 하드 링크, 여러 개의 파일 스트림, 쿼터 추적, 압축, 다른 파일 시스템을 마운트하는 기능 등이 있다.
다른 운영 체제들과는 달리, ''드라이브 글자''를 사용하여 디스크나 파티션을 구분한다. 예를 들어, C:\WINDOWS\는 글자 C로 보여지는 파티션 안에 있는 WINDOWS라는 디렉터리임을 뜻한다. C 드라이브는 운영 체제가 설치된 첫 번째 하드 디스크 파티션을 나타내는 글자로 많이 쓰인다. 이것은 MS-DOS 시절, A와 B는 플로피 디스크 드라이브를 가리키고, C 드라이브가 하드 디스크를 가리켰기 때문이다. 이런 전통 때문에, 운영 체제가 설치된 파티션이 C 드라이브라고 가정하는 오래된 프로그램들이 버그를 일으키곤 한다. 네트워크 드라이브 또한 드라이브 글자로 매핑될 수 있다.
* 분산 파일 시스템
* 파일 시스템 목록
*   파일시스템 규격 - 링크 및 백서