컴퓨터 구조 운영체제 네트워크 자료구조 알고리즘 데이터베이스 내 학습
os · 20

부팅 과정(BIOS→커널)

커널BIOS부팅

컴퓨터의 전원을 켜면 운영체제가 곧바로 실행되는 것처럼 보이지만, 실제로는 여러 단계의 프로그램이 차례로 다음 단계를 불러내는 과정을 거칩니다. 전원이 막 들어온 시점에는 메모리에 아무 프로그램도 올라와 있지 않고, 디스크의 파일 시스템도 쓸 수 없습니다. 그래서 메인보드에 미리 저장된 작은 프로그램(펌웨어)이 먼저 실행되어 하드웨어를 점검하고, 운영체제를 불러올 수 있는 최소한의 환경을 만든 뒤 제어권을 넘깁니다. 이 과정을 부팅(booting, bootstrapping)이라고 부릅니다.

부팅은 크게 펌웨어(BIOS 또는 UEFI) → 부트로더(예: GRUB) → 커널 → 첫 사용자 프로세스(init, systemd) 순서로 제어가 넘어갑니다. 이 토픽에서는 전통적인 BIOS(MBR) 방식과 최근의 UEFI 방식이 어떻게 다른지, 그리고 커널이 시작된 뒤 로그인 화면이 나오기까지 어떤 일이 일어나는지를 단계별로 봅니다.

핵심 개념

펌웨어 (BIOS · UEFI)

메인보드에 저장된 프로그램으로 전원이 들어오면 가장 먼저 실행됩니다. 하드웨어를 초기화하고 부팅할 장치를 찾아 부트로더에 제어를 넘깁니다. BIOS는 전통적인 방식이고 UEFI는 이를 대체하는 규격입니다.

핵심 개념

POST

Power-On Self-Test의 약자로, 펌웨어가 부팅 초기에 메모리와 주변 장치가 제대로 동작하는지 점검하는 단계입니다.

핵심 개념

MBR과 ESP

BIOS 방식은 디스크의 첫 섹터(MBR, 512바이트)에 있는 부트 코드를 실행합니다. UEFI 방식은 EFI 시스템 파티션(ESP)에 있는 .efi 파일을 읽어 실행하는 방식이라 파일 시스템을 이해해야 합니다.

핵심 개념

부트로더

GRUB 같은 프로그램으로, 커널 이미지를 디스크에서 메모리로 올리고 커널에 제어를 넘깁니다. 부팅할 운영체제나 커널을 고르는 메뉴도 제공합니다.

핵심 개념

커널과 initramfs

커널은 메모리, 스케줄러, 인터럽트, 드라이버를 초기화합니다. 리눅스는 대개 initramfs라는 임시 루트 파일 시스템으로 먼저 시작해 실제 루트 파일 시스템을 마운트하는 데 필요한 것을 준비합니다.

핵심 개념

PID 1 (init · systemd)

커널이 사용자 공간에서 처음 실행하는 프로세스입니다. 이후 모든 사용자 프로세스의 조상이 되고, 서비스를 시작하는 일을 맡습니다. 현대 리눅스 배포판은 대개 systemd를 씁니다.

작은 프로그램이 큰 프로그램을 부릅니다 — 펌웨어, 부트로더, 커널 순으로 점점 큰 프로그램이 올라오며 각 단계가 다음 단계에 제어를 넘깁니다.
BIOS와 UEFI는 부트로더를 찾는 방식이 다릅니다 — BIOS는 디스크 첫 섹터의 코드를, UEFI는 ESP 파티션의 파일을 실행합니다.
커널이 시작돼도 부팅은 끝나지 않습니다 — 루트 파일 시스템을 마운트하고 PID 1과 서비스가 올라와야 사용자가 쓸 수 있는 상태가 됩니다. initramfs를 쓰면 처음 PID 1은 initramfs의 /init이고, 실제 루트로 넘어간 뒤 systemd 같은 init이 이어받습니다.
PID 1이 프로세스 트리의 뿌리입니다 — 사용자 공간의 모든 프로세스는 PID 1에서 갈라져 나온 자손입니다.
이 시각화에서 확인할 것 — "BIOS 부팅"과 "UEFI 부팅" 탭에서 제어가 커널까지 넘어가는 과정을, "커널 이후" 탭에서 PID 1과 서비스가 올라오는 과정을 STEP으로 확인하세요.

부팅의 배경

BIOS(Basic Input/Output System)는 초기 IBM PC 호환기의 펌웨어 방식에서 이어져 온 것입니다. 이 방식은 디스크 첫 섹터의 512바이트에 부트 코드를 두고 파티션 정보를 MBR 안에 담는 구조여서, 부트 코드가 쓸 수 있는 공간이 작고 MBR 파티션은 디스크 크기에도 한계가 있었습니다. UEFI는 BIOS의 제약을 넘어 큰 디스크(GPT), 파일 시스템 기반 부팅, 서명 검증(Secure Boot) 같은 기능을 지원하는 규격입니다.

