
부팅 과정(Boot Process): 전원 버튼부터 로그인 화면까지
컴퓨터의 전원을 켜면 내부에서 무슨 일이 일어날까? BIOS vs UEFI, MBR vs GPT, GRUB, Kernel, Init, Systemd까지 리눅스 부팅의 6단계와 트러블슈팅 가이드를 상세히 해부합니다.

컴퓨터의 전원을 켜면 내부에서 무슨 일이 일어날까? BIOS vs UEFI, MBR vs GPT, GRUB, Kernel, Init, Systemd까지 리눅스 부팅의 6단계와 트러블슈팅 가이드를 상세히 해부합니다.
내 서버는 왜 걸핏하면 뻗을까? OS가 한정된 메모리를 쪼개 쓰는 처절한 사투. 단편화(Fragmentation)와의 전쟁.

운영체제라는게 사실 프로그램들의 집합이라면, 그 중에서도 가장 핵심이 되는 녀석은 누구일까요? 항상 메모리에 상주하는 커널의 정체.

IP는 이사 가면 바뀌지만, MAC 주소는 바뀌지 않습니다. 주민등록번호와 집 주소의 차이. 공장 출고 때 찍히는 고유 번호.

내 서버가 왜 이렇게 작고 강력한지 이해하려면, 집채만 했던 1세대 컴퓨터를 봐야 합니다. 하드웨어의 다이어트 역사와 클라우드 비용 절약의 비밀을 파헤칩니다.

우리는 매일 아침 컴퓨터 전원 버튼을 무심코 누릅니다. 그리고 몇 초 뒤, 익숙한 바탕화면이나 로그인 창이 뜹니다. 그 짧은 몇 초 동안 컴퓨터는 "죽은 쇳덩이" 상태에서 "생각하는 기계" 상태로 전환하기 위해 엄청나게 복잡한 준비 운동을 합니다.
이 과정을 부팅(Booting)이라고 합니다. '부팅'이라는 단어는 '부트스트랩(Bootstrap)'에서 왔습니다. "장화 끈(Bootstrap)을 잡고 스스로를 들어 올린다"는 뜻으로, 외부의 도움 없이 스스로 운영체제를 메모리에 올리는 과정을 비유한 말입니다.
리눅스 시스템을 기준으로, 이 과정이 정확히 어떻게 일어나는지 6단계로 나누어 파고들어봤다.
전원 버튼을 누르면 메인보드에 전기가 흐르고, CPU는 약속된 메모리 주소(ROM)에 있는 BIOS(Basic Input/Output System) 프로그램을 실행합니다. BIOS는 가장 먼저 POST를 수행합니다.
문제가 없으면 "삑" 소리와 함께 다음 단계로 넘어갑니다. (비프음이 여러 번 들리면 하드웨어 고장입니다).
요즘 컴퓨터는 BIOS 대신 UEFI(Unified Extensible Firmware Interface)를 씁니다.
BIOS/UEFI는 설정된 순서대로(Boot Priority) 저장 장치(SSD/HDD/USB)를 확인합니다. 부팅 디스크를 찾으면, 그 디스크의 가장 첫 번째 섹터(0번 섹터)를 읽어들입니다.
전통적인 BIOS 방식에서는 이 512바이트 공간을 MBR이라고 합니다. 이 작은 공간에는 두 가지 핵심 정보가 들어있습니다.
UEFI 방식에서는 MBR 대신 EFI 시스템 파티션(ESP)이라는 별도의 파티션에 있는 .efi 실행 파일을 직접 읽어서 부트로더를 실행합니다. 훨씬 현대적이고 유연하죠.
MBR이 호출하는 것이 바로 부트로더입니다. 리눅스에서는 대부분 GRUB2 (GRand Unified Bootloader)를 사용합니다.
컴퓨터 켤 때 검은 화면에 "Ubuntu로 부팅하시겠습니까, Windows로 부팅하시겠습니까?" 묻는 메뉴가 나오는 단계가 바로 여기입니다. 윈도우가 설치된 파티션을 감지(os-prober)해서 메뉴에 추가해주는 것도 GRUB의 역할입니다. 이를 통해 멀티 부팅(Multi-boot)이 가능해집니다.
사용자가 선택을 하거나 시간이 지나면(Timeout), GRUB은 디스크(/boot)에 저장된 커널(Kernel) 이미지를 메모리(RAM)로 로드합니다.
그리고 제어권을 커널에게 넘깁니다. "이제부터 네가 대장이야."
이제야 운영체제(OS)의 심장인 커널이 메모리에 올라왔습니다.
커널 파일(vmlinuz)은 압축되어 있는데, 스스로 압축을 풀고 하드웨어 제어권을 완전히 장악합니다.
dmesg 명령어로 확인 가능)여기서 딜레마가 생깁니다. "하드디스크를 읽으려면 파일 시스템 드라이버(예: ext4)가 필요한데, 그 드라이버 파일이 하드디스크 안에 있다!" 드라이버를 읽으려면 드라이버가 필요한 상황입니다.
이를 해결하기 위해 initramfs (Initial RAM Filesystem)라는 임시 파일 시스템을 사용합니다.
커널은 메모리에 있는 작은 가상 디스크(initramfs)를 먼저 마운트합니다. 여기에는 부팅에 필수적인 드라이버들만 모여 있습니다.
이 드라이버들을 이용해 비로소 진짜 하드디스크(/)를 마운트(Mount)할 수 있게 됩니다.
커널 패닉(Kernel Panic): 만약 이 과정에서 루트 파일 시스템을 찾지 못하거나 깨졌다면? 커널은 더 이상 진행할 수 없어 시스템을 멈춥니다. 윈도우의 블루스크린과 같은 상태입니다.
커널이 모든 준비를 마치면, 시스템의 첫 번째 프로세스를 실행시킵니다.
바로 /sbin/init입니다. (최신 리눅스는 /lib/systemd/systemd로 심볼릭 링크되어 있습니다).
이 프로세스는 PID(Process ID) 1번을 부여받습니다. 이건 상징적인 의미가 큽니다.
과거에는 SysVinit이라는 쉘 스크립트 기반 방식을 썼지만, 부팅 속도가 느려서(순차 실행), 요즘은 Systemd라는 병렬 실행 방식을 표준으로 씁니다.
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)가 됩니다.
개발자라면 부팅이 멈췄을 때 "그냥 고장 났네" 하고 포맷하기보다, 어느 단계에서 멈췄는지 파악해야 합니다.
systemctl status 서비스명 또는 journalctl -xe 명령어로 에러 로그를 확인하세요.dmesg: 커널 부팅 로그를 다시 보여줍니다.systemd-analyze blame: 부팅 도중 어떤 서비스가 시간을 가장 많이 잡아먹었는지 범인을 찾아줍니다. (부팅 속도 최적화할 때 꿀팁!)journalctl -b: 이번 부팅의 전체 로그를 봅니다.journalctl -b -1: 이전 부팅(즉, 아까 컴퓨터가 강제로 꺼지기 전)의 로그를 봅니다.부팅 과정을 이해하는 것은 컴퓨터라는 기계와 운영체제라는 소프트웨어가 어떻게 악수를 하고 주도권을 주고받는지 이해하는 과정입니다. 단순히 전원을 켜는 행위 뒤에 수십 년간 엔지니어들이 쌓아올린 정교한 추상화 계층이 있다는 사실, 놀랍지 않나요?