리눅스를 설치하는 일은 단순히 다음 버튼을 누르는 작업이 아니다. 디스크를 어떻게 나눌지(파티션 설계), 부트로더를 어디에 둘지, 시스템이 어떤 순서로 깨어날지를 이해해야 운영체제를 제대로 다룰 수 있다. 특히 리눅스마스터 1급은 실기가 있기 때문에, "전원 버튼을 누른 순간부터 로그인 프롬프트가 뜨기까지" 컴퓨터 안에서 무슨 일이 벌어지는지를 단계별로 설명할 수 있어야 한다. BIOS와 UEFI는 어떻게 다른가, GRUB2는 어디에 설치되며 무엇을 하는가, 커널이 메모리에 올라온 뒤 첫 프로세스인 init/systemd는 어떤 일을 하는가. 오늘은 파티션 설계에서 시작해 부트로더 GRUB2를 거쳐, 부팅의 전 과정을 깊이 추적한다.
물리 디스크 하나를 통째로 쓰는 것은 비효율적이고 위험하다. **파티션(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바이트)에 부트 코드와 파티션 테이블을 담는다. 한계가 명확하다.
**GPT(GUID Partition Table)**는 UEFI와 함께 등장한 현대적 방식이다.
| 항목 |
|---|
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
리눅스 부팅 과정의 순서로 옳은 것은?
문제 2
MBR과 GPT 파티션 방식에 대한 설명으로 옳은 것은?
문제 3
GRUB2 설정을 변경하고 적용하는 올바른 절차는?
문제 4
부팅 과정에서 initramfs(initrd)의 역할로 가장 옳은 것은?
문제 5
SysV init의 런레벨과 systemd 타깃의 대응으로 옳지 않은 것은?
문제 6
BIOS와 UEFI 펌웨어에 대한 설명으로 옳은 것은?
| 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개 제한을 우회한다.
전원 버튼을 누른 순간부터 로그인 화면이 뜨기까지는 거대한 릴레이 경주와 같다. 각 단계가 다음 단계를 깨워 바통을 넘긴다. 전체 흐름을 먼저 보자.
[전원 ON]
↓
1. 펌웨어 (BIOS 또는 UEFI) - 하드웨어 점검(POST), 부팅 장치 선택
↓
2. 부트로더 (GRUB2) - 커널을 메모리에 적재
↓
3. 커널 (vmlinuz) - 하드웨어 초기화, initramfs로 루트 마운트
↓
4. init/systemd (PID 1) - 서비스 시작, 로그인 프롬프트
↓
[로그인 화면]
이제 각 단계를 자세히 들여다보자.
전원이 들어오면 가장 먼저 펌웨어가 깨어난다. 펌웨어는 메인보드의 ROM에 저장된, 하드웨어를 초기화하는 가장 낮은 수준의 소프트웨어다.
**BIOS(Basic Input/Output System)**는 전통적 펌웨어다. 켜지면 **POST(Power-On Self-Test)**를 실행해 CPU·메모리·키보드 등 핵심 하드웨어가 정상인지 점검한다. 그 후 부팅 우선순위에 따라 부팅 장치를 찾고, 그 디스크의 첫 섹터인 MBR(512바이트)을 읽어 거기 담긴 부트 코드를 실행한다.
**UEFI(Unified Extensible Firmware Interface)**는 BIOS를 대체하는 현대 펌웨어다. BIOS보다 훨씬 발전했다.
/boot/efi, FAT 포맷)에 부트로더를 파일로 저장| 항목 | BIOS | UEFI |
|---|---|---|
| 부트로더 위치 | MBR(첫 섹터) | ESP(EFI 파티션의 파일) |
| 파티션 방식 | 주로 MBR | 주로 GPT |
| 디스크 한계 | 2TB | 2TB 초과 가능 |
| 보안 | 없음 | 시큐어 부트 |
🔍 더 깊이: UEFI의 시큐어 부트는 부트로더와 커널에 디지털 서명을 요구해, 루트킷이 부팅 과정에 끼어드는 것을 막는다. 리눅스 배포판들은 이를 위해 "shim"이라는 마이크로소프트 서명을 받은 작은 부트로더를 거쳐 GRUB을 로드한다. 시큐어 부트가 켜진 상태에서 서명 안 된 커널 모듈을 적재하려면 추가 설정(MOK 등록)이 필요하다는 점이 실무 함정이다.
펌웨어가 바통을 넘기면 **부트로더(boot loader)**가 등장한다. 부트로더의 임무는 단 하나, 커널을 디스크에서 찾아 메모리에 올리고 제어권을 넘기는 것이다. 리눅스의 표준 부트로더는 **GRUB2(GRand Unified Bootloader 2)**다.
GRUB2는 이전 버전 GRUB Legacy를 완전히 새로 작성한 것으로, 다음 특징이 있다.
GRUB2의 설정은 두 곳으로 나뉜다. 사용자가 직접 만지는 곳과, 자동 생성되는 곳이 다르다는 점이 매우 중요하다.
# 사용자가 편집하는 설정 파일들
/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-*)를 메모리에 올리고 제어권을 넘기면, 이제 커널이 주인공이 된다. 커널은 다음 일을 한다.
여기서 **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 없음)로, 주로 디버깅에 쓰인다.
커널이 마지막으로 하는 일은 **init 프로세스(PID 1)**를 실행하는 것이다. 이 프로세스는 모든 다른 프로세스의 조상이 되며, 시스템이 꺼질 때까지 절대 죽지 않는다. 그 임무는 시스템을 사용 가능한 상태로 만드는 것, 즉 네트워크·로그·웹서버 같은 서비스를 정해진 순서로 시작하는 것이다.
init에는 역사적으로 두 가지 방식이 있다.
전통적 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로 통일되었다.
오늘은 전원 버튼을 누른 순간부터 로그인 화면까지의 전 과정을 추적했다. 디스크는 파티션으로 나뉘고, 파티션 테이블은 MBR(2TB·4파티션 한계)과 GPT(현대적, UEFI와 짝)로 갈린다. 부팅은 펌웨어(BIOS/UEFI) → 부트로더(GRUB2) → 커널(initramfs로 루트 마운트) → init/systemd(PID 1, 서비스 시작)의 4단계 릴레이로 진행된다. GRUB2 설정은 /etc/default/grub을 고치고 grub2-mkconfig로 재생성해야 하며, systemd는 런레벨을 타깃으로 대체하고 병렬 부팅으로 속도를 높였다. 다음 시간에는 마운트된 파일시스템 안의 디렉터리 구조(FHS)와, 리눅스에서 "모든 것은 파일"이라는 철학이 구체적으로 어떤 파일 종류로 나타나는지를 다룬다.