전원 버튼을 누른 순간부터 로그인 프롬프트가 뜨기까지 무슨 일이 벌어지는지를 단계별로 설명할 수 있어야 한다. 그 출발점이 디스크 설계다.
파티션(partition): 하나의 물리 디스크를 논리적으로 여러 개의 독립된 영역으로 나누는 것.
격리: 한 파티션이 가득 차거나 손상되어도 다른 파티션은 안전하다. 로그가 폭주해 /var가 가득 차도 /(루트)는 멀쩡하다.
유연성: 파티션마다 다른 파일시스템·마운트 옵션을 적용할 수 있다.
백업/복구 단위: 파티션 단위로 백업하고 복구할 수 있다.
파티션
마운트 지점
역할
루트
/
시스템 전체의 기준점, 필수
부트
/boot
커널 이미지와 부트로더 파일(별도 분리 권장)
스왑
swap
가상 메모리, RAM 부족 시 보조
홈
/home
사용자 데이터, 재설치 시 보존 유리
가변
/var
로그·캐시·메일 등 자주 변하는 데이터
스왑(swap)은 특별하다. 디렉터리에 마운트되지 않고, RAM이 부족할 때 사용하지 않는 메모리 페이지를 디스크로 내보내는(swap out) 가상 메모리 공간이다.
과거에는 "스왑 = RAM의 2배"가 정설이었지만, RAM이 충분한 현대 시스템에서는 RAM과 같거나 그보다 작게 잡기도 한다.
/boot를 별도 파티션으로 분리하는 전통적 이유는 두 가지다. 첫째, 과거 BIOS는 디스크의 앞쪽 일정 범위(1024 실린더) 안에서만 커널을 읽을 수 있었기 때문에 부트 파일을 디스크 앞쪽에 두어야 했다. 둘째, 루트 파일시스템이 LVM·암호화·RAID 등으로 복잡해도 /boot만은 단순하게 유지해 부트로더가 확실히 접근하게 하기 위함이다.
파티션 정보는 디스크 어딘가에 "파티션 테이블"로 기록된다. 두 가지 방식이 있고 1급 시험에서 비교하는 주제다.
MBR(Master Boot Record): 1983년부터 쓰인 전통적 방식. 디스크의 첫 번째 섹터(512바이트)에 부트 코드와 파티션 테이블을 담는다.
최대 2TB까지만 인식(섹터 주소 32비트 한계)
주 파티션(primary) 최대 4개. 더 필요하면 확장 파티션(extended) 1개를 만들고 그 안에 논리 파티션(logical)을 둔다.
GPT(GUID Partition Table): UEFI와 함께 등장한 현대적 방식.
최대 9.4ZB(사실상 무제한) 디스크 지원
기본 128개의 파티션 지원
파티션 테이블을 디스크 앞뒤에 이중 저장해 손상에 강함
항목
MBR
GPT
최대 디스크
2TB
9.4ZB
파티션 수
주4 또는 주3+확장1
기본 128개
펌웨어
BIOS
UEFI(BIOS 호환 가능)
백업
단일
앞뒤 이중 저장
# 디스크와 파티션 정보 확인lsblk # 블록 장치를 트리 형태로fdisk -l # MBR/GPT 파티션 테이블 상세parted -l # GPT를 더 잘 다루는 도구blkid # 파티션의 UUID와 파일시스템 타입# 직접 쳐보기: 현재 디스크 구조를 트리로 확인lsblk -f # 파일시스템 정보까지 표시
⚠️ 함정: MBR에서 "주 파티션 4개 + 확장 파티션"이라는 표현은 틀렸다. 확장 파티션도 4개의 슬롯 중 하나를 차지하므로, 정확히는 "주 파티션 최대 4개, 또는 주 파티션 3개 + 확장 파티션 1개"다. 확장 파티션 안에 논리 파티션을 여러 개 만들어 4개 제한을 우회한다.
전원이 들어오면 가장 먼저 펌웨어가 깨어난다. 메인보드의 ROM에 저장된, 하드웨어를 초기화하는 가장 낮은 수준의 소프트웨어다.
BIOS(Basic Input/Output System) — 전통적 펌웨어.
POST(Power-On Self-Test)를 실행해 CPU·메모리·키보드 등 핵심 하드웨어가 정상인지 점검한다.
부팅 우선순위에 따라 부팅 장치를 찾고, 그 디스크의 첫 섹터인 MBR(512바이트)을 읽어 거기 담긴 부트 코드를 실행한다.
UEFI(Unified Extensible Firmware Interface) — BIOS를 대체하는 현대 펌웨어.
GPT 디스크와 2TB 초과 디스크 지원
EFI 시스템 파티션(ESP)이라는 전용 파티션(보통 /boot/efi, FAT 포맷)에 부트로더를 파일로 저장
시큐어 부트(Secure Boot)로 서명되지 않은 부트로더·커널 실행 차단
그래픽 설정 화면, 마우스 지원, 네트워크 부팅 등
항목
BIOS
UEFI
부트로더 위치
MBR(첫 섹터)
ESP(EFI 파티션의 파일)
파티션 방식
주로 MBR
주로 GPT
디스크 한계
2TB
2TB 초과 가능
보안
없음
시큐어 부트
UEFI의 시큐어 부트는 부트로더와 커널에 디지털 서명을 요구해, 루트킷이 부팅 과정에 끼어드는 것을 막는다. 리눅스 배포판들은 이를 위해 "shim"이라는 마이크로소프트 서명을 받은 작은 부트로더를 거쳐 GRUB을 로드한다. 시큐어 부트가 켜진 상태에서 서명 안 된 커널 모듈을 적재하려면 추가 설정(MOK 등록)이 필요하다는 점이 실무 함정이다.
부트로더(boot loader)의 임무는 단 하나 — 커널을 디스크에서 찾아 메모리에 올리고 제어권을 넘기는 것.
리눅스의 표준 부트로더는 GRUB2(GRand Unified Bootloader 2). 이전 버전 GRUB Legacy를 완전히 새로 작성한 것이다.
여러 운영체제·커널 중 선택하는 부팅 메뉴 제공
모듈식 구조로 다양한 파일시스템·장치 지원
부팅 시 셸로 들어가 명령을 직접 입력 가능(복구에 유용)
설정은 사용자가 직접 만지는 곳과 자동 생성되는 곳으로 나뉜다. 이 구분이 매우 중요하다.
# 사용자가 편집하는 설정 파일들/etc/default/grub # 기본 설정(타임아웃, 커널 파라미터 등)/etc/grub.d/ # 메뉴 항목 생성 스크립트들# 자동 생성되는 최종 설정 파일 (직접 편집 금지!)/boot/grub2/grub.cfg # 레드햇 계열/boot/grub/grub.cfg # 데비안 계열# 설정 변경 후 grub.cfg를 재생성해야 적용됨grub2-mkconfig -o /boot/grub2/grub.cfg # 레드햇 계열update-grub # 데비안 계열(grub-mkconfig 래퍼)
실수하기 쉬운 부분은 /boot/grub2/grub.cfg를 직접 편집하는 것이다. 이 파일은 /etc/default/grub과 /etc/grub.d/를 바탕으로 자동 생성되므로 다음 grub2-mkconfig 실행 시 덮어써진다.
올바른 절차: /etc/default/grub을 수정한 뒤 grub2-mkconfig로 재생성한다.
# 직접 쳐보기: GRUB 기본 설정 확인cat /etc/default/grub# GRUB_TIMEOUT=5 메뉴 대기 시간(초)# GRUB_DEFAULT=0 기본 부팅 항목 번호# GRUB_CMDLINE_LINUX="..." 커널에 넘길 부팅 파라미터
⚠️ 함정: 시험에서 "GRUB2 설정을 변경한 후 적용하는 명령"으로 grub2-mkconfig -o /boot/grub2/grub.cfg를 묻는다. /boot/grub2/grub.cfg를 직접 vi로 편집했다는 보기는 틀린 절차다. 또한 레드햇은 grub2-, 데비안은 grub-(또는 update-grub) 접두어를 쓰는 차이도 출제된다.
GRUB의 "GRand Unified Bootloader"라는 이름은 물리학의 "대통일 이론(Grand Unified Theory)"을 패러디한 것이다. 하나의 부트로더로 모든 운영체제를 통일해 부팅하겠다는 야심을 담았다. 실제로 GRUB은 리눅스뿐 아니라 윈도우, BSD 등 거의 모든 OS를 체인 로딩(chain loading)으로 부팅할 수 있다.
GRUB2가 커널 이미지(/boot/vmlinuz-*)를 메모리에 올리고 제어권을 넘기면, 이제 커널이 주인공이 된다.
압축을 풀고 자기 자신을 메모리에 전개한다(vmlinuz는 압축된 커널).
CPU·메모리·기본 장치를 초기화한다.
initramfs(초기 램 파일시스템)를 임시 루트로 마운트한다.
initramfs(initrd)가 필요한 이유: 커널이 진짜 루트 파일시스템(/)을 마운트하려면 그 디스크의 드라이버가 필요한데, 그 드라이버가 정작 루트 파일시스템 안에 있다면 "닭이 먼저냐 달걀이 먼저냐" 문제가 생긴다.
initramfs는 부팅에 필요한 최소한의 드라이버와 도구를 담은 임시 미니 루트 파일시스템이다.
이를 먼저 메모리에 띄워 실제 루트 디스크의 드라이버(예: RAID, LVM, 암호화 장치 드라이버)를 적재한 뒤, 진짜 루트를 마운트한다.
# initramfs 이미지 확인ls /boot/initramfs-* # 레드햇 계열ls /boot/initrd.img-* # 데비안 계열# initramfs 재생성(드라이버 추가 후)dracut -f # 레드햇 계열update-initramfs -u # 데비안 계열
진짜 루트 파일시스템이 마운트되면, 커널은 그 위에서 첫 번째 사용자 프로세스를 실행한다. 그것이 바로 PID 1번 프로세스다.
vmlinuz의 "z"는 압축(zip)을, "vm"은 가상 메모리(virtual memory)를 지원하는 커널이라는 뜻이다. 커널이 압축된 채 저장되는 이유는 디스크 공간 절약과, 부팅 시 디스크에서 읽는 시간을 줄여 압축 해제(CPU로 빠르게 처리) 비용을 상쇄하기 때문이다. 비압축 버전은 vmlinux(z 없음)로, 주로 디버깅에 쓰인다.
이 프로세스는 모든 다른 프로세스의 조상이 되며, 시스템이 꺼질 때까지 절대 죽지 않는다.
임무는 시스템을 사용 가능한 상태로 만드는 것 — 네트워크·로그·웹서버 같은 서비스를 정해진 순서로 시작한다.
전통적 SysV init: 런레벨(runlevel)로 시스템 상태를 정의했다. 0(종료)부터 6(재부팅)까지 숫자로 상태를 구분하고, /etc/rc.d/ 아래의 스크립트를 순서대로 실행했다. 직렬 실행이라 느렸다.
런레벨
상태
0
시스템 종료(halt)
1
단일 사용자 모드(복구)
3
다중 사용자 + 네트워크(텍스트)
5
다중 사용자 + GUI
6
재부팅
systemd: 현대 리눅스의 표준 init. SysV init의 느린 직렬 실행을 병렬 실행으로 바꾸고, 서비스 간 의존성을 자동 관리하며, 런레벨 대신 타깃(target) 개념을 쓴다.
SysV 런레벨
systemd 타깃
3 (텍스트 다중사용자)
multi-user.target
5 (GUI)
graphical.target
0 (종료)
poweroff.target
6 (재부팅)
reboot.target
1 (단일사용자)
rescue.target
# systemd로 서비스 관리systemctl start httpd # 서비스 시작systemctl enable httpd # 부팅 시 자동 시작 등록systemctl status httpd # 상태 확인systemctl get-default # 현재 기본 타깃 확인systemctl set-default multi-user.target # 기본 타깃을 텍스트 모드로# 부팅 시간 분석(systemd 전용)systemd-analyze # 전체 부팅 소요 시간systemd-analyze blame # 서비스별 시작 시간 순위
systemd는 단순한 init이 아니라 시스템 관리 전체를 통합한 거대한 도구 모음이다. 서비스 관리(systemctl), 로그 관리(journalctl), 시간 관리(timedatectl), 네트워크(networkd) 등을 포괄한다. 일부에서는 "유닉스 철학(작은 도구)에 어긋난다"고 비판하지만, 거의 모든 주요 배포판이 systemd를 채택했다. 1급에서는 systemctl 명령과 런레벨↔타깃 대응이 핵심이다.
systemd는 2010년 레드햇의 레너트 푀테링(Lennart Poettering)이 발표했다. 도입 초기 "유닉스 철학 위반", "너무 비대함"이라는 격렬한 논쟁(systemd controversy)이 있었고, 데비안은 init 시스템을 두고 투표까지 했다. 그럼에도 의존성 기반 병렬 부팅의 속도와 일관된 관리 인터페이스라는 장점이 커서, 결국 RHEL·우분투·데비안·SUSE 모두 systemd로 통일되었다.
다음 시간에는 마운트된 파일시스템 안의 디렉터리 구조(FHS)와, 리눅스에서 "모든 것은 파일"이라는 철학이 구체적으로 어떤 파일 종류로 나타나는지를 다룬다.