숫자로 확인하기

MBR의 크기 — 첫 섹터 512바이트 가운데 부트 코드가 약 446바이트, 파티션 항목 4개가 64바이트, 끝의 부트 시그니처가 2바이트(0x55 0xAA)입니다. 446 + 64 + 2 = 512입니다.
BIOS 부팅의 단계 — 이 시각화에서는 펌웨어 실행, POST, MBR 읽기, 부트로더 단계, 커널과 initramfs 적재, 커널 실행의 6단계로 나눕니다.
MBR 파티션의 한계 — 파티션의 시작 위치와 크기를 32비트 섹터 번호로 적으므로, 섹터가 512바이트이면 한 파티션이 최대 2TiB 정도까지입니다. 2^32 × 512바이트 = 2TiB입니다.

자주 하는 오해

전원을 켜면 운영체제가 가장 먼저 실행된다 — 가장 먼저 실행되는 것은 메인보드의 펌웨어입니다. 운영체제는 펌웨어와 부트로더를 거친 뒤에야 올라옵니다.
BIOS와 UEFI는 이름만 다르다 — 둘 다 펌웨어지만 부트로더를 찾는 방식이 다릅니다. BIOS는 디스크 첫 섹터의 코드를 실행하고, UEFI는 ESP의 .efi 파일을 읽어 실행하며 서명 검증도 지원합니다.
커널이 PID 1이다 — PID 1은 커널이 사용자 공간에서 실행하는 첫 프로세스(init, systemd)입니다. 커널은 그 프로세스들을 관리하는 쪽입니다.
부트로더는 운영체제의 일부다 — 부트로더는 운영체제 커널과 별도의 프로그램입니다. 커널을 올려 주는 역할을 하고, 커널이 올라온 뒤에는 그 역할이 끝납니다.

면접에서 이렇게 물어요

면접 질문

컴퓨터를 켜면 어떤 일이 일어나나요?

메인보드의 펌웨어(BIOS/UEFI)가 먼저 실행되어 POST로 하드웨어를 점검하고, 부팅 장치에서 부트로더를 찾아 실행합니다. 부트로더가 커널을 메모리에 올려 제어를 넘기면 커널이 초기화한 뒤 PID 1과 서비스를 시작합니다.

면접 질문

BIOS와 UEFI의 차이는 무엇인가요?

BIOS는 디스크 첫 섹터(MBR)의 부트 코드를 실행하고, UEFI는 ESP 파티션의 .efi 부트로더 파일을 실행합니다. UEFI는 큰 디스크(GPT), 보안 부팅, 더 풍부한 사전 부팅 환경을 지원합니다.

면접 질문

부트로더는 왜 필요한가요?

BIOS는 디스크 첫 섹터만 읽을 수 있어 커널을 찾아 올리는 일을 부트로더가 맡습니다. UEFI는 펌웨어가 FAT의 .efi 파일을 직접 실행할 수 있어 부트로더 없이 부팅하는 구성도 가능하지만, 보통 여러 커널이나 OS 선택 메뉴와 커널 옵션 전달 때문에 부트로더를 둡니다.

면접 질문

PID 1이 하는 일은 무엇인가요?

커널이 사용자 공간에서 처음 실행하는 프로세스로, 서비스를 시작하고, 고아가 된 프로세스는 보통 PID 1이 입양해 종료 상태를 거둡니다(subreaper가 지정돼 있으면 그쪽이 먼저). PID 1이 종료되면 커널 패닉이 납니다.

실제 시스템에서는

GRUB — 리눅스 배포판에서 널리 쓰이는 부트로더로, 설정 파일의 항목에 따라 커널과 initramfs를 고르고 커널 명령줄을 전달합니다.
UEFI 부팅 확인 — 리눅스에서 /sys/firmware/efi 디렉터리가 있으면 UEFI로 부팅한 것이고, efibootmgr 명령으로 NVRAM의 부트 항목을 볼 수 있습니다.
systemd — 대부분의 리눅스 배포판에서 PID 1로 쓰이고, systemd-analyze 명령으로 부팅 단계별 시간을 확인할 수 있습니다.
가상 머신과 클라우드 — 가상 머신도 가상화된 펌웨어(BIOS 또는 UEFI)로 같은 순서로 부팅합니다. 컨테이너는 부팅 과정이 없고 호스트 커널 위에서 바로 프로세스를 시작합니다.

함께 보면 좋은 토픽

시스템 콜과 커널 — 부팅 뒤 커널이 맡는 역할을 봅니다.
프로세스 — PID 1을 포함해 프로세스가 만들어지는 과정을 봅니다.
좀비 · 고아 프로세스 — PID 1이 고아 프로세스를 거두는 역할을 봅니다.
VM vs 컨테이너 — 가상 머신과 컨테이너의 시작 방식 차이를 봅니다.

