파일시스템 계층구조 표준
1. 개요
파일시스템 계층구조 표준(FHS)은 리눅스 운영체제의 파일과 디렉토리 구조를 정의하는 표준이다. 1993년 리눅스 파일 시스템 구조 재구성을 목표로 시작되어 FSSTND로 시작했으며, 이후 BSD 개발 커뮤니티의 참여로 유닉스 계열 운영체제를 포괄하는 FHS로 발전했다. FHS는 버전 2.0(1997년), 2.3(2004년), 3.0(2015년)으로 업데이트되었으며, 루트 디렉토리를 기준으로 하는 디렉토리 구조를 정의하고 있다. 대부분의 리눅스 배포판은 FHS를 따르지만, `/sys` 디렉토리 사용, `/usr/local`에 타사 패키지 설치, `/lib`와 `/usr/lib` 구분, `/bin`, `/usr/bin`, `/sbin`, `/usr/sbin` 통합 등에서 차이를 보이기도 한다. 최근에는 휘발성 런타임 데이터를 저장하는 `/run` 디렉토리를 포함하는 방향으로 발전하고 있다.
| 이름 | 파일시스템 계층 구조 표준 |
|---|---|
| 원어 | Filesystem Hierarchy Standard |
| 약칭 | FHS |
| 상태 | 발표됨 |
|---|---|
| 시작 연도 | 1994년 02월 14일 |
| 최신 버전 | 3.0 |
| 최신 버전 발표일 | 2015년 06월 03일 |
| 관리 기관 | 리눅스 재단 |
| 관련 표준 | 해당 없음 |
| 도메인 | 디렉터리 구조 |
| 웹사이트 | 공식 웹사이트 |
| 웹사이트 (과거) | 공식 웹사이트 (과거) |
-
유닉스 파일 시스템 기술 -
아이노드
아이노드는 파일 시스템에서 파일의 메타데이터를 저장하는 자료 구조이며, 파일 소유자, 접근 권한, 파일 크기 등의 정보를 포함하고, 파일 시스템 드라이버가 파일 정보에 접근하도록 돕는다. -
유닉스 파일 시스템 기술 -
널 장치
널 장치는 Version 5 Unix에서 처음 소개된 특수 파일로, 의도하지 않은 출력 스트림을 버리거나 입력 스트림을 위해 빈 파일 역할을 하며, 유닉스 및 유닉스 계열 운영체제에서 메시지 출력을 제어하는 데 활용된다. -
파일 시스템 디렉토리 -
홈 디렉토리
홈 디렉토리는 다중 사용자 환경에서 각 사용자가 개인 파일과 설정을 저장 및 관리하는 공간으로, 유닉스에서 처음 도입되어 다양한 운영체제에서 구현 방식과 위치가 다르지만 파일 시스템 권한으로 보호되어 개인 정보와 시스템 안정성을 유지하는 데 중요한 역할을 한다. -
파일 시스템 디렉토리 -
작업 디렉토리
작업 디렉토리는 컴퓨터 파일 시스템에서 현재 사용자가 작업 중인 디렉토리를 의미하며, 운영체제 및 프로그래밍 언어에서 변경 및 확인 기능을 제공하고, DLL 검색 경로에 포함 시 보안 문제가 발생할 수 있다. -
시스템 관리 -
슈퍼유저
슈퍼유저는 운영 체제에서 모든 권한을 가진 사용자를 지칭하며, 유닉스 계열에서는 root, 윈도우에서는 관리자 계정이 해당 역할을 수행한다. -
시스템 관리 -
유닉스 셸
유닉스 셸은 사용자의 명령을 해석하여 운영 체제에 전달하고 프로그램 실행을 관리하는 명령 줄 인터페이스로서, 톰슨 셸을 시작으로 본 셸, C 셸 등 다양한 셸들이 개발되어 사용자에게 다양한 셸 환경 선택권을 제공한다.
2. 역사
파일 시스템 계층 구조 표준(FHS) 개발은 1993년 8월에 리눅스의 파일 및 디렉터리 구조 재구성을 목표로 시작되었다. 1994년 2월 14일, 리눅스 운영 체제의 파일 시스템 계층 구조 표준인 FSSTND(FileSystem STaNDard)가 발표되었고, 이후 1994년 10월 9일과 1995년 3월 28일에 개정되었다.
1996년 초, BSD 개발 커뮤니티의 참여로 FSSTND는 리눅스뿐만 아니라 다른 유닉스 계열 운영 체제도 다루는 더 포괄적인 버전으로 확장되었다. 이러한 범위 확대로 인해 FSSTND라는 이름은 파일시스템 계층구조 표준(Filesystem Hierarchy Standard, FHS)으로 변경되었다.
2.1. 초기 역사 (FSSTND)
파일 시스템 계층 구조 표준화는 1993년 8월에 리눅스 파일과 디렉터리 구조를 재구성하려는 시도로 시작되었다. FSSTND(FileSystem STaNDard)라는 리눅스 운영 체제의 파일 시스템 계층구조 표준은 1994년 2월 14일에 발표되었다. 이후 1994년 10월 9일과 1995년 3월 28일에 개정되었다.
2.2. FHS로의 발전
1996년 초, 리눅스뿐만 아니라 다른 유닉스 계열 운영 체제도 다루는 더 포괄적인 버전의 FSSTND 개발 목표가 BSD 개발 커뮤니티 구성원들의 참여로 채택되었다. 그 결과, 유닉스 계열 시스템을 일반화하는 문제에 초점을 맞추어 함께 노력하게 되었다. 이러한 범위 확대를 인정하여 FSSTND라는 이름은 파일시스템 계층구조 표준(Filesystem Hierarchy Standard, FHS)으로 변경되었다.
2.3. 릴리즈 역사
계층 구조 파일 시스템 표준(FHS)의 개발은 1993년 8월에 리눅스 파일과 디렉터리 구조를 재구조화하려는 노력에서 시작되었다. 1994년 2월 14일, 리눅스 운영 체제의 파일 시스템 계층구조 표준인 FSSTND(FileSystem STaNDard)가 발표되었고, 이후 1994년 10월 9일과 1995년 3월 28일에 개정되었다.
1996년 초에는 BSD 개발 커뮤니티의 도움으로 FSSTND의 범위를 리눅스뿐만 아니라 다른 유닉스 계열 운영 체제도 다루도록 확장하는 목표가 채택되었다. 이에 따라 유닉스 계열 시스템 전반의 문제를 다루는 데 초점을 맞추게 되었고, FSSTND라는 이름은 FHS로 변경되었다.
3. 디렉터리 구조
대부분의 리눅스 배포판은 파일시스템 계층구조 표준(FHS)을 따르며, 정책적으로 FHS 준수를 명시하고 있다. 그러나, 자유 표준 그룹의 회원에 의해 개발된 것을 포함하여 현재 대부분의 배포판은 제안된 표준을 완전히 따르지는 않는다.
FHS가 만들어졌을 때, 다른 유닉스 및 유닉스 계열 운영 체제는 이미 고유한 표준을 가지고 있었다. 예를 들어, 맥 OS X는 기존 유닉스 디렉터리 구조에 `/Library`, `/Applications`, `/Users`와 같이 더 길고 직관적인 이름을 사용한다.
최근의 리눅스 배포판은 `/sys`와 같은 구조를 사용하는데, 이는 시스템에 연결된 장치의 수정을 저장하고 허용하는 가상 파일 시스템(sysfs)이다. (proc의 경우 procfs)
GoboLinux나 Syllable Server와 같은 일부 리눅스 시스템은 FHS와 완전히 다른 접근 방식을 취하고 있다. FHS에서는 모든 디렉터리가 루트 디렉터리 "/"의 하위 디렉터리이다. 이들 중 일부 디렉터리는 X 윈도 시스템과 같은 특정 서브시스템에 의존하기도 한다.
이러한 디렉터리의 대부분은 모든 유닉스 계열 운영 체제에 존재하며, 일반적으로 같은 용도로 사용되지만, 여기에 있는 설명은 FHS에 사용되는 것이며, 리눅스 이외의 플랫폼에서는 꼭 지켜야 하는 것은 아니다.
3.1. 주요 디렉터리
FHS 표준은 대부분의 유닉스 계열 운영 체제에서 사용되지만, 리눅스 이외의 플랫폼에서는 꼭 지켜야 하는 것은 아니다. 주요 디렉터리는 다음과 같다.
| | 설명 | |
|---|---|
/ | 최상위 디렉터리로, 모든 다른 디렉터리들을 포함한다. |
/bin | 모든 사용자가 사용하는 필수 명령어 바이너리가 들어있다. (예: cat, ls, cp) |
/boot | 부트 로더 관련 파일 (예: 커널, initrd)이 있다. |
/dev | 장치 파일 (예: /dev/null)이 있다. |
/etc | 시스템 설정 파일이 위치한다. |
/etc/opt | /opt에 설치된 프로그램의 설정 파일이 있다. |
/etc/X11 | X 윈도 시스템 설정 파일이 있다. |
/etc/sgml | SGML 설정 파일이 있다. |
/etc/xml | XML 설정 파일이 있다. |
/home | 사용자 홈 디렉터리가 위치한다. |
/lib | /bin과 /sbin에 있는 실행 파일에 필요한 라이브러리가 있다. |
/media | CD-ROM 등 이동식 미디어의 마운트 지점이다. |
/mnt | 임시로 마운트된 파일 시스템이 위치한다. |
/opt | 추가 응용 소프트웨어 패키지가 설치된다. |
/proc | 커널 및 프로세스 정보를 보여주는 가상 파일 시스템이다. |
/root | 루트 사용자의 홈 디렉터리이다. |
/sbin | 시스템 관리에 필요한 명령어 바이너리가 들어있다. (예: init, ip, mount) |
/srv | 시스템이 제공하는 서비스 관련 데이터가 있다. |
/tmp | 임시 파일이 저장되며, 시스템 재시작 시 삭제될 수 있다. |
/usr | 읽기 전용 사용자 데이터가 있는 보조 계층으로, 주요 사용자 유틸리티와 응용 프로그램이 포함된다. |
/usr/bin | 일반 사용자를 위한 실행 파일(단일 사용자 모드에서 필요하지 않은)이 있다. |
/usr/include | 표준 헤더 파일이 있다. |
/usr/lib | /usr/bin과 /usr/sbin에 있는 실행 파일에 필요한 라이브러리가 있다. |
/usr/sbin | 시스템 관리에 필요한 명령어 바이너리 (예: 다양한 네트워크 서비스 데몬)가 있다. |
/usr/share | 아키텍처 독립적인 데이터가 있다. |
/usr/src | 소스 코드 (예: 커널 소스 코드)가 있다. |
/usr/X11R6 | X 윈도 시스템 관련 파일이 있다. |
/usr/local | 로컬 데이터의 3차 계층으로, 일반적으로 bin, lib, share 등의 하위 디렉터리를 가진다. |
/var | 로그, 스풀 파일, 임시 이메일 파일 등 자주 변경되는 파일이 있다. |
/var/cache | 애플리케이션 캐시 데이터가 있다. |
/var/lib | 프로그램 실행 중에 수정되는 영구적인 데이터(데이터베이스, 패키징 시스템 메타데이터 등)가 있다. |
/var/lock | 현재 사용 중인 자원을 추적하는 잠금 파일이 있다. |
/var/log | 다양한 로그 파일이 있다. |
/var/mail | 사용자 사서함이 있다. |
/var/run | 마지막 부팅 이후 시스템 정보를 나타내는 파일(현재 로그인 정보, 실행 중인 데몬)이 있다. |
/var/spool | 처리를 기다리는 작업 스풀 (예: 큐 출력, 읽지 않은 메일)이 있다. |
/var/spool/mail | 예전에 사용했으나 현재는 사용되지 않는 사용자 사서함 위치이다. |
/var/tmp | 재부팅 후에도 보존되는 임시 파일이 있다. |
3.2. /usr 디렉터리 상세
/usr영어은 읽기 전용 사용자 데이터가 있는 보조 계층 구조로, 주요 다중 사용자 유틸리티와 애플리케이션을 포함한다. /usr영어은 원래 "user"의 약자였다.
| 디렉터리 | 설명 |
|---|---|
| /usr/bin영어 | 모든 사용자를 위한 (단일 사용자 모드에서 필요하지 않은) 비필수 명령어 바이너리. |
| /usr/include영어 | 표준 include 파일. |
| /usr/lib영어 | /usr/bin영어과 /usr/sbin영어에 있는 바이너리를 위한 라이브러리. |
| /usr/sbin영어 | 비필수 시스템 바이너리 (예: 다양한 네트워크 서비스 데몬). |
| /usr/share영어 | 아키텍처 독립적인 (공유) 데이터. |
| /usr/src영어 | 소스 코드 (예: 커널 소스 코드와 그 헤더 파일). |
| /usr/X11R6영어 | X 윈도 시스템, 버전 11, 릴리즈 6. |
| /usr/local영어 | 로컬 데이터의 3차 계층, 이 호스트에만 적용된다. 일반적으로 bin/영어, lib/영어, share/영어와 같은 서브 디렉터리를 가지고 있다. |
3.3. /var 디렉터리 상세
FHS(파일 시스템 계층 구조 표준)에서 `/var`는 변하기 쉬운 파일들을 저장하는 디렉터리이다. 즉, 시스템이 정상적으로 작동하는 동안 내용이 자주 바뀔 수 있는 파일들을 모아둔 곳이다.
`/var` 디렉터리 안에는 다음과 같은 하위 디렉터리들이 있다.
| 디렉터리 | 설명 |
|---|---|
| `/var/cache` | 애플리케이션의 캐시 데이터. 시간이 오래 걸리는 작업의 결과로 생성된 데이터를 임시로 저장한다. 이 파일들은 삭제되어도 다시 생성할 수 있다. |
| `/var/lib` | 프로그램 실행 중에 변경되는 영구적인 데이터. 예를 들어, 데이터베이스, 패키지 관리 시스템의 메타데이터 등이 있다. |
| `/var/lock` | 잠금 파일. 현재 사용 중인 자원을 추적하는 파일들이다. |
| `/var/log` | 로그 파일. 시스템 작동 기록 등 다양한 로그를 저장한다. |
| `/var/mail` | 사용자의 메일 보관함. |
| `/var/run` | 마지막 부팅 이후 시스템 작동 정보. 예를 들어, 현재 로그인한 사용자, 실행 중인 데몬 등의 정보가 있다. FHS 3.0부터는 `/run`으로 대체되었지만, 이전 버전과의 호환성을 위해 `/var/run`이 유지되거나 `/run`으로의 심볼릭 링크가 제공될 수 있다. |
| `/var/spool` | 처리를 기다리는 작업 스풀. 예를 들어, 인쇄 대기열, 읽지 않은 메일 등이 있다. |
| `/var/spool/mail` | (이전 버전과의 호환성을 위해) 예전에 사용되었던 사용자 메일 보관함 위치. |
| `/var/tmp` | 재부팅 후에도 보존되는 임시 파일. |
| `/var/opt` | `/opt`에 설치된 추가 패키지의 변수 데이터. |
4. FHS 준수 및 예외
대부분의 리눅스 배포판은 파일시스템 계층구조 표준(FHS)을 따르며, FHS 준수를 자체 정책으로 명시하고 있다. 그러나 자유 표준 그룹 회원사에 의해 개발된 배포판을 포함하여, 현재 대부분의 배포판은 제안된 표준을 완전히 따르지는 않는다.
FHS가 만들어졌을 당시, 다른 유닉스(혹은 유닉스 계열) 운영 체제들은 이미 고유한 표준을 가지고 있었다. 예를 들어, 맥 OS X는 기존 유닉스 디렉터리 구조에 `/Library`, `/Applications`, `/Users`와 같이 더 길고 직관적인 이름을 사용한다.
최근 리눅스 배포판은 시스템에 연결된 장치의 수정을 저장하고 허용하는 가상 파일 시스템(sysfs, `proc`의 procfs와 유사)인 `/sys`와 같은 구조를 사용한다.
고보리눅스(GoboLinux)와 NixOS는 의도적으로 FHS를 따르지 않는 파일 시스템 구현의 예시이다.
4.1. 일반적인 편차
리눅스 배포판 대부분은 FHS를 따르며, 자체 정책에 FHS를 준수할 것을 명시한다. 그러나 자유 표준 그룹의 회원에 의해 개발된 것을 포함하여, 현재 대부분의 배포판은 제안된 표준을 완전히 따르지는 않는다.
FHS가 만들어졌을 때, 다른 유닉스 (혹은 유닉스 계열) 운영 체제는 이미 고유한 표준을 가지고 있었다. 예를 들어, 맥 OS X는 기존 유닉스 디렉터리 구조에 `/Library`, `/Applications`, `/Users`와 같이 더 길고 직관적인 이름을 사용한다.
최근 리눅스 배포판은 `/sys`와 같은 구조를 사용하는데, 이는 시스템에 연결된 장치의 수정을 저장하고 허용하는 가상 파일 시스템(sysfs, `proc`의 procfs와 유사)이다. 고보리눅스(GoboLinux)와 NixOS는 의도적으로 FHS를 따르지 않는 파일 시스템 구현의 예시이다.
일부 배포판은 일반적으로 표준을 따르지만, 일부 영역에서는 벗어나기도 한다. FHS는 "후행 표준"이므로 특정 시점의 일반적인 관행을 문서화한다. 시대가 변하고 배포판의 목표와 필요에 따라 실험이 필요하기 때문이다. 몇 가지 일반적인 편차는 다음과 같다.
* 최신 리눅스 배포판에는 시스템에 연결된 장치를 저장하고 수정할 수 있도록 하는 가상 파일 시스템 (sysfs, `/proc`와 유사)인 `/sys` 디렉터리가 포함되어 있다. 반면, 많은 전통적인 유닉스 계열 운영 체제는 `/sys`를 심볼릭 링크로 사용하여 커널 소스 트리를 가리킨다.
* 많은 현대 유닉스 계열 시스템(예: FreeBSD 및 OpenBSD)은 포트 시스템을 통해 타사 패키지를 `/usr/local`에 설치하는 반면, 운영 체제의 일부로 간주되는 코드는 `/usr`에 유지한다.
* 일부 리눅스 배포판은 더 이상 `/lib`와 `/usr/lib`를 구분하지 않으며 `/lib`를 `/usr/lib`에 심볼릭 링크로 연결한다.
* 일부 리눅스 배포판은 더 이상 `/bin`과 `/usr/bin`, `/sbin`과 `/usr/sbin`을 구분하지 않는다. 이들은 `/bin`을 `/usr/bin`에, `/sbin`을 `/usr/sbin`에 심볼릭 링크로 연결할 수 있다. 다른 배포판은 이 네 가지를 모두 통합하여 `/usr/bin`에 심볼릭 링크로 연결한다.
최신 리눅스 배포판은 FHS 버전 3.0에 따라 휘발성 런타임 데이터를 저장하는 임시 파일 시스템 (tmpfs)인 `/run` 디렉토리를 포함한다. FHS 버전 2.3에 따르면, 이러한 데이터는 `/var/run`에 저장되었지만 이 디렉토리는 초기 부팅 시 항상 사용할 수 없으므로 몇 가지 문제점이 있었다. 결과적으로, 이러한 프로그램들은 장치 디렉토리가 이러한 데이터를 위한 것이 아님에도 불구하고 `/dev/.udev`, `/dev/.mdadm`, `/dev/.systemd` 또는 `/dev/.mount` 디렉토리를 사용하는 것과 같은 기교에 의존해야 했다. 다른 장점들 중, 이것은 시스템이 루트 파일 시스템을 읽기 전용으로 마운트한 상태에서도 쉽게 사용할 수 있게 한다.
예를 들어, 데비안은 2013년 Wheezy 릴리스에서 다음과 같이 변경했다.
| 기존 경로 | 변경된 경로 |
|---|---|
| `/dev/.*` | `/run/*` |
| `/dev/shm` | `/run/shm` |
| `/dev/shm/*` | `/run/*` |
| `/etc/*` (쓰기 가능 파일) | `/run/*` |
| `/lib/init/rw` | `/run` |
| `/var/lock` | `/run/lock` |
| `/var/run` | `/run` |
| `/tmp` | `/run/tmp` |
4.2. FHS 비준수 배포판
대부분의 리눅스 배포판은 FHS를 따르며 그들의 정책에 FHS를 준수할 것을 명시한다. 그러나 현재 대부분의 배포판은 자유 표준 그룹의 회원에 의해 개발된 것을 포함하여 제안된 표준을 완전히 따르지는 않는다.
FHS가 생성되었을 때, 다른 유닉스 (혹은 유닉스 계열) 운영 체제는 이미 그들만의 고유한 표준이 있었다. 특히 파일 시스템 레이아웃에 대한 하이어(7) 설명이 유닉스 버전 7(1979년) 혹은 썬 OS 파일시스템(7), 최근 솔라리스 파일 시스템(5)부터 존재하였다. 예를 들어, 맥 OS X는 기존 유닉스 디렉토리 구조에 /Library, /Applications, 그리고 /Users와 같이 더 길고 직관적인 이름을 사용한다.
최근의 리눅스 배포판은 기존의 유닉스 및 유닉스 계열 운영 체제의 커널 소스 트리 상에서 심볼릭 링크로 /sys를 사용하는 것처럼 시스템에 연결된 장치의 수정을 저장하고 허용하는 가상 파일 시스템(proc의 procfs와 같은 sysfs)처럼 /sys와 같은 구조를 쓴다.
GoboLinux나 Syllable Server과 같은 일부 리눅스 시스템은 FHS와 완전히 다르게 접근했다.
5. 한국의 FHS 활용과 기여
(이전 출력이 비어 있으므로, 수정할 내용이 없습니다. 빈 문자열을 반환합니다.)