[LFS201] Linux Filesystem Tree Layout
1) 리눅스에서는 왜 하나의 큰 파일시스템 트리의 조직을 필요로 하는가? 그리고 이것이 가능하도록 하기 위해 어떤것들을 고려해야 하는가?
리눅스는 다른 UNIX 기반의 운영체제와 같이 하나의 커다란 파일시스템 트리로 이루어져있다. 보통 거꾸로된 트리로, 가장 위에는 root (/)가 존재한다.
이러한 커다란 논리적인 파일 시스템에는 하나 혹은 여러개의 다른 파일시스템들이 존재할 수 있고, 이는 subdirectory 처럼 표현된다. 서로 다른 파일시스템들은 보통 다른 파티션 위에 있고, 여러개의 디바이스 위에 존재할 수 있으며 다른 네트워크상에 존재하는 것 들도 있다.
어떻게 이 파일들이 연결되는지와는 상관 없이 그냥 하나의 커다란 파일시스템으로서 존재하고, 어플리케이션은 파일들이 어떤 물리 디바이스에 존재하는지는 신경쓰지 않아도 된다.
예전에는 다른 유닉스 기반의 시스템들은 이 파일 트리를 다양한 방식으로 조직하였다. 이 관행은 어플리케이션을 작성하고 시스템 어드민을 하는 데 있어서 어려움을 초래했다.
결과적으로 리눅스 생태계는 파일 시스템의 표준을 마련함으로써 이와같은 어려움들을 해소하고자 했다.
트리의 표준을 정하는데에는 아래와같은 데이터의 성격상의 분류를 고려해야 한다.
데이터를 분류하는 기준으로는 다음과 같이 두 가지가 있다.
* shareable vs. non-shareable
- shareable : 다른 호스트들 사이에서 공유될 수 있는 데이터.
- non-shareable : 특정 호스트에게만 보여지는 데이터.
예) 유저 home 디렉토리는 공유 가능할수 있으나 디바이스 lock 파일들은 그렇지 않다.
* variable vs. static
- variable : 시스템 어드민의 도움 없이도 변경될 수 있는 데이터
- static : 바이너리, 라이브러리, 다큐먼테이션 등 시스템 어드민의 도움 없이 변경될 수 없는 데이터.
위와같은 논리적은 구분들은 파일들을 별도의 디렉토리, 파티션 그리고 파일 시스템에 분류해 놓음으로써 이루어진다.
2) Filesystem Hierarchy Standard 의 역할을 설명하라.
FHS 는 Free Standards Group 에 의해서 유지되었었다. 그리고 지금은 리눅스 파운데이션이 관리하고, 어떠한 메인 디렉토리가 시스템에 존재해야 하는지, 그리고 그 목적이 무엇인지에 대한 기준을 제시한다.
표준 레이아웃을 제시험으로써, FHS는 파일 위치를 예측하는 것을 단순화한다. 대부분의 리눅스 배포판들은 FHS를 잘 준수하나, 그 어떤것도 완벽히 따르지는 않는다. 뿐만 아니라 마지막 정식 FHS버전은 새로운 개발 환경에 그다지 잘 부합하지 않을 정도로 오래되었다.
비록 표준이 존재하나, 배포판들이 다양한 실험을 커치면서 필요하다 생각되는 것들은 그때 그때 받아들여지고 있다.
3) 부트시 루트(/) 디렉토리에 무엇이 반드시 존재해야 하는지 설명하고, 시스템이 시작하고 나서야만 존재할 수 있는것으로는 무엇들이 있는지 설명하라.
루트 디렉토리가 속한 파일시스템은 보통 자신만의 특별한 파티션 위에 존재한다. 이 파티션에는 시스템 부트 후에 /home, /var, /opt 와 같은 디렉토리들이 탑재된다.
루트 파티션은 시스템을 부트하기 위한 필수적인 파일들을 갖고 있어야 하고, 다른 모든 파일시스템들을 탑재할 수 있어야 한다. 따라서 utility들, configuration 파일들, 부트로더 정보, 그리고 다른 많은 스타트업 데이터들이 필요하다.
루트 디렉토리는 반드시 :
* 시스템을 Boot 해야 하고
* Tape, Removable Media, NAS 등과 같은 외부 미디어 상에 존재하는 시스템 백업들로부터 시스템을 재구성해야하며
* 시스템을 recover 혹은 repair 해야 한다. 메인테이너는 반드시 파손된 시스템을 진단하고 재구성할 수 있는 도구들을 갖고 있어야 한다.
FHS에 따르면, 다른 어떤 어플리케이션 혹은 패키지들은 루트 디렉토리 밑에 새로운 서브디렉토리를 만들지 않아야 한다.
/bin 에는 유저와 시스템 어드민 둘다에게 필요한 실행파일들이 존재한다. 다른 파일 시스템들이 탑재되지 않은 상태에서 single user mode 로 부팅할지, recovery mode 로 부팅할지 결정하는 파일이 대표적이다.
$ ls -F /bin
/boot 디렉토리와 해당 디렉토리 안의 서브디렉토리 안에는 시스템을 부팅하는 데 필수적인 파일들이 있다.
* vmlinuz : 이 파일은 리눅스 커널의 압축파일이다.
* initramfs : 초기의 RAM 파일시스템으로, 실제 루트 파일시스템이 사용가능해지기 전에 시스템에 탑재된다.
(initrd; initial RAM disk 라고도 불리운다)
/boot 안에는 커널이 유저 모드 프로그램을 실행시키기 전에 사용되는 데이터들을 갖고 있다. 또한 다음과 같은 두 개의 파일들을 디버깅 및 정보제공의 목적으로 갖고 있다.
* config : 커널 컴파일레이션을 설정하기 위한 파일
* System.map : 커널의 심볼테이블. 디버깅에 사용된다.
또한, 저장된 master boot sector 들, sector map 파일들, 그리고 손으로 직접 수정되지 않는 다른 데이터들을 갖고 있다. /boot 의 내용은 배포판에 따라서 다르다.
/sbin 디렉토리 안에는 booting, restoring, recovering, 그리고 reparing 을 위한 바이너리파일들이 존재한다. 이 파일들은 root 파일 시스템이 유효한 것이 확인된 후, 반드시 /usr, /home 그리고 다른 위치들에 필요한 다른 파일 시스템들을 탑재할수 있어야 한다.
* 최근의 배포판들은 /sbin 과 /usr/sbin 을 분리하는것과 /bin과 /usr/bin 을 분리하는 전략을 포기하고, 하나의 디렉토리 안에서 심볼릭 링크를 이용해 두 개의 디렉토리를 표현한다.
/usr 디렉토리는 secondary hierarchy 로서, 시스템 부팅에 필요 없는 파일들을 갖고 있다. 마찬가지로 /root 와 같은 파티션에 존재하지 않아도 되며, 같은 시스템 아키텍처를 사용하는 다양한 호스트들 사이에서 네트워크를 통해 공유될 수 있다.
이 디렉토리는 보통 read-only 데이터들을 갖고 있다. Single User Mode 에서는 필요하지 않은 바이너리 파일들을 갖고 있다. /usr/local 디렉토리에는 로컬 바이너리 파일들이 있고, /usr/share/man 에는 맨페이지가 들어있다.
/usr/bin | Non-essential command binaries |
/usr/etc | Non-essential configuration files (usually empty) |
/usr/games | Game data |
/usr/include | Header files used to compile applications |
/usr/lib | Library files |
/usr/lib64 | Library files for 64-bit |
/usr/local | Third-level hierarchy (for machine local files) |
/usr/sbin | Non-essential system binaries |
/usr/share | Read-only architecture-independent files |
/usr/src | Source code and headers for the Linux kernel |
/usr/tmp | Secondary temporary directory |
4) 메인 subdirectory tree 들을 탐색해보고, 각각의 존재 목적을 설명하라. 또한 그 안에 들어있는 내용들은 무엇인지 확인하라.
Table: Main Directories
DIRECTORY 이름 | FHS 안에 있는가? | 목적 |
/ | Yes | Primary directory of the entire filesystem hierarchy. |
/bin | Yes | Essential executable programs that must be available in single user mode. |
/boot | Yes | Files needed to boot the system, such as the kernel, initrd or initramfs images, and boot configuration files and bootloader programs. |
/dev | Yes | Device Nodes, used to interact with hardware and software devices. |
/etc | Yes | System-wide configuration files. |
/home | Yes | User home directories, including personal settings, files, etc. |
/lib | Yes | Libraries required by executable binaries in /bin and /sbin. |
/lib64 | No | 64-bit libraries required by executable binaries in /bin and /sbin, for systems which can run both 32-bit and 64-bit programs. |
/media | Yes | Mount points for removable media such as CDs, DVDs, USB sticks, etc. |
/mnt | Yes | Temporarily mounted filesystems. |
/opt | Yes | Optional application software packages. |
/proc | Yes | Virtual pseudo-filesystem giving information about the system and processes running on it. Can be used to alter system parameters. |
/sys | No | Virtual pseudo-filesystem giving information about the system and processes running on it. Can be used to alter system parameters. Similar to a device tree and is part of the Unified Device Model. |
/root | Yes | Home directory for the root user. |
/sbin | Yes | Essential system binaries. |
/srv | Yes | Site-specific data served up by the system. Seldom used. |
/tmp | Yes | Temporary files; on many distributions lost across a reboot and may be a ramdisk in memory. |
/usr | Yes | Multi-user applications, utilities and data; theoretically read-only. |
/var | Yes | Variable data that changes during system operation. |
5) 루트 디렉토리 밑의 디렉토리들의 사이즈 정보를 얻고 싶으면 다음과 같이 커맨드를 치면 된다.
$ sudo du --max-depth=1 -hx /
* --max-depth=1 : 루트 밑에서 한 단계만 내려가서 트리 밑의 파일들의 사이즈를 재귀적으로 더해나간다.
* -h : 사람이 읽을 수 있는 숫자로 사이즈를 표현하라. (KB, MB, GB)
* -x : 하나의 파일 시스템에만 머물러라. 루트 파티션 외의 다른 파티션은 보지 말아라. (/dev, /proc, /run, /sys 등은 무시하라는 뜻; 왜냐하면 이것들은 가상 파일시스템으로 오직 메모리에만 존재하기 때문. 시스템이 running 하지 않은 떄는 그냥 빈 파일들이다. RHEL 에서 위의 명령을 실행한다면 /usr 밑에 심볼릭 링크로 존재하는 /bin, /sbin, /lib, /lib64 도 나오지 않을 것이다.)
cf. RHEL : Red Hat Enterprise Linux (Cent OS)
6) /proc 파일 시스템 훑어보기