리눅스의 디렉터리 구조

Soyun Park·2023년 9월 27일
0
post-thumbnail

1. 기본적인 구조

1-1. 디렉터리 표준 규격

  • 디렉터리 트리
    - 리눅스 파일 시스템은 루트 디렉터리를 시작으로 계층 구조로 구성된다. 전형적인 트리 자료 구조를 따르는데, 이를 디렉터리 트리라고 한다.
  • FHSFile System Hierarchy Standard
    - 리눅스는 배포판 사이에 상당한 차이가 있다.
    - 차이점이 일으키는 불편함으로 인해 디렉터리 구성을 통일하기 위해 FHS가 나왔다.

1-2. /(루트) 디렉터리

  • 디렉터리 트리의 뿌리이면서 가장 위에 위치해 있다.
  • /bin, /sbin, /lib(/lib64), /etc, /dev, /proc와 같은 중요 디렉터리가 위치해 있다.

1-3. bin 디렉터리

  • 실행파일명령어이 보관돼서 부팅할 때 필요한 시스템의 기본 명령어가 있다.
  • /usr/bin에는 그 외의 일반 사용자를 위한 명령어가 있다.
  • bin/usr/bin은 배포판이 관리하는 다렉터리이므로 패키지 시스템을 사용하지 않는다.
  • 그래서 직접 설치한 명령어는 /usr/local/bin에 보관하는 것이 좋다.

1-4. sbin 디렉터리

  • 부팅할 때 필요한 관리자용 명령어들이 있다.
  • /usr/sbin에는 평상시 사용하는 시스템 관리 명령어나 서버 프로그램이 배치된다.

1-5. lib 디렉터리

  • 일반적으로 .../lib.../lib64와 같은 디렉터리에는 라이브러리가 있다.

  • c언어, 루비, 파이썬 등의 라이브러리를 보관한다.

  • 우분투의 경우 lib64 디렉터리를 사용하지 않고 /lib/x86_64-linux-gnu처럼 lib 디렉터리 밑에 한 단계 디렉터리를 만들어 각종 라이브러리를 배치한다.

  • centOS에서는 64비트 라이브러리를 lib64 디렉터리 밑에 두고 32비트 라이브러리나 아키텍처 독립적인 파일을 lib 디렉터리에 둔다.

  • /lib/usr/lib를 구분하는 규칙은 bin과 동일하며, 부팅 시에 필요한지 여부에 따라 갈린다.

  • /lib/usr/lib도 배포판이 관리하는 디렉터리이므로 패키지 시스템을 사용하지 않으며 직접 설치하는 라이브러리는 /usr/local/lib 등에 보관하는 것이 좋다.



2. /usr 디렉터리

2-1. /usr 디렉터리

  • 대학과 기업 등 구성원들이 사용하는 복수의 머신이 네트워크 파일 시스템을 통해 특정 컴퓨터의 파일 시스템을 네트워크를 통해 마운트하여 사용하는 경우가 있다.
  • 네트워크 파일 시스템을 통해 여러 컴퓨터에서 공유할 수 있는 파일을 보관한다.
  • 대표적인 네트워크 파일 시스템으론 NFSSAMBA가 있다.
  • 시스템 한 개에 /usr에 필요한 소프트웨어나 파일을 세팅하고 복수의 시스템이 원격 /usr을 마운트해서 사용하게 한다. 그러면 복수의 컴퓨터에서 동일한 프로그램이나 라이브러리를 사용할 수 있게 된다.
  • 이것이 가능하도록 /usr에 넣는 데이터는 공유할 수 있는 것만 해둬야 한다.
  • 반대로 공유할 수 없는 파일은 /var에 보관한다.

2-2. /usr/src 디렉터리

  • 시스템에서 사용되는 명령어의 소스 코드나 리눅스 커널의 소스 코드를 보관한다.
  • 직접 작성한 소스코드를 보관하지 않도록 한다.

2-3. /usr/include 디렉터리

  • 시스템의 헤더 파일들이 있다.
  • 커널의 헤더 파일을 /usr/include/linux에 보관한다.

2-4. /usr/share 디렉터리

  • 아키텍처CPU의 종류에 독집적이기 때문에 서로 다른 아키텍처에서도 공유할 수 있는 파일이 있다.
  • ex) 도큐먼트, man의 정보, info의 정보

2-5. /usr/share/man 디렉터리

  • man 패키지의 정보가 있다.
  • /usr/share/man 밑에는 man1, man2, man3...이 있으며 뒤의 번호가 섹션 번호이다. 즉 섹션 1의 man 페이지는 /usr/share/man/man1에 있다.
  • 각 섹션의 디렉터리 안에는 실제 man 페이지가 도큐먼트이름.섹션 형식의 파일로 나열되어 있다.
  • 예를 들어 cp 명령어의 man 페이지는 /usr/share/man/man1/cp.1이고 printf 함수의 man 페이지는 /usr/share/man/man3/printf.3이다.
  • man 페이지는 roff라는 텍스트 형식으로 작성된다.

2-6. /usr/local 디렉터리

  • 각 시스템의 관리자가 관리 주체로서 /usr처럼 /bin, /sbin, /lib, /share 등의 디렉터리가 있다.
  • 즉, 각 시스템 관리자는 /usr 바로 밑에 있는 파일을 수정, 삭제하지 말아야 하며 배포판은 /usr/local 밑에 파일을 배치해서는 안된다.

