부팅이란? 컴퓨터를 사용할 수 있도록 보조 기억 장치에 있는 운영 체계를 주기억 장치로 복사하는 과정

1. 전원 공급

  • 전원이 켜지면, CPU가 리셋 벡터1에 접근해, 펌웨어(BIOS/UEFI) 코드를 실행합니다.
  • BIOS/UEFI는 POST(Power On Self Test, 하드웨어 검사)를 수행하고 초기화합니다.

2. 부트 디바이스 탐색 및 부트로더 로드

  • BIOS/UEFI는 부팅 가능한 디바이스(하드디스크, SSD 등)를 탐색하고 선택합니다.
  • 선택된 디바이스의 첫 번째 섹터(MBR, EFI 파티션)에서 부트로더(GRUB2)를 메모리에 로드합니다.

3. 부트로더 단계

  • 부트로더는 커널 이미지(vmlinuz)와 초기 RAM 디스크(initrd, initramfs)를 메모리에 적재합니다.2
  • 사용자는 여러 운영체제 중 하나를 선택합니다.

4. 커널 로딩 및 하드웨어 초기화

  • 부트로더는 커널에게 제어권을 넘기고, 커널을 실행합니다.
  • 커널은 필요한 드라이버와 모듈을 초기 RAM 디스크에 로드합니다.
  • 커널은 루트 파일시스템을 마운트하고 하드웨어를 초기화합니다.

5. 시스템 초기화 프로세스 실행

  • 커널은 첫 번째 사용자 공간 프로세스인 systemd(과거에는 init)를 실행합니다.
  • systemd(PID 1번)는 시스템 데몬, 네트워크, 사용자 세션 등 다양한 유닛을 병렬로 실행합니다.

6. 로그인 프롬프트 제공

  • systemd에 의해 실행된 getty는 콘솔 로그인 기능을 제공합니다.

Q. 커널이 루트 파일시스템(/)을 마운트하기 전인데, 부트로더는 어떻게 /boot를 읽을 수 있어?

부트로더는 파일시스템(ext2, FAT, …)을 읽을 수 있는 드라이버를 내장하고 있습니다. 아래 /boot/grub/grub.cfg 파일에서 커널과 초기 RAM 디스크의 위치를 가져와 사용합니다.

menuentry 'Proxmox VE GNU/Linux' ... {
	insmod gzio
	insmod part_gpt
	insmod lvm
	insmod ext2
    ...
    linux   /boot/vmlinuz-6.8.12-4-pve root=/dev/mapper/pve-root ro  quiet
    initrd  /boot/initrd.img-6.8.12-4-pve
}

Footnotes

  1. CPU가 가장 먼저 접근하는 고정된 메모리 주소로 ARM 시스템에서는 ROM의 가장 낮은 주소 (ex, 0x0x00000000)

  2. 커널을 실행하려면 파일 시스템이 필요한데, 실제 파일 시스템은 커널이 실행되어야 사용할 수 있습니다. 그래서 임시 파일 시스템을 메모리에 올려서 사용합니다.