Chapter2.1 Linux FHS(Filesystem Hierarchy Standard)

2025. 5. 8. 00:45·Linux/Linux 기초

 

 

[Linux] FHS를 이루는 폴더들 (1)

2016/04/25 - [About Study/Linux] - [Linux] Filesystem Hierarachy Standard(FHS) 이전 글에서 다뤘던 FHS의 구성 폴더와 그 목적에 대해서 조금더 다뤄보고자 한다. / (or /root) root partition, 혹은 root directory는 시스템이 b

talkingaboutme.tistory.com

 

  • / (or /root)

    root partition, 혹은 root directory는 시스템이 booting하는데 필요한 필수적인 utility들을 가지고 있어야 하며, 정상적으로 부팅이 된 이후에는 하위 directory나 partition들을 mount시켜야 한다. 그렇기 때문에 여기에는 utility들, booting시 필요한 configuration 파일들, 또한 이미지를 일정한 memory address에 load시켜주는 bootloader 같은 startup과 관련된 data들이 들어있다고 보면 될거 같다.



  • /bin

    보통 여기에는 시스템 관리자나 그외 권한이 없는 사람이 시스템을 구동하는데 필요한 프로그램이나 스크립트가 들어있는 폴더이다. 그리고 일반적으로 이 폴더에는 또 다른 subdirectory가 존재하지 않는다. 그런데 아마 안드로이드나 리눅스를 많이 살펴본 사람이라면 /bin 뿐만 아니라 /sbin도 있고, /usr/bin 도 있는 것을 볼수 있었을텐데 폴더마다 또 차이가 있다.

    - /bin : 일반적으로 single user mode나 뭔가의 오류가 발생해 repair해야 될 상황이 있을때 root내에서 필요한 프로그램들이 담겨있는 directory이다.

    - /sbin : sbin이란 system bin이라는 말인데, 일반 사용자들을 잘 쓰지 않을 boot 관련 프로그램들이 담겨있는 directory이다.

    - /usr/bin : 일반적으로 많이 사용하는 프로그램들이 주로 담기 폴더이며, 딱히 권한이 있지 않더라도 유저들이 자유롭게 실행시킬 수 있는 프로그램들이 담겨 있다.

    이외에도 /usr/local 하위에도 bin 혹은 sbin 폴더가 존재할 수도 있는데, 이는 locally하게 존재하냐 아니냐의 차이일 뿐 바로 위에서 설명한 각 폴더의 개념과 거의 동일하다. 참고로 /bin에도 있고, /usr/bin에도 있는 프로그램이 있을 수도 있는데, 이는 그 실체가 두개 다 존재하는 것이 아니라 보통 하나의 symbolic link, 다시 말해 바로가기식으로 되어 있는 경우가 있다. 

     일반적으로 /bin에 들어있는 프로그램으로는

    cat, chgrp, chmod, chown, cp, date, dd, df, dmesg, echo, false, hostname, kill, ln, login, ls, mkdir, mknod, more, mount, mv, ps, pwd, rm, rmdir, sed, sh, stty, su, sync, true, umount, and uname.

    들이 있고, 아마 linux를 많이 사용한 사람이라면 익숙할만한 command일 것이다.



  • /boot

    여기에는 시스템이 booting하는데 필요한 필수적인 파일들이 들어있는데, 물론 여러가지가 있을 수도 있겠지만, 가장 기억해야 될게 두가지 있다. 일단 ubuntu에는 이렇게 되어 있다.
    여기서 중요한 두가지는 initramfs(혹은 initrd) 라고 불리는 ramdisk와 vmlinuz 이다. initramfs도 일종의 file system인데, system이 startup되는 동안 memory로 load되어야 할 데이터들이 저장되어 있는 뭉텅이다. 물론 정상적으로 booting이 끝난 후에는 우리가 알고 있는 root directory로 mount되는 것으로 알면 좋을거 같다.

     vmlinuz란 일종의 linux kernel image다 아마 위 그림을 봐도 좀 의아한 사람이 있을 수 있다. 생각보다 linux kernel이 명색에 비해서 size가 작아 보이기 때문이다. 그도 그럴것이 vmlinuz 자체가 compressed된 형태, 즉 압축된 형태로 존재하는 kernel image이기 때문이다. kernel code내에는 decompress_kernel()이라는 함수가 존재하는데 그곳에서 이 vmlinuz이 풀린다. 그걸 보고 싶으면 booting시 kernel log를 살펴보면 된다. 그러면 제일 처음 line에

    Decompressing Linux... done 
    Booting the kernel.

    라고 뜨는 것을 볼 수 있는데, 바로 여기서 vmlinuz의 압축이 풀리게 된다.

    물론 이것 이외에도 kernel compile시 설정값들이 저장되는 config 파일이나, kernel내에서 쓰이고 있는 variable이나 function에 대한 정보, 보통 symbol이라고 하는데, 이 symbol table이 담겨 있는 System.map도 존재한다. 지금 소개한 두가지 파일은 booting시 쓰이는게 아니라 kernel debugging시 쓰는 파일이다. 이밖에도 distribution에 따라서는 master boot sector같은 정보도 이 /boot에 담겨 있을 수 있다.

     

  • /dev

    리눅스의 /dev 디렉토리에는 special device file, 혹은 디바이스 노드(device node)라고 불리는 파일들이 존재한다. 이 파일들은 단순한 데이터 파일이 아니라, 실제로 커널이 인식한 하드웨어 디바이스와 연결된 인터페이스 역할을 한다. 예를 들어 SD 카드가 삽입되면, 해당 디바이스를 처리할 수 있는 커널 드라이버가 정상적으로 로드되었을 경우 /dev/mmcblk0와 같은 디바이스 노드가 자동으로 생성된다. 마찬가지로 시리얼 포트가 연결되면 /dev/ttyS0 또는 /dev/ttyUSB0와 같은 형태로 디바이스 노드가 생성된다.

    이러한 디바이스 노드는 I/O 방식에 따라 크게 Character Device(문자 디바이스)와 Block Device(블록 디바이스)로 구분된다. Character 디바이스는 바이트 단위로 데이터를 처리하며, 대표적으로 터미널이나 시리얼 포트가 여기에 속한다. 반면 Block 디바이스는 일정 크기의 블록 단위로 데이터를 읽고 쓰며, 하드 디스크나 SD 카드 같은 저장장치가 이에 해당된다.

    다만 모든 하드웨어가 /dev 아래에 디바이스 노드로 표현되는 것은 아니다. 네트워크 디바이스와 같은 경우에는 디바이스 노드가 생성되지 않으며, 대신 /sys/class/net 디렉토리나 ip link, ifconfig 등의 명령어를 통해 관리된다.

    그렇다면 이런 디바이스 노드들은 누가, 언제 생성하는 걸까? 전통적인 리눅스에서는 수동으로 mknod 명령어를 통해 생성했지만, 현대의 리눅스 배포판에서는 자동으로 생성된다. 그 핵심에는 udev라는 유저스페이스 디바이스 매니저가 있다. 커널이 새로운 하드웨어를 감지하면 udev가 이를 인식하고 적절한 이름과 권한, 심지어는 심볼릭 링크까지 설정하여 /dev 디렉토리 아래에 디바이스 노드를 자동으로 생성해주는 구조다.

    결과적으로 /dev는 단순한 폴더가 아니라, 리눅스 시스템이 커널과 사용자 공간 사이의 하드웨어 인터페이스를 연결하기 위해 사용하는 매우 중요한 공간이며, 이 전체 흐름의 핵심에는 udev의 역할이 있다.

     

  • /etc

    리눅스 시스템에서 /etc 디렉토리는 주로 시스템 설정(configuration) 파일들이 모여 있는 공간이다. 이 폴더 안에는 로컬 환경에 맞춘 다양한 설정 파일들이 존재하며, 시스템의 부팅 방식, 네트워크 설정, 사용자 계정, 서비스 실행 여부 등 운영체제 전반의 동작을 제어하는 정보가 이곳에 저장된다.

    현대 리눅스 시스템은 대부분 systemd를 init 시스템으로 채택하고 있으며, 이에 따라 부팅 과정에서의 초기화 방식도 과거의 SysVinit 방식과는 다소 달라졌다. 전통적으로 /etc/init.d/rcS와 같은 스크립트가 부팅 초기에 실행되던 것과 달리, systemd 기반 시스템에서는 각 서비스 유닛 파일(.service)이 /etc/systemd/ 및 /lib/systemd/ 경로에 위치하며, /etc는 그 중 사용자 정의 및 override 설정을 담당하는 역할을 한다.

    예를 들어 systemd는 부팅 시 /etc/systemd/system/ 아래에 존재하는 유닛 파일들을 참조해 필요한 서비스들을 순차적 또는 병렬로 실행한다. 이러한 설정은 systemctl 명령어를 통해 제어할 수 있으며, /etc 디렉토리는 유닛 파일의 설정 커스터마이징을 위한 주요 위치다.

    또한 /etc 하위에는 여전히 .conf 확장자를 가진 설정 파일들이 존재하며, 이는 각 서비스나 프로그램의 동작 방식을 정의한다. 대표적인 예로 /etc/fstab는 파일시스템 마운트 정보를, /etc/hostname은 호스트 이름을, /etc/network/interfaces 또는 /etc/netplan은 네트워크 설정을 정의한다. 이러한 파일들은 cat 등의 명령어로 내용을 직접 확인하거나 수정할 수 있어, 시스템 관리자에게 있어 /etc는 여전히 가장 핵심적인 설정 공간이다.

    결론적으로 /etc 디렉토리는 과거 SysVinit 기반 시스템에서 중요한 역할을 하던 초기화 스크립트 저장소였으며, 현재는 systemd 기반 시스템에서도 여전히 설정과 커스터마이징의 중심 역할을 담당하고 있다.

     

  • /home

    어쩌면 가장 익숙한 폴더이며, 사용자가 제일 처음 login을 했을때 접근하게 되는 일종의 user directory이다. 여기에는 개인적인 configuration, data, 실행 파일들이 여기에 들어 있다. 예를 들어 bash shell의 configuration file인 bashrc나 vim configuration인 vimrc, ssh의 public key 같은 경우는 개개인마다 다를 수 있으므로 이런 내용들이 그런 폴더에 저장된다. 그런데 이 home의 개념은 보는 사람의 관점에서 조금 다르게 볼 수 있다. 예를 들어 root로 login한 사람이라면, root 하위에 있는 /home은 단순히 /home이라는 subdirectory일 뿐이고, root의 home directory는 /root (혹은 /) 가 된다. 반대로 일반 user로 login을 했다면 이사람에게 home directory는 /home 하위에 자신의 ID로 정의된 directory이다.  또한 이런 home directory에 대한 정의는 보통 $HOME 이라는 환경변수에 정의되어 있다. 만약 자기의 home directory를 바꾸고 싶으면 자신이 원하는 directory를 해당 환경변수에 대입해주면 된다.



  • /lib

    보통 프로그램이 있으면 프로그램이 독립적으로 실행되는 경우도 있지만, 외부 library와의 link를 통해서 API나 기능을 제공받는 프로그램도 존재한다. 이때 외부 library들은 보통 이 폴더에 저장되고 실행 프로그램은 앞에서 소개했던 /bin이나 /sbin에 저장된다. 결국 /bin이나 /sbin에 있는 binrary들이 실행되는데 필요한 library들이 저장되는 폴더라고 보면 될듯하다. 일반적으로 booting이나 filesystem상에서 실행되는데 필요한 명령어들을 제공하기도 하고, 뭔가의 graphical feature를 제공하는 library도 들어있다. 이 밖에도 device driver같이 loadable module 같은 경우는 /lib/modules 하위에 저장되기도 한다. 
     아마 못들어본 사람도 있겠지만 PAM(Pluggable Authentication Module) 같이 security와 관련한 파일들은 lib 하위의 security에 저장된다.
     그리고 참고로 만약 64 bit 운영체제를 사용한다면 lib 이외에도  lib64라는 폴더도 존재할 수 있는데, 이름에도 나와있는 것처럼 64 bit에 맞춰진 library들이 여기에 저장된다.

     

  • /media

    보통 CD나 usb 같이 removable media에 해당하는 filesystem이 mount될때 이 폴더 하위로 subdirectory 형태로 생긴다. 여기서 이전에 잠깐 소개했던 udev가 등장하는데, media를 system에 장착하게 되면 udev는 /media 하위에 폴더를 생성하고, file system을 해당 point에 mount시켜준다. 이때 폴더 이름으로 정해지는 규칙들이 있는데, 이런 규칙에 대한 설정은 보통 /etc/udev나 /usr/lib/udev내에 udev-rules 라는 이름으로 정의되어 있기도 하다. 물론 해당 filesystem이 unmount되는 경우 /media 내의 해당 폴더도 동시에 없어지게 된다.

     

  • /mnt

    directory 이름에도 내재되어 있는 것처럼 filesystem을 임시로 mount시켜주는 용도로 사용된다. 가장 흔하게 쓸수 있는게 network filesystem인데, 아마 samba를 쓰던가 CIFS, AFS를 쓴다면 해당 filesystem이 /mnt쪽으로 mount될 것이다. 혹은 약간 변칙적으로 /media에 mount될 것을 /mnt에 mount시켜서 사용하는 경우도 있긴 한데, 요즘 나오는 Linux Distribution은 거진 위의 형태를 따른다.

     

  • /opt

    linux에서 유저가 프로그램을 설치할때 default로 지정되어 있는 경로가 /opt directory이다. 마치 윈도우에선 program_files 폴더와 같은 형식으로 보면 될거 같다. 아무튼 이렇게 하면 한곳에서 installing과 uninstalling을 할 수 있기 때문에 system management 측면에서 효율적이라고 할 수 있다. 가령 aaa라는 program을 설치하게 되면

     /opt/aaa/

    /opt/aaa/bin/

    /opt/aaa/man/

    와 같은 경로로 형성되는 것이다. 물론 이같은 경우는 유저가 설치용 binary를 이용해서 수동으로 설치한 프로그램일 경우에 이런 작업들을 확인해야 되는 것이지, 실제로로는  rpm이나 apt 같은 packaging tool들이 프로그램 설치나 삭제를 대신해준다.

     

  • /proc & /sys

    지금 소개할 directory나 다음에 소개할 /sys 같은 것을 보통 pseudo file system이라고 하는데, 말그대로 뭔가 실체를 가지지 않은 파일들을 가진 file system을 말한다. 실체가 없는데, file system이라고 부르기 힘들것 같지만, 다른 file system처럼 어떤 정보를 가지고 있고, 그걸 탐색할 수 있기 때문에 filesystem이라고 부르는 것 같다. 실체가 없다는 말의 의미는 다음과 같다. 보통 프로그램이 실행되기 위해서는 디스크의 특정 영역에 있는 데이터가 실행되는 순간 memory로 load되는 형식인데, pseudo file system이라 함은 그런게 디스크에 있는게 아니라 memory 혹은 register의 정보를 담고 있다는 것이다. 특히 /proc은 디스크가 아닌 메모리에 상주해있는 process의 정보를 담고 있다. 당연히 정상적으로 돌아가지 않는 system이라면 /proc이 비어있을 것이다. 

     재미있는 것은 proc 안에 들어 있는 파일의 특성을 살펴보면 다 크기가 0으로 되어 있다는 것이다. 그런데도 해당 파일을 읽어보면 많은 데이터들이 들어 있다. 보통 이런 파일들을 virtual file(or pseudo file)이라고 하는데 이런 파일들은 kernel 내에서 procfs라는 interface로 생성되는 것이다. 기능에 대해 궁금한 사람은 한번 /proc/ 하단에 있는 interrupts, meminfo, partitions 같은 파일들을 살펴보면 좋을 듯 싶다.

     /sys도 큰 맥락에서는 /proc과 비슷한데 차이가 약간 있다. 우선 /proc내의 virtual file들처럼 file information을 읽을수도 있지만 값을 씀으로서 수정도 가능하다. 그래서 보통 sysfs 예제를 꼽으라고 하면 /sys쪽에 나와있는 gpio class를 건드려서 LED를 제어하는 예제들이 많이 있다.(적어도 raspberry pi 예제에서는 그렇다.) 다만 /proc내의 virtual file과는 다르게 파일 하나당 하나의 값만 가질 수 있다. 
     이런식으로 kernel space의 값들을 user level에서 처리할 수 있기 때문에 debugging시 유용하게 쓸 수 있다.

     

  • /tmp

    directory 이름에도 있다시피 임시적인 파일, 즉 동작에 크게 영향을 미치지 않는 파일들이 임시로 저장되는 공간이다. 특성에 따라서는

    - 며칠 지나면 해당 폴더내의 파일들이 저절로 삭제된다.

    - reboot이 될때마다 해당 폴더내의 파일들이 삭제된다.

    - 일종의 ram disk인 tmpfs로 쓰여져 파일들이 임시로 저장될 수 있다.

    같은 성격을 지닐 수 있는데, 이는 Linux Distribution에 따라서 다르다. 유념해야 할 것은 해당 폴더가 ram과 연관이 있기 때문에 크기가 큰 파일을 여기에 저장할 경우 시스템의 메모리 부족을 야기할 수도 있으므로 되도록이면 여기에 파일을 저장하는 것을 피해야 한다는 점이다.

     

  • /usr

    /usr 폴더는 2차 계층 구조라고 할 수 있는데, 보통 system boot과 관련된 파일과 폴더과 있는 /와 다르게 booting과는 연관이 없는 파일들이 저장되어 있다. 그런데 폴더의 형식이나 구성이 / 하위의 구조와 비슷하게 되어있다. /usr 하위로 bin, include , lib, sbin 같은 폴더들이 있다. 여기에는 보통 user-depenedable한 프로그램이나 파일들이 들어있고, 일반적으로 해당 파일들을 read-only 권한만 가지고 있다.

     

  • /var

    var는 variable의 약자인데, 시스템 동작중 자주 바뀌는 파일들이 주로 저장되는 곳이다. 자주 바뀌는 파일이 보통 뭐가 있나 살펴보면

    - log 파일

    - mail이나 print시 발생하는 spool 파일

    - cache content

    - etc

