1. 1단계 - 하드웨어를 깨우는 마법 (BIOS & UEFI)
우리는 매일 아침 컴퓨터 전원 버튼을 무심코 누릅니다. 그리고 몇 초 뒤, 익숙한 바탕화면이나 로그인 창이 뜹니다. 그 짧은 몇 초 동안 컴퓨터는 "죽은 쇳덩이" 상태에서 "생각하는 기계" 상태로 전환하기 위해 엄청나게 복잡한 준비 운동을 합니다.
이 과정을 부팅(Booting)이라고 합니다. '부팅'이라는 단어는 '부트스트랩(Bootstrap)'에서 왔습니다. "장화 끈(Bootstrap)을 잡고 스스로를 들어 올린다"는 뜻으로, 외부의 도움 없이 스스로 운영체제를 메모리에 올리는 과정을 비유한 말입니다.
리눅스 시스템을 기준으로, 이 과정이 정확히 어떻게 일어나는지 6단계로 나누어 파고들어봤다.
POST (Power-On Self-Test)
전원 버튼을 누르면 메인보드에 전기가 흐르고, CPU는 약속된 메모리 주소(ROM)에 있는 BIOS(Basic Input/Output System) 프로그램을 실행합니다. BIOS는 가장 먼저 POST를 수행합니다.
- "램(RAM)은 잘 꽂혀 있나?"
- "키보드와 마우스는 연결됐나?"
- "그래픽 카드는 문제없나?"
문제가 없으면 "삑" 소리와 함께 다음 단계로 넘어갑니다. (비프음이 여러 번 들리면 하드웨어 고장입니다).
BIOS vs UEFI
요즘 컴퓨터는 BIOS 대신 UEFI(Unified Extensible Firmware Interface)를 씁니다.
- BIOS: 16비트 레거시 모드. MBR 파티션(2TB 제한)만 인식 가능. 느리고 못생김(파란 화면).
- UEFI: 32/64비트 최신 표준. GPT 파티션(무제한) 인식 가능. 마우스 사용 가능, 네트워크 부팅 지원, Secure Boot(서명되지 않은 악성 부트로더 거부) 지원.
2. 2단계 - 부팅 장치 찾기 (MBR/GPT)
BIOS/UEFI는 설정된 순서대로(Boot Priority) 저장 장치(SSD/HDD/USB)를 확인합니다. 부팅 디스크를 찾으면, 그 디스크의 가장 첫 번째 섹터(0번 섹터)를 읽어들입니다.
MBR (Master Boot Record)
전통적인 BIOS 방식에서는 이 512바이트 공간을 MBR이라고 합니다. 이 작은 공간에는 두 가지 핵심 정보가 들어있습니다.
- 부트로더(Boot Loader)의 앞부분 (446바이트): 다음 단계 프로그램을 실행시키기 위한 코드.
- 파티션 테이블(Partition Table) (64바이트): 디스크가 어떻게 쪼개져 있는지에 대한 정보.
UEFI 방식에서는 MBR 대신 EFI 시스템 파티션(ESP)이라는 별도의 파티션에 있는 .efi 실행 파일을 직접 읽어서 부트로더를 실행합니다. 훨씬 현대적이고 유연하죠.
3. 3단계 - 부트로더 (Bootloader) - GRUB
MBR이 호출하는 것이 바로 부트로더입니다. 리눅스에서는 대부분 GRUB2 (GRand Unified Bootloader)를 사용합니다.
컴퓨터 켤 때 검은 화면에 "Ubuntu로 부팅하시겠습니까, Windows로 부팅하시겠습니까?" 묻는 메뉴가 나오는 단계가 바로 여기입니다. 윈도우가 설치된 파티션을 감지(os-prober)해서 메뉴에 추가해주는 것도 GRUB의 역할입니다. 이를 통해 멀티 부팅(Multi-boot)이 가능해집니다.
사용자가 선택을 하거나 시간이 지나면(Timeout), GRUB은 디스크(/boot)에 저장된 커널(Kernel) 이미지를 메모리(RAM)로 로드합니다.
그리고 제어권을 커널에게 넘깁니다. "이제부터 네가 대장이야."
4. 4단계 - 커널 (Kernel) 로드 - 운영체제의 심장
이제야 운영체제(OS)의 심장인 커널이 메모리에 올라왔습니다.
커널 파일(vmlinuz)은 압축되어 있는데, 스스로 압축을 풀고 하드웨어 제어권을 완전히 장악합니다.
- 하드웨어 초기화: 메모리 관리, 인터럽트 처리기, 프로세스 스케줄러 등을 초기화합니다.
- 드라이버 로드: 연결된 장치(그래픽카드, 랜카드, 사운드카드) 드라이버를 로드합니다. (
dmesg명령어로 확인 가능)
닭이 먼저냐 달걀이 먼저냐 (Initramfs)
여기서 딜레마가 생깁니다. "하드디스크를 읽으려면 파일 시스템 드라이버(예: ext4)가 필요한데, 그 드라이버 파일이 하드디스크 안에 있다!" 드라이버를 읽으려면 드라이버가 필요한 상황입니다.
이를 해결하기 위해 initramfs (Initial RAM Filesystem)라는 임시 파일 시스템을 사용합니다.
커널은 메모리에 있는 작은 가상 디스크(initramfs)를 먼저 마운트합니다. 여기에는 부팅에 필수적인 드라이버들만 모여 있습니다.
이 드라이버들을 이용해 비로소 진짜 하드디스크(/)를 마운트(Mount)할 수 있게 됩니다.
커널 패닉(Kernel Panic): 만약 이 과정에서 루트 파일 시스템을 찾지 못하거나 깨졌다면? 커널은 더 이상 진행할 수 없어 시스템을 멈춥니다. 윈도우의 블루스크린과 같은 상태입니다.
5. 5단계 - Init 프로세스 (PID 1) - 시조새의 탄생
커널이 모든 준비를 마치면, 시스템의 첫 번째 프로세스를 실행시킵니다.
바로 /sbin/init입니다. (최신 리눅스는 /lib/systemd/systemd로 심볼릭 링크되어 있습니다).
이 프로세스는 PID(Process ID) 1번을 부여받습니다. 이건 상징적인 의미가 큽니다.
- 불멸: 시스템이 꺼질 때까지 절대 죽지 않습니다.
- 부모: 이후 실행되는 모든 프로세스의 조상(Parent)입니다.
- 고아원: 부모가 죽어버린 고아 프로세스(Zombie Process)들을 입양해서 처리(Reap)합니다.
과거에는 SysVinit이라는 쉘 스크립트 기반 방식을 썼지만, 부팅 속도가 느려서(순차 실행), 요즘은 Systemd라는 병렬 실행 방식을 표준으로 씁니다.
6. 6단계 - 서비스 실행 (Runlevel / Systemd Targets)
PID 1번 systemd는 이제 /etc/systemd/system 등에 정의된 설정 파일(Unit File)들을 읽어서 필요한 서비스들을 병렬로 실행시킵니다.
default.target: 부팅의 목표 지점입니다. 보통graphical.target으로 연결됩니다.multi-user.target: (구 런레벨 3) 텍스트 모드. 서버용.graphical.target: (구 런레벨 5) 그래픽 모드(GUI). 데스크탑용.
이 단계에서 다음과 같은 서비스 데몬들이 일어납니다.
- 네트워크 설정 (
NetworkManager,dhcpcd) - 웹 서버 (
Nginx,Apache) - 데이터베이스 (
MySQL,PostgreSQL) - 로그인 매니저 (
GDM,LightDM)
마침내 로그인 화면이 뜨면 부팅 끝! 운영체제가 사용자의 명령을 기다리는 상태(Idle)가 됩니다.
7. 트러블슈팅 가이드 - 부팅이 안 될 때
개발자라면 부팅이 멈췄을 때 "그냥 고장 났네" 하고 포맷하기보다, 어느 단계에서 멈췄는지 파악해야 합니다.
- 화면이 아예 안 나온다 / 비프음만 들린다: 1단계(BIOS/하드웨어) 문제입니다. 램이나 그래픽카드 접촉 불량일 가능성이 큽니다.
- "Operating System Not Found" 메시지: 2단계(MBR/디스크) 문제입니다. 부팅 순서가 잘못됐거나 디스크가 물리적으로 죽었을 수 있습니다.
- grub> 프롬프트만 나오고 멈춘다: 3단계(부트로더) 문제입니다. GRUB 설정이 깨졌습니다. 부팅 USB로 복구해야 합니다.
- 검은 화면에 텍스트가 쏟아지다가 "Kernel Panic": 4단계(커널) 문제입니다. 최근에 커널 업데이트를 했다면, GRUB 메뉴에서 이전 버전 커널을 선택해서 부팅해보세요.
- 부팅은 되는데 특정 서비스(DB 등)가 안 뜬다: 6단계(Systemd) 문제입니다.
systemctl status 서비스명또는journalctl -xe명령어로 에러 로그를 확인하세요.
유용한 명령어
dmesg: 커널 부팅 로그를 다시 보여줍니다.systemd-analyze blame: 부팅 도중 어떤 서비스가 시간을 가장 많이 잡아먹었는지 범인을 찾아줍니다. (부팅 속도 최적화할 때 꿀팁!)journalctl -b: 이번 부팅의 전체 로그를 봅니다.journalctl -b -1: 이전 부팅(즉, 아까 컴퓨터가 강제로 꺼지기 전)의 로그를 봅니다.
8. 마치며
부팅 과정을 이해하는 것은 컴퓨터라는 기계와 운영체제라는 소프트웨어가 어떻게 악수를 하고 주도권을 주고받는지 이해하는 과정입니다. 단순히 전원을 켜는 행위 뒤에 수십 년간 엔지니어들이 쌓아올린 정교한 추상화 계층이 있다는 사실, 놀랍지 않나요?