포스트

리눅스 파일 구조 (ubuntu)

시스템 부팅 및 복구에 필수적인 명령어 실행 파일이 들어있다. ls, grep, apt의 기본 명령어부터, git같은 설치 패키지 명령어까지 들어있다.

리눅스 파일 구조 (ubuntu)
디렉토리설명
/루트 디렉토리. 모든 경로의 시작
/bin필수 실행 파일 (ls, cp, mv, bash 등)
/sbin시스템 관리자용 명령어 (ifconfig, reboot 등)
/boot부팅에 필요한 파일 (커널, grub 등)
/dev장치 파일 (하드디스크, USB, 터미널 등)
/etc설정 파일 (passwd, hosts, ssh/ 등)
/home일반 사용자 디렉토리
/lib기본 시스템 라이브러리 (/bin, /sbin에서 사용하는 .so 파일)
/media외부 장치 마운트 위치 (USB, CD 등)
/mnt임시 마운트 지점
/opt추가 소프트웨어 설치 위치
/proc가상 파일 시스템, 커널/프로세스 정보 (/proc/cpuinfo, /proc/1234)
/rootroot 사용자 홈 디렉토리
/run시스템이 부팅된 후 일시적 데이터 저장 (PID, lock, socket 등)
/tmp임시 파일 저장소 (재부팅 시 삭제)
/usr사용자용 프로그램 및 라이브러리 (/usr/bin, /usr/lib)
/var로그/메일/캐시 등 변경되는 데이터 (/var/log, /var/tmp)

/bin

  • 시스템 부팅 및 복구에 필수적인 명령어 실행 파일이 들어있다.
  • ls, grep, apt의 기본 명령어부터, git같은 설치 패키지 명령어까지 들어있다.
  • 원래는 git, python등의 사용자용 일반 명령어는 /usr/bin이라는 디렉토리에 위치해있다. 하지만 현재 결과는 기본 명령어부터 사용자용 일반 명령어도 있음을 확인할 수 있다.
  • 이유는 최신 리눅스 배포판은 /usr/bin/bin의 구분을 명시하지 않기 때문이다.

  • 위 명령어 결과와 같이 /bin디렉토리가 /usr/bin을 가리키는 심볼릭 링크임을 확인할 수 있다. 즉, /binusr/bin의 기능적 차이는 없다.

  • /bin디렉토리에는 모두 컴파일된 바이너리 파일(ELF 포맷)으로 되어있다. (ELF포맷은 리눅스 실행파일 포맷이다.)
  • 해당 파일을 직접 실행하여 명령어를 수행한다. ex) /bin/ls -> ls 명령어가 실행됨
  • /bin을 PATH에 넣었기 때문에 ls만 쳐도 /bin/ls가 실행됨
  • cdbash의 빌트인 명령어 이므로 /bin디렉토리에 없음

/sbin

  • 시스템 관리에 사용되는, 관리자용 명령어 모음 디렉토리이다.

  • 기존의 /bin디렉토리와 별 차이가 없어보이지만, /sbin디렉토리에는 ifconfig, fsck, reboot, mount, iptables와 같은 시스템 관리에 필요한 명령어 실행 파일이 들어있다.

  • /sbin디렉토리 또한, /usr/sbin디렉토리의 심볼릭 링크이다. 즉, /sbin/usr/sbin의 차이는 없다.

/boot

  • 리눅스 시스템이 부팅할 때 필요한 핵심 파일이 들어있는 디렉토리.

  • vmlinuz : 압축된 리눅스 커널 이미지
  • initrd : 초기 드라이버 이미지
  • grub/ : GRUB 부트 로더 설정 파일 및 모듈
  • config-<커널버전> : 커널 컴파일 당시 설정 옵션 기록
  • System.map-<커널버전> : 커널 심볼 테이블

  • 해당 리눅스(우분투)는 AWS의 EC2이므로 위 /boot디렉토리에서 주요 파일들은 aws관련 파일에 대한 심볼릭 링크로 설정되어있다. (EC2는 가상화 환경이므로 일반적인 boot파일과는 호환 안됨 -> AWS전용 버전 파일로 대체됨)

부팅에서 /boot가 쓰이는 방식

  • 전원이 켜지면 BIOS는 부트로더(GRUB)를 실행
  • 부터로더는 /boot디렉토리에 있는 vmlinuz, initrd파일 로드
  • 커널이 메모리에 올라가며 OS 부팅됨

/dev

  • 디바이스 파일이 들어있는 디렉토리이다.
  • 리눅스에서는 모든 하드웨어 장치를 파일처럼 다루기에 cpu, disk와 같은 디렉토리에 존재한다.

  • /sda : 하드디스크
  • /tty : 현재 터미널 세션 (tty2, tty4같이 숫자가 붙어있으면 여러 개의 세션이 존재)
  • /null : 없음을 의미하는 장치 (쓰레기통 역할), 어떠한 데이터든 /dev/null로 보내면 사라짐
  • /zero : 0으로 채워진 무한 스트림, 필요한 만큼 0값을 뽑아내서 사용할 수 있다. (메모리를 초기화할 때 사용)
  • /random, /urandom : 랜덤 데이터 생성 장치
  • /pts/ : 가상 터미널 (ssh 접속용)

  • /dev/null, /dev/zero, /dev/random같은 파일은 얼핏 보면 /bin디렉토리에 들어가야하는 프로그램처럼 보이지만, 실제로는 파일처럼 읽고 쓰는 대상이다.
  • 즉, 파일을 읽고 쓰는 가상의 장치의 역할이므로 /dev디렉토리에 위치해 있다.

