리눅스 아키텍처
리눅스 시스템의 계층 구조
리눅스는 크게 4개의 주요 계층으로 구성되어 있습니다:
┌─────────────────────────────────┐
│ 사용자 애플리케이션 │ ← 사용자 프로그램들
├─────────────────────────────────┤
│ 시스템 라이브러리 │ ← glibc, 시스템 콜 래퍼
├─────────────────────────────────┤
│ 커널 공간 (Kernel) │ ← 핵심 운영체제
├─────────────────────────────────┤
│ 하드웨어 계층 │ ← CPU, 메모리, 디스크 등
└─────────────────────────────────┘
1. 하드웨어 계층 (Hardware Layer)
가장 아래쪽에 위치한 물리적 하드웨어 구성요소들입니다:
- CPU (Central Processing Unit): 명령어 실행
- 메모리 (RAM): 데이터와 프로그램 임시 저장
- 저장장치: HDD, SSD 등 영구 저장
- 입출력 장치: 키보드, 마우스, 네트워크 카드 등
- 버스: 하드웨어 구성요소 간 데이터 전송 통로
2. 커널 (Kernel) - 리눅스의 핵심
커널은 리눅스 운영체제의 심장부로, 하드웨어와 소프트웨어 사이의 다리 역할을 합니다.
주요 커널 구성요소
프로세스 관리 (Process Management)
# 현재 실행 중인 프로세스 확인
ps aux
# 프로세스 트리 구조 확인
pstree
# 특정 프로세스 정보 확인
cat /proc/[PID]/status
- 프로세스 스케줄링: CPU 시간을 프로세스들에게 할당
- 프로세스 생성/종료: fork(), exec(), exit() 시스템 콜 처리
- 멀티태스킹: 여러 프로세스의 동시 실행 관리
메모리 관리 (Memory Management)
# 메모리 사용량 확인
free -h
# 가상 메모리 정보 확인
cat /proc/meminfo
# 프로세스별 메모리 사용량
cat /proc/[PID]/smaps
- 가상 메모리: 물리 메모리보다 큰 주소 공간 제공
- 페이징: 메모리를 페이지 단위로 관리
- 스왑: 디스크를 임시 메모리로 활용
파일 시스템 (File System)
# 마운트된 파일시스템 확인
mount | column -t
# 파일시스템 사용량 확인
df -h
# inode 정보 확인
ls -li
- VFS (Virtual File System): 다양한 파일시스템에 대한 공통 인터페이스
- ext4, btrfs, xfs: 실제 파일시스템 구현체들
- 파일 권한 및 소유권 관리
장치 드라이버 (Device Drivers)
# 로드된 커널 모듈 확인
lsmod
# 하드웨어 정보 확인
lshw
lspci
lsusb
# 커널 메시지 확인
dmesg | tail
- 하드웨어 추상화: 하드웨어를 소프트웨어로 제어할 수 있게 변환
- 모듈: 동적으로 로드/언로드 가능한 드라이버
- 디바이스 파일:
/dev
디렉토리의 장치 파일들
네트워크 스택 (Network Stack)
# 네트워크 인터페이스 확인
ip addr show
# 네트워크 연결 상태
netstat -tuln
# 라우팅 테이블 확인
ip route show
- TCP/IP 프로토콜 스택: 네트워크 통신 프로토콜 구현
- 소켓: 네트워크 통신을 위한 인터페이스
- 방화벽: iptables, netfilter를 통한 패킷 필터링
3. 시스템 라이브러리 (System Libraries)
사용자 프로그램과 커널 사이의 중간 계층입니다.
glibc (GNU C Library)
# glibc 버전 확인
ldd --version
# 프로그램의 라이브러리 의존성 확인
ldd /bin/ls
- 시스템 콜 래퍼: 커널 시스템 콜을 C 함수로 감싸서 제공
- 표준 C 라이브러리 함수들: printf, malloc, fopen 등
- POSIX 호환성: 유닉스 표준 API 제공
기타 시스템 라이브러리들
- libm: 수학 함수 라이브러리
- libpthread: 스레드 라이브러리
- libssl: 암호화 라이브러리
- libX11: X Window System 라이브러리
4. 사용자 공간 (User Space)
사용자가 직접 실행하는 애플리케이션들이 동작하는 영역입니다.
시스템 유틸리티
# 시스템 정보 확인 도구들
uname -a # 시스템 정보
uptime # 시스템 가동 시간
whoami # 현재 사용자
id # 사용자 ID 정보
셸 (Shell)
# 현재 사용 중인 셸 확인
echo $SHELL
# 사용 가능한 셸 목록
cat /etc/shells
# 셸 프로세스 정보
ps -p $$
- bash, zsh, fish: 다양한 셸 종류
- 명령어 해석: 사용자 입력을 커널이 이해할 수 있는 형태로 변환
- 스크립팅: 자동화된 작업 실행
데스크탑 환경
- X11/Wayland: 그래픽 디스플레이 서버
- GNOME, KDE, XFCE: 데스크탑 환경
- 윈도우 매니저: 창 관리 시스템
리눅스 부팅 과정에서 보는 아키텍처
리눅스 시스템이 부팅되는 과정을 통해 각 계층이 어떻게 초기화되는지 살펴보겠습니다:
1. BIOS/UEFI → 하드웨어 초기화
2. 부트로더 (GRUB) → 커널 로드
3. 커널 초기화 → 하드웨어 감지, 드라이버 로드
4. init 프로세스 → 시스템 서비스 시작
5. 로그인 관리자 → 사용자 세션 시작
# 부팅 메시지 확인
dmesg | head -20
# 시스템 서비스 상태 확인 (systemd)
systemctl status
# 부팅 시간 분석
systemd-analyze blame
가상 파일시스템들
리눅스에는 실제 파일이 아닌 커널 정보를 파일 형태로 제공하는 특별한 파일시스템들이 있습니다:
/proc 파일시스템
# 프로세스 정보
ls /proc/[PID]/
# 시스템 정보
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/version
/sys 파일시스템
# 하드웨어 정보
ls /sys/class/
ls /sys/devices/
# CPU 정보
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
/dev 파일시스템
# 디바이스 파일들
ls -la /dev/
# 블록 디바이스
ls /dev/sd*
# 문자 디바이스
ls /dev/tty*
커널 공간 vs 사용자 공간
리눅스에서 가장 중요한 구분은 커널 공간과 사용자 공간의 분리입니다:
커널 공간 (Kernel Space)
- 권한: 하드웨어에 직접 접근 가능
- 메모리: 물리 메모리에 직접 매핑
- 실행 모드: 특권 모드 (Ring 0)
- 보호: 사용자 프로그램에서 직접 접근 불가
사용자 공간 (User Space)
- 권한: 제한된 권한, 시스템 콜을 통해서만 커널 기능 사용
- 메모리: 가상 메모리 주소 공간
- 실행 모드: 사용자 모드 (Ring 3)
- 보호: 다른 프로세스나 커널에 영향을 주지 못함
시스템 콜 (System Calls)
사용자 공간과 커널 공간을 연결하는 인터페이스입니다:
# 프로그램이 사용하는 시스템 콜 추적
strace ls
# 시스템 콜 통계
strace -c ls
# 특정 시스템 콜만 추적
strace -e trace=open,read,write cat /etc/hostname
주요 시스템 콜 카테고리
- 파일 조작: open(), read(), write(), close()
- 프로세스 관리: fork(), exec(), wait(), exit()
- 메모리 관리: mmap(), brk(), sbrk()
- 네트워크: socket(), bind(), listen(), accept()
리눅스 아키텍처의 장점
모듈성
- 각 구성요소가 독립적으로 개발/유지보수 가능
- 드라이버를 동적으로 로드/언로드 가능
확장성
- 임베디드 시스템부터 슈퍼컴퓨터까지 확장 가능
- 다양한 하드웨어 아키텍처 지원
안정성
- 커널과 사용자 공간의 엄격한 분리
- 한 프로세스의 오류가 전체 시스템에 영향을 주지 않음
이식성
- 표준화된 인터페이스 (POSIX)
- 다양한 CPU 아키텍처 지원 (x86, ARM, RISC-V 등)
현업에서 업무하다보니 서버작업 등 다양한 곳에서 필요한 것을 알게 되었고 선임이 없을때 제가 작업을 요청받았을때 아무것도 못하는 것을 보고 공부를 해야 할 것 같아 공부를 시작합니다.