참고 자료

리눅스 부팅 — boot(7), GNU GRUB Manual, systemd(1)
부트 로더 명세 — UAPI Boot Loader Specification

리눅스 셸 — BIOS인지 UEFI인지 확인

# UEFI로 부팅했으면 이 디렉터리가 있다
ls /sys/firmware/efi

# UEFI 부트 항목과 순서 보기 (NVRAM)
efibootmgr -v

# 디스크 · 파티션 · 파일 시스템 확인 (ESP는 보통 vfat)
lsblk -f

# 부팅 한 번 동안의 커널 메시지
dmesg | head -n 30

리눅스는 UEFI로 부팅하면 /sys/firmware/efi 디렉터리를 만들어 주므로, 이 디렉터리가 있는지로 부팅 방식을 구분할 수 있습니다. efibootmgr는 NVRAM에 저장된 UEFI 부트 항목과 BootOrder를 보여 주는 도구입니다. lsblk -f에서 ESP는 대개 FAT 계열(vfat) 파일 시스템으로 보이고, 이 파티션 안에 .efi 부트로더 파일이 있습니다. dmesg는 커널이 부팅하면서 남긴 메시지를 보여 주어, 커널이 장치를 초기화하는 순서를 확인할 때 씁니다.

GRUB — 부팅 항목 설정 (개념 예시)

menuentry 'My Linux' {
    search --set=root --fs-uuid 1234-ABCD   # 커널이 있는 파티션 찾기
    linux  /boot/vmlinuz root=/dev/sda2 ro quiet   # 커널과 명령줄
    initrd /boot/initramfs.img                  # initramfs
}

GRUB 설정의 menuentry 하나가 부팅 메뉴의 한 항목입니다. linux 줄은 메모리에 올릴 커널 이미지와 커널 명령줄(예: 루트 파일 시스템 위치 root=)을 정하고, initrd 줄은 함께 올릴 initramfs를 정합니다. 부트로더는 이 설정대로 커널과 initramfs를 메모리에 적재한 뒤 커널의 시작 위치로 제어를 넘깁니다. 파일 이름, 경로, UUID는 배포판과 설치에 따라 다르며, 위 코드는 구조를 보이는 최소 예시입니다. 실제 설정은 grub.cfg를 직접 고치기보다 배포판의 도구로 생성합니다.

리눅스 셸 — 커널 이후: PID 1과 부팅 시간

# PID 1 프로세스의 이름 (대부분 systemd)
cat /proc/1/comm

# 부팅에 걸린 시간을 단계별로 나눠 보기
systemd-analyze

# 서비스별로 오래 걸린 순서
systemd-analyze blame | head -n 10

# 커널이 받은 명령줄
cat /proc/cmdline

/proc/1/comm은 PID 1 프로세스의 이름을 보여 주며, systemd를 쓰는 배포판에서는 systemd가 출력됩니다. systemd-analyze는 커널, initrd, 사용자 공간(환경에 따라 펌웨어와 로더) 단계별 부팅 시간을 나누어 보여 줍니다. systemd-analyze blame은 서비스를 시작하는 데 오래 걸린 순서대로 나열해, 부팅이 느린 원인을 찾을 때 쓰입니다. /proc/cmdline은 부트로더가 커널에 전달한 명령줄을 보여 주어, 앞의 GRUB 항목의 linux 줄이 어떻게 반영됐는지 확인할 수 있습니다.

Q1

컴퓨터에 전원을 켠 직후 가장 먼저 실행되는 소프트웨어는?

메인보드에 저장되어 있는 소프트웨어입니다.
전원이 들어오면 메인보드의 펌웨어(BIOS/UEFI)가 먼저 실행되어 POST(하드웨어 자가 점검)를 수행하고, 부팅 장치에서 부트로더를 찾아 실행합니다.

Q2

부트로더(예: GRUB)의 역할은?

펌웨어와 커널 사이를 이어주는 다리입니다.
부트로더는 펌웨어로부터 실행 권한을 넘겨받아 커널 이미지를 디스크에서 메모리로 올리고 커널로 제어를 넘깁니다. 여러 OS 중 부팅할 항목을 고르는 메뉴도 제공합니다.

Q3

리눅스 커널이 초기화를 마친 뒤 사용자 공간에서 처음 실행하는 프로세스(PID 1)는?

모든 사용자 프로세스의 조상이 되는 프로세스입니다.
커널은 초기화가 끝나면 사용자 공간의 첫 프로세스인 init(현대 배포판에서는 대개 systemd, PID 1)을 실행합니다. 이후 이 프로세스가 서비스와 다른 프로세스들을 시작합니다.