3. /var 디렉터리

3-1. /var 디렉터리

  • 자주 바뀌는 파일을 저장하기 위해 사용한다.
  • 따라서 네트워크 파일 시스템에서 공유하는 파일을 저장하기에는 적합하지 않다.
  • 서버를 운영할 때 로그나 메일 박스가 위치하기 때문에 관리 운영이 매우 중요하다.

3-2. /var/log 디렉터리

  • 서버의 프로세스가 쓰는 로그 파일프로그램에서 발생하는 이벤트가 기록되는 파일이 저장된다.

3-3. /var/spool 디렉터리

  • 사용자 메일/var/spool/mail이나 프린트 입력/var/spool/cups이 일시적으로 저장된다.

3-4. /var/run 디렉터리

  • PID실행 중인 서버 프로세스의 프로세스 ID가 저장된다. 이러한 파일을 PID 파일이라고 한다.

  • 서버 기동 시에 이 디렉터리에다가 PID를 기록하고 종료할 때 제거한다.

  • 예를 들어 inetd 서버의 경우 기동 시에 /var/run/inetd.pid에 자신의 PID를 기록한다.

  • 이를 응용해서 kill 명령어로 inetd에 HUP 옵션프로세스를 재시작 시키는 시그널을 사용해 설정 파일을 다시 읽도록 할 수 있다.

    # kill -HUP `cat /var/run/intetd.pid`



4. 루트 밑의 주요 디렉터리

4-1. /etc 디렉터리

  • 각 시스템의 설정 파일을 보관한다.

4-2. /dev 디렉터리

  • 디바이스 파일이 있다.
  • 리눅스 2.4 이후부터는 시스템에 존재하는 디바이스 파일만을 그 때마다 작성하는 devfsDevice File System가 도입됐다.
  • 하지만 devfs는 USB와 같은 동적 디바이스 대응이 잘 이루어지지 않아 2.6 이후부터는 udev라는 구조가 도입됐다.

4-3. /proc 디렉터리

  • 프로세스 파일 시스템프로세스를 파일 시스템에 표현한 것이 있다.

  • 예를 들어 PID가 1인 프로세스의 정보는 /proc/1을 보면 된다.

  • cat 명령어 등을 사용하면 프로세스들의 다양한 정보를 실시간으로 얻을 수 있다.

  • /proc에서 ls 명령어를 실헹하면 숫자 외의 디렉터리도 있다.

  • 이름이 숫자인 디렉터리는 프로세스에 대응되지만 그외의 파일은 프로세스와 관계가 없다.

  • 예를 들어 /proc/scsi에는 시스템에 연결된 SCSI 디바이스의 정보가 있고 /proc/partitions에는 시스템에 존재하는 파티션의 목록이 있다.

  • 반대로 커널에 뭔가를 지정하도록 응용할 수 있다.

  • 예를 들어 /proc/sys/kernel/hostname 파일을 읽으면 현재 호스트의 이름을 수정할 수 있다.

  • 프로세스 파일 시스템의 각 파일이 역할과 형식은 man 5 proc에서 확인할 수 있다.

4-4. /sys 디렉터리

  • 시스템 관련 정보를 별도로 제공하기 위해 sysfs라는 새로운 파일 시스템이 추가되었다.
  • sysfs를 탑재하는 디렉터리가 /sys이다.
  • 시스템에 존재하는 디바이스나 디바이스 드라이버의 정보를 얻을 수 있다.

4-5. /boot 디렉터리

  • 리눅스 커널은 vmlinuz 파일에 담겨 있다. 이 커널 프로그램을 /boot에 보관한다.

4-6. /root 디렉터리

  • 슈퍼 사용자의 홈 디렉터리이다.

4-7. /tmp, /var/tmp 디렉터리

  • 임시로 어딘가에 파일을 만들고 싶은 경우에 /tmp를 사용한다.
  • 명령어의 출력을 일단 /tmp 밑에 저장하고 다음 과정을 수행한다.
  • /tmp는 리부팅하면 삭제될 수 있으나 /var/tmp는 리부팅해도 삭제되지 않는다.
  • vi의 복구 파일이 /var/tmp에 저장된다.

4-8. 디렉터리

  • 일반 사용자의 홈 디렉터리는 셸에서 환경변수 $HOME으로 접근이 가능하다.
  • 보통 /home/사용자명이지만 큰 조직에서는 /home1, /home2처럼 뒤에 숫자를 붙이기도 한다.



5. 디렉터리를 구분하는 기준

  • 디렉터리를 구분하는 기준은 다음과 같다.

    관점OX
    복수의 호스트에서 공유하는지 여부/usr/var
    읽기 전용인지 여부/usr/var
    아키텍처에 의존적인지 여부/usr/lib/usr/share
    배포자가 관리하는지 여부/usr/usr/local
    리부팅해도 남아 있는지 여부/var/tmp/tmp
  • 이외의 중요한 관점으론 다음이 있다.

    • 백업이 필요한지 여부불변성, 복구 필요성
    • 사용자별로 필요한지, 시스템당 하나만 있으면 되는지 여부ex) 설정파일
    • 권한을 나눠야 하는지 여부
    • 셸에서 glob 패턴와일드카드 문자를 사용하여 다수의 파일 집합을 지정하는 방식으로 저장할 수 있으면 편리한지 여부

0개의 댓글