'Linux > Linux 기초' 카테고리의 다른 글

Chapter3. Useful Command Line Techniques  (0) 2025.05.09
Chapter2.3 Systemd에 대하여  (0) 2025.05.09
Chapter2.2 Linux 파일 종류  (0) 2025.05.09
Chapter2. Linux Basics and System Startup  (0) 2025.05.08
Chapter1. Linux Philosophy and Concepts  (0) 2025.05.07
'Linux/Linux 기초' 카테고리의 다른 글
  • Chapter2.3 Systemd에 대하여
  • Chapter2.2 Linux 파일 종류
  • Chapter2. Linux Basics and System Startup
  • Chapter1. Linux Philosophy and Concepts
Dinoj
Dinoj
  • Dinoj
    AlOG
    Dinoj
  • 전체
    오늘
    어제
    • 분류 전체보기 (181)
      • 이론 공부 (63)
        • 기타 학습 (20)
        • UVM (Universal Verification.. (12)
        • AI HARDWARE (12)
        • COMPUTER VISION (18)
        • Python (Pytorch) (1)
      • PROJECTS (29)
        • AI 가속기 (10)
        • 영상 처리 (3)
        • UVM (Universal Verification.. (2)
        • CPU 설계 (5)
        • CMOS VLSI (2)
        • Verilog (2)
        • Firmware (2)
        • C 언어 (2)
        • 기타 프로젝트 (1)
      • Linux (13)
        • Embedded Linux (7)
        • Linux 기초 (6)
      • AMBA BUS (16)
        • AXI BUS (5)
        • APB BUS (2)
        • Vitis (8)
      • AI SOC COURSE (53)
        • 영상 처리 (5)
        • SYSTEM VERILOG (CPU 설계) (20)
        • VERILOG 기초 (5)
        • CMOS VLSI (7)
        • FIRMWARE (9)
        • C PROGRAMMING (1)
        • Python (Keras) (6)
      • 코딩 지식 (5)
        • SYSTEM VERILOG (3)
        • TCL (2)
      • TISTORY (1)
  • 블로그 메뉴

    • 홈
    • 글쓰기
    • 관리
    • Info
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Dinoj
Chapter2.1 Linux FHS(Filesystem Hierarchy Standard)
상단으로

티스토리툴바