/etc

  • 시스템 설정 파일을 담는 디렉토리
  • 리눅스 운영체제, 패키지, 네트워크, 사용자 등의 설정값을 저장한다.
  • 대표 디렉토리들은 다음과 같다.
    • /etc/passwd : 사용자 계정 정보
    • /etc/systemd/ : 시스템 부팅 관리
    • /etc/ssh/ : SSH 서버 설정 파일
  • 이외에도 apt, python3과 같은 패키지 설정 파일도 존재한다.

/lib, /lib32, /lib64, /libx32

  • 필수 라이브러리 파일이 들어있는 디렉토리이다.
  • /bin, /sbin에 있는 실행파일이 실행하는 프로그램이 돌아가기 위한 라이브러리가 들어있다.
  • /lib : 전통적 32비트용 (최근에는 64비트 라이브러리도 사용함)
  • /lib32 : 64비트 리눅스에서 32비트 프로그램 실행용
  • /lib64 : 64비트 프로그램 전용
  • /libx32 : 64비트 CPU용 특수 32비트 ABI프로그램 전용

  • 위 네 디렉토리 모두 /usr의 라이브러리 디렉토리의 심볼릭 링크이다.

/media

  • 외부 저장 장치를 마운트하는 표준 디렉토리이다.
  • USB, 외장 하드디스크 등을 꽂으면 자동으로 /media밑에 마운트된다.

/mnt

  • 수동으로 장치 혹은 파일시스템을 임시로 마운트하는 디렉토리이다.
  • /media와 차이점은 /media는 자동으로 외부장치가 마운트되지만, /mnt는 사용자가 수동으로 마운트를 진행해야한다는 점이다.

/opt

  • optional의 약자로, 외부 소프트웨어를 넣는 디렉토리이다.
  • 패키지(apt, yum)으로 설치되는 것이 아닌 프로그램이 해당된다.

/proc

  • 프로세스 정보와, 커널 내부의 정보를 파일처럼 보여주는 가상 파일 디렉토리이다.
  • 실제 파일이 아닌, 커널이 메모리 안에서 실시간으로 만들어줌

  • /proc/cpuinfo : CPU정보
  • /proc/meminfo : 메모리 사용량 정보
  • /proc/uptime : 시스템 부팅 후 지난 시간
  • /proc/version : 커널 버전
  • /proc/[pid]/ : pid의 id를 가진 프로세스의 상세 정보

  • 커널이 실시간으로 만드는 디렉토리이기에 실시간으로 디렉토리와 파일이 변경됨을 확인할 수 있다.

/root

  • root 사용자만 접근할 수 있는 홈 디렉토리

/run

  • 부팅 이후 시스템이 운영되는 동안 필요한 임시 데이터를 저장함
  • 메모리에 있는 파일 시스템에 저장된다. (디스크에 저장 X)
  • 리부팅하면 전부 사라짐
  • PID파일, 소켓 파일, 네트워크 상태 정보 같은 것들이 들어간다.

  • docker.sock라는 소켓파일을 통해, 도커 컨테이너와 호스트가 통신할 수 있도록 한다.

/tmp

  • 프로그램이 생성한 임시 파일을 저장하는 공간
  • 재부팅하면 대부분 자동으로 비워진다.

/usr

  • 유저들이 사용할 사용자용 프로그램을 모아둔 디렉토리이다.

  • 위에서 언급했듯이, /bin/, /sbin, /sbin/, /lib의 심볼릭 링크가 가리키는 디렉토리들이 /usr에 모여있다.
  • /usr/include : C/C++ 헤더파일
  • /usr/local : 사용자가 직접 설치한 프로그램/라이브러리 (패키지 매니저랑 별개)
  • /usr/src : 커널 소스 저장

/var

  • 내용이 계속 변하는 파일들이 저장되는 디렉토리
  • 시스템 로그 파일, 오래 보존되는 임시 파일, 캐시 데이터, 프로그램 자체 데이터베이스 등이 이에 해당한다.
  • 많은 파일들이 이곳에 몰리므로 주기적으로 모니터링하고 정리가 필요하다.

  • /var/log : 시스템의 로그 파일이 저장된다.
  • /var/tmp : 오래 저장되는 임시 파일이 저장된다.
  • /var/spool : 대기중인 작업 파일이 저장된다.
  • /var/lib : 프로그램 자체 데이터베이스가 저장된다. (mysql 데이터 파일)
  • /var/cache : 프로그램 캐시 데이터
  • /var/run : /run의 심볼릭 링크

  • 다음은 /var/log의 구조이다.

  • auth관련한 로그들이 쌓여있는 것을 확인할 수 있다.
  • logrotate라는 리눅스 표준 로그 관리 도구가 이를 관리한다.
  • 시간이 지나 로그 파일의 용량이 커지면 자동으로 숫자를 붙여 백업하고 gz로 압축하여 디스크 공간을 절약한다.
  • 숫자가 클 수록 오래된 로그이다.

원문: Velog

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.