본문 바로가기
운영체제/Linux

Linux의 부팅 과정 정리

by eteo 2026. 1. 25.
반응형

 

이 글에서는 임베디드 리눅스가 아닌 일반적인 x86 PC 리눅스 배포판을 기준으로 부팅 과정을 정리해보았다.

 

 

 

1. BIOS / UEFI : 하드웨어 점검

먼저 시스템 전원을 켜면 BIOS(레거시) 또는 UEFI가 POST(Power-On Self-Test)을 수행하여 CPU, 메모리, 그래픽 카드 등 주요 부품이 정상인지 확인하고 사용할 준비를 마친다.

 

 

 

 

 

 

 

 

 

2. BIOS / UEFI : 부팅 가능한 디스크 탐색

BIOS / UEFI 설정에 저장된 부팅 우선순위(Boot Priority Order)에 따라 어떤 저장장치(HDD, SSD, USB 등)에서 부팅할 것인가가 정한다.

 

 

 

 

 

 

 

 

 

 

3. BIOS / UEFI : 부트로더 실행

  • BIOS의 경우 : MBR(Master Boot Record, 디스크 맨 앞 512바이트 영역)에 있는 부트 코드가 실행되어 활성 파티션을 찾고, 활성 파티션 시작 부분에 있는 GRUB을 로드한다.
  • UEFI의 경우 : EFI System Partition 안에서 grubx64.efi 파일을 찾아 실행하여 GRUB을 로드한다.

 

 

 

 

 

 

 

 

 

 

 

 

4. GRUB : grub.cfg 설정파일 참조

GRUB은 /boot/grub/grub.cfg 파일을 읽어 부팅 메뉴를 구성하고, 사용자가 선택한 커널의 위치와 부팅 옵션을 파악한다.

 

$ cat /boot/grub/grub.cfg

# ...

# 1. 커널 이미지와 initramfs가 있는 파티션을 UUID로 찾아서 root라는 환경변수로 지정
search --no-floppy --fs-uuid --set=root 704c8e4c-60a1-42a1-bc05-c023df123c4e

# ...

# 2. 커널 이미지(vmlinuz)를 메모리에 로드하고 bootargs 인자를 전달함
linux	/boot/vmlinuz-6.8.0-90-generic root=UUID=704c8e4c-60a1-42a1-bc05-c023df123c4e ro  quiet splash $vt_handoff

# 3. 임시 루트 파일 시스템(initramfs/initrd)를 메모리에 로드
initrd	/boot/initrd.img-6.8.0-90-generic

# ...

 

 

 

 

 

 

 

 

 

5. GRUB : 커널 이미지 및 임시 루트 파일 시스템(initramfs)을 메모리에 적재

GRUB은 디스크에 저장되어 있는 커널 이미지(vmlinuz)와 임시 루트 파일 시스템인 initramfs(initrd)를 RAM(메모리)으로 복사한다. 이 파일들은 /boot 디렉토리에서 실체를 확인할 수 있다.

 

 

 

✓ initrd vs initramfs

둘 다 커널이 실제 디스크에 접근하기 전, 임시로 사용할 드라이버 및 도구들이 담긴 파일 뭉치로 하는 일은 같지만 기술적으로는 initramfs가 더 발전된 형태이다. 이미 우리가 아는 모든 리눅스 배포판은 initramfs를 사용한다고 보면 되는데 과거 부트로더와 호환성 때문에 initrd라는 용어를 계속 사용하고 있다.

  • initrd (Initial RAM Disk)
    • 메모리의 일부를 가상 디스크(Block Device)처럼 만든 뒤 그 안에 드라이버 파일을 넣는 과거 방식, 크기가 고정되어 있어 메모리 낭비가 발생한다.
  • initramfs (Initial RAM File System)
    • 현대 리눅스에서 쓰이는 방식으로, 메모리 안 페이지 캐시(Page Cache)* 공간에 직접 파일 시스템(tmpfs)을 구축해서 필요한 만큼만 용량을 차지하고 속도도 빠르다.

 

 

※ 메모리의 Page Cache

파일 입출력(I/O) 성능을 극대화하기 위한 SW적 기법으로 운영체제는 메모리(RAM)의 남는 공간을 활용해 페이지 캐시라는 영역을 마련해두고, 한 번 읽거나 사용한 파일의 내용을 이 공간에 저장해 두었다가, 다음에 다시 필요할 때 느린 디스크를 거치지 않고 RAM에서 즉시 꺼내 쓴다.

 

 

 

 

 

 

 

 

 

