유닉스 파일시스템
유닉스 및 유닉스에 영향을 받은 운영 체제에서 파일 시스템은 운영 체제의 핵심적인 부분으로 간주된다.[1] 1969년으로 거슬러 올라가 켄 톰프슨이 최초 실험 버전의 유닉스에 설계하고 구현한 시스템의 최초 부분 가운데 하나이기도 했다.[2]
다른 운영 체제들과 비슷하게 파일 시스템은 정보 스토리지와 검색을 제공하며 그리고 여러 형태의 프로세스 간 통신 가운데 하나로서 전통적으로 유닉스 시스템을 형성하는 수많은 작은 크기의 프로그램들이 파일에 정보를 저장시킬 수 있어서 다른 프로그램들이 이것들을 읽을 수 있다. 파이프가 제3판을 기점으로 이 역할을 보충해준다. 또, 파일시스템은 터미널, 프린터, 마우스로의 진입점인 이른바 장치 파일을 통해 다른 리소스로의 접근을 제공한다.
이 문서의 나머지 부분은 보통명칭으로서 오리지널 유닉스 운영 체제와 그에 속하는 수많은 계열을 모두 의미하는 "유닉스"를 사용한다.
원리
편집파일시스템은 여러 디렉터리가 있는 하나의 루트 트리로 등장한다.[1] 디스크 파티션, 이동식 미디어, 네트우크 자원 등 별도의 볼륨을 별도의 트리로 주소화(마치 도스와 윈도우에서 하는 것처럼, 각 "드라이브"가 드라이브 문자를 가짐으로써 파일 시스템 트리의 루트를 나타내는 것)하는 대신 이러한 볼륨들은 디렉터리를 마운트시킴으로써 볼륨의 파일 시스템 트리가 더 큰 트리의 디렉터리로 보이게 만든다.[1] 전체 트리의 루트가 /
로 표시된다.
오리지널 벨 연구소 유닉스에서는 2 디스크 셋업이 관례적이었으며 첫 번째 디스크는 시작 프로그램을 담고 있었으며 두 번째 디스크는 사용자의 파일과 프로그램들을 담았다. 이 두 번째 디스크는 첫 번째 디스크에서 usr
이라는 이름의 빈 디렉터리에서 마운트되었으므로 두 번째 디스크가 하나의 파일 시스템으로 보이게 되며 두 번째 디스크의 내용은 /usr
에서 볼 수 있다.
유닉스 디렉터리는 파일을 담고있지 않다. 그 대신 이른바 아이노드의 참조와 쌍을 이루는 파일들의 이름을 담는다. 그리고 이 아이노드는 파일과 파일 메타데이터(소유자, 권한, 마지막 접근 시간 등, 그러나 이름은 미포함)를 담는다. 파일 시스템의 여러 개의 이름은 동일한 파일을 가리킬 수 있으며 이 기능의 이름은 하드 링크라고 부른다.[1] 하드 링크의 수학적 특성으로 말미암아 파일 시스템을 유한한 유형의 유향 비순환 그래프로 만들어주지만 디렉터리는 일반적으로 하드 링크될 수 없기 때문에 여전히 트리를 구성한다. 1969년 원래 예상한 바 그대로 유닉스 파일 시스템은 유닉스 파일 시스템은 사실상 경로 이름 대신 내비게이션을 제공하는 디렉터리에 대한 하드 링크가 있는 일반 그래프로 사용된다.[2])
파일 유형
편집오리지널 유닉스 파일 시스템은 3가지 파일 유형을 지원하였다: 일반 파일, 디렉터리, "특수 파일"(또는 장치 파일).[1] BSD와 시스템 V는 각각 프로세스 간 통신을 위해 사용할 파일 유형을 추가하였다: BSD는 소켓을,[3] 시스템 V는 FIFO 파일을 추가하였다.
또, BSD는 일련의 파일 유형에 대한 심볼릭 링크(이른바 symlink)를 추가하였다. 이것들은 다른 파일을 가리키는 파일들이며 보완 방식의 하드 링크들이다.[3] 심볼릭 링크는 멀틱스에 비슷한 기능 이후 모델링된 것으로,[4] 파일시스템을 아우르는 하드 링크와는 구별하며 이들의 존재하는 대상 오브젝트와는 독립적이다. 다른 유닉스 시스템들은 추가 유형의 파일을 지원할 수 있다.[5]
전통적인 디렉터리 레이아웃
편집프로그램, 시스템 구성 파일, 사용자의 홈 디렉터리 등 일부 유형의 파일을 위치시키기 위한 특정한 전통이 존재한다. 이것들은 버전 7 유닉스 이후로 hier(7)
Man page에 처음 문서화되었다.[6] 이후 버전과 파생판, 클론들은 일반적으로 비슷한 매뉴얼 문서를 제공한다.[7][8][9][10][11][12]
디레터리 레이아웃의 세세한 부분은 시간이 지남에 따라 다양해지고 있다. 파일 시스템 레이아웃이 단일 유닉스 규격의 일부가 아니지만 시스템 V 응용 프로그램 이진 인터페이스, 인텔 이진 호환 표준, 공통 운영 체제 환경, 리눅스 재단의 파일시스템 계층구조 표준(FHS) 등 표준화를 위한 여러 시도가 존재한다.[13]
다음은 유닉스 운영 체제의 파일의 일반적 위치를 나타낸 개요이다:
디렉터리 또는 파일 | 설명 |
---|---|
/
|
단독 슬래시 / 문자는 파일시스템 트리의 루트를 나타낸다.
|
|
이진 파일을 대표한다. 시스템 V.4에서 이것은 /usr/bin 의 심볼릭 링크이다. 그 밖의 경우 루트 파일시스템 그 자체여야 한다.
|
성공적인 부팅 프로세스에 필요한 모든 파일을 포함한다. 리서치 유닉스에서 이것은 디렉터리가 아닌 하나의 파일이었다.[14] | |
장치를 대표한다. 주변 장치와 의사 장치들의 대표 파일들을 포함한다. | |
|
시스템 전체의 구성 파일과 시스템 데이터베이스 파일을 포함한다. |
|
리눅스와 기타 일부 시스템의 사용자 홈 디렉터리를 포함한다. 오리지널 버전의 유닉스에서 홈 디렉터리는 /usr 를 대신 사용하였다.[15] 일부 시스템들은 여전히 다른 위치를 사용한다: macOS는 /Users 에 홈 디렉터리를 보관하며 구형 버전의 BSD는 /u 에, FreeBSD는 /usr/home 에 위치한다.
|
|
근본적으로 필수적인 라이브러리들: C 라이브러리, 그러나 포트란 라이브러리는 아님.[14] |
|
USB 스틱, 미디어 플레이어 등 이동식 장치의 기본 마운트 지점이다. |
|
마운트를 대표한다. |
|
로컬에 설치된 소프트웨어를 포함한다. |
|
프로세스에 관한 정보를 파일로 표시하는 Procfs 가상 파일 시스템이다. |
|
슈퍼유저 루트(시스템 관리자)를 위한 홈 디렉터리이다. |
|
시스템(또는 슈퍼유저) 바이너리를 대표하며 시스템의 기동, 관리, 복구에 필수적인 init 등 중요 유틸리티를 포함한다.
|
|
서버 데이터(시스템이 제공하는 서비스 데이터)이다. |
|
일부 리눅스 배포판에서 하드웨어와 운영 체제와 관련한 정보를 담고있는 Sysfs 가상 파일 시스템을 포함한다. |
|
재부팅 시에도 생존할 것으로 예측되지 않는 임시 파일을 위한 장소이다. |
|
리서치 유닉스와 시스템 V의 유닉스 커널이다.[14] |
|
사용자 파일 시스템이다. 원래는 사용자 홈 디렉터리들을 보관하는 디렉터리이지만,[15] 제3판 리서치 유닉스(1973년 경)에 의해 이미 운영 체제의 프로그램들을 두 개의 디스크(이 중 하나느 256K 고정 헤드 드라이브)에 분리시키기 위해 재사용되었으며 기본적인 명령어들이 /bin 또는 /usr/bin 에 나타나게 된다.[16] 현재는 X 윈도 시스템, KDE, 펄 등 시스템에 중요하지 않은 실행 파일, 라이브러리, 공유 리소스를 보관한다.
구 유닉스 시스템에서 사용자 홈 디렉터리는 프로그램을 포함하는 디렉터리들과 함께 |
|
시스템 전반의 개발 헤더를 저장한다. |
|
/usr 또는 다른 곳에 저장된 프로그램을 위한 필요 라이브러리, 데이터 파일을 저장한다.
|
|
사용자가 직접 실행하는 것이 아닌, 다른 프로그램들이 실행하는 프로그램을 보관한다. 이를테면 Sendmail 실행 파일은 이 디렉터리에서 볼 수 있다.[17] 2011년 FHS에서 등장하였다.[18] 리눅스 배포판은 전통적으로 이 디렉터리의 내용을 /usr/lib 로 이동시켰다.
|
|
구조적으로 /usr 와 유사하지만 하위 디렉터리는 운영 체제 배포판의 일부가 아닌 추가물에 사용된다. (예: BSD 포츠 컬렉션의 사용자 지정 프로그램인 파일) 일반적으로 /usr/local/lib 또는 /usr/local/bin 등의 하위 디렉터리를 포함한다.
|
|
아키텍처에 독립적인 프로그램 데이터이다. |
|
변수를 대표한다. 특히 프로세스 ID 잠금 파일, 시스템 사용자에게 보내는 이메일 등 크기 면에서 변동이 있는 파일들을 위한 장소이다. |
|
시스템 로그 파일을 포함한다. |
|
들어오는 메일이 저장되는 장소이다. root가 아닌 사용자들은 자신만의 메일에만 접근이 가능하다. 이 디렉터리는 /var/spool/mail 의 심볼릭 링크인 경우가 있다.
|
|
스풀 디렉터리이다. 인쇄 잡, 메일 스풀, 기타 큐의 작업을 포함한다. |
|
컴파일되지 않은 일부 프로그램의 소스 코드가 위치하는 장소이다. |
|
/var/tmp 디렉터리는 시스템 재부팅 간 보존되어야 하는 임시 파일을 위한 장소이다.
|
같이 보기
편집각주
편집- ↑ 가 나 다 라 마 Ritchie, D.M.; Thompson, K. (July 1978). “The UNIX Time-Sharing System”. 《Bell System Tech. J.》 57 (6): 1905–1929. CiteSeerX 10.1.1.112.595. doi:10.1002/j.1538-7305.1978.tb02136.x.
- ↑ 가 나 Ritchie, Dennis M. (1979). 《The Evolution of the Unix Time-sharing System》. Language Design and Programming Methodology Conf. 2015년 4월 8일에 원본 문서에서 보존된 문서. 2020년 5월 8일에 확인함.
- ↑ 가 나 Leffler, Samuel J.; McKusick, Marshall Kirk; Karels, Michael J.; Quarterman, John S. (October 1989). 《The Design and Implementation of the 4.3BSD UNIX Operating System》. en:Addison-Wesley. ISBN 978-0-201-06196-3.
- ↑ McKusick, Marshall Kirk; 외. “A Fast Filesystem for Unix” (PDF). 《Freebsd.org》. CSRG, UC Berkeley. 2016년 11월 16일에 확인함.
- ↑ 리눅스 프로그래머의 매뉴얼 – System Calls –
- ↑ 버전 7 유닉스 프로그래머의 매뉴얼 –
- ↑ FreeBSD Miscellaneous Information 매뉴얼 페이지 –
- ↑ OpenBSD Miscellaneous Information 매뉴얼 페이지 –
- ↑ “hier(7) man page for 2.9.1 BSD”.
- ↑ “hier(7) man page for ULTRIX 4.2”.
- ↑ “hier(7) man page for SunOS 4.1.3”.
- ↑ 리눅스 프로그래머의 매뉴얼 – Overview, Conventions and Miscellanea –
- ↑ George Kraft IV (2000년 11월 1일). “Where to Install My Products on Linux?”. 《리눅스 저널》. 2014년 11월 13일에 확인함.
- ↑ 가 나 다 라 Kernighan, Brian W.; Pike, Rob (1984). 《The UNIX Programming Environment》. Prentice-Hall. 63–65쪽. Bibcode:1984upe..book.....K.
- ↑ 가 나 Ritchie, Dennis. “Unix Notes from 1972”. 2018년 1월 14일에 확인함.
- ↑ M. D. McIlroy (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986. CSTR 139, Bell Labs.
- ↑ “Chapter 7. sendmail”. 《UNICOS/mp Networking Facilities Administration》. 크레이 (기업). 2017년 11월 9일에 원본 문서에서 보존된 문서. 2013년 9월 14일에 확인함.
- ↑ “fhs-spec revision 44”. 2017년 3월 5일에 원본 문서에서 보존된 문서. 2020년 5월 8일에 확인함.