Linux Foundation Training

[LFS201] Linux Filesystem Tree Layout

Sara.H 2020. 6. 25. 15:27

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 파일 시스템 훑어보기