6. GRUB : 커널로 제어권 전달

GRUB은 CPU의 제어권을 커널에게 넘겨준다.

 

 

 

 

 

 

 

 

 

7. Kernel : initramfs 마운트 및 드라이브 로드

7.1. 커널은 메모리에 있는 initramfs를 풀어 루트(/)로 임시 마운트한다.

 

7.2. initramfs 파일 시스템 내부의 최상위 루트에 존재하는 init 스크립트를 실행한다.

 

7.3. init 스크립트에 따라 initramfs 안에 들어있는 드라이버들을 로드하고, 이를 통해 NVMe, SDD, HDD 등 실제 저장장치를 인식하고 제어할 수 있는 상태가 된다.

 

 

 

 

 

 

 

 

 

8. Kernel : 실제 루트 파일시스템으로 전환

8.1. 커널은 실제 루트 파일 시스템이 깔린 파티션을 찾아 /sysroot 에 우선 마운트한다.

 

8.2. switch_root 라는 명령을 실행해 / 를 버리고 /sysroot 를 새로는 / 로 승격시킨다.

 

이 과정에서 initramfs가 점유하던 RAM 공간은 정리한다.

 

 

 

 

 

 

 

 

 

9. Kernel : /sbin/init 실행

이제 모든 준비가 끝났으니 커널은 /sbin/init 을 호출하여 시스템 운영을 맡길 관리자 프로세스를 실행한다.

 

✓ init 시스템 : init (SysV) vs systemd

init 또는 systemd는 사용자 공간(User Space)의 최상위 프로세스(PID 1)로서, 시스템 전체의 생명 주기와 서비스 간 의존성을 관리하는 역할을 한다.

  • init (SysV) : 과거에 사용되던 방식으로 서비스들을 순차적으로 실행하기 때문에 부팅 속도가 느리고, 서비스 간 의존성 관리가 복잡하다.
  • systemd : 현대 리눅스의 표준으로, 서비스 간 의존성을 분석해 병렬적으로 실행하므로 부팅 속도가 훨씬 빠르다.

 

현대 리눅스의 init 시스템은 systemd 이지만 커널은 일단 /sbin/init을 실행한다. 하위 호환성을 위해 이름만 유지하는 것이고, 실제로 이 파일은 systemd로 연결된 심볼릭 링크여서 systemd가 실행되는 구조이다.

 

 

 

 

 

 

 

 

 

 

10. systemd : 서비스 병렬 실행 및 최종 Target 도달

10.1. 최종 Target 확인

 

systemd는 부팅 시 시스템이 도달해야 할 목표인 default.target을 확인하고, 해당 타겟에 도달하기 위해 필요한 유닛(타겟과 서비스)들을 분석해 병렬적으로 실행한다.

 

 

터미널에서 systemctl get-default 명령으로 확인하면, 현재 시스템의 종착지가 graphical.target임을 알 수 있다.

 

 
 

 

 

10.2. 최종 Target에 도달하기 위한 의존성 확인

 

이 최종 타겟은 단독으로 실행되는 것이 아니라, 하위 타겟들이 먼저 준비되어야 하는 꼬리에 꼬리를 무는 의존성 구조를 가지고 있다. 실제 타겟의 유닛 파일(/lib/systemd/system/*.target)을 열어보면 그 관계를 확인할 수 있다.

 

  • graphical.target : Requires로 multi-user.target을 필요로 하며, 그래픽 환경을 위한 서비스를 실행한다.
  • multi-user.target : Requires로 basic.target을 필요로 하며, 다중 사용자 텍스트 환경을 위한 서비스를 실행한다.
  • basic.target : Requires로 시스템 초기화를 수행하는 sysinit.target을 필요로 하며, 타이머, 소켓 등 기본 서비스를 실행한다.

 

 

 

 

10.3. 각 Target에 속한 서비스 실행

 

그리고 각 타겟에 딸린 구체적인 서비스들은 /etc/systemd/system/ 경로 내의 <타겟이름>.wants/ 디렉토리에서 관리된다.

 

이 디렉토리 안에는 해당 타겟이 활성화될 때 함께 실행될 수십, 수백 개의 서비스 스크립트의 심볼릭 링크들이 존재하는데, systemd는 이걸 한번에 훑어서 상호의존성이 없는 유닛들은 동시에 병렬로 실행한다.

 

 

 

10.4. 부팅 완료

 

이 과정을 거쳐 모든 필수 서비스가 가동되면 부팅이 완료되고 최종 OS 환경이 구성된다.

 

 

 

 

반응형