Linux 부팅의 세부 동작 방식 및 실행


리눅스가 부팅하기 까지의 세부 여정을 단계 별로 구분해서 정리

우리는 일반적으로 파워버튼만 누르면 시스템이 올라온다는 것을 알고 있으나, 어떻게? 어떤 방식으로 진행되는지는 알고 있지 않다. 이를 세부 동작으로 구분해서 리눅스 console이 뜨기까지의 여정을 살펴본다.

BIOS 역할

PC는 BIOS를 중심으로 여러가지 디바이스로 연결되어 있다. PC나 서버에 파워버튼을 클릭하면 BIOS가 각종 장치를 체크한다. 이상이 없으면 BIOS에 설정된 부팅 장치를 차례로 콜해서 부트로더를 실행시킨다.

BIOS : Basic Input Output System

  • IO실행을 목적으로 개발
  • 디바이스에 번호를 매기고 디바이스에 입출력 기능을 제공
    – 하드웨어 사이의 입출력을 담당한다. 예를 들어 메인보드와 그래픽카드와 같은 하드웨어와 통신하기 위한 중간 매개체 역할을 해서, OS입장에서는 하드웨어의 세부 구성이나 신호체계를 알 필요 없이 BIOS를 중계로만 통신하면 되도록 하는 중간 매개체 역학이다.
  • 디바이스에 대한 상태 및 설정등의 기능을 제공
    – 부팅 디바이스 설정 및 각종 세부 디바이스에 대한 설정 제공

BIOS가 시스템 체크 및 설정을 확인 후, 부팅 디바이스 설정에 따라 BOOT 디바이스의 콜한다.
이 때, BIOS가 부팅 디바이스를 최초 콜을 하는 부분이 MBR (Master Boot Record)이다.

MBR – Master Boot Record

  •  bootlooader가 위치한 곳을 저정한 부분

MBR에는 bootloader가 없다. 단지 bootloader가 위치한 block만을 기억하고 있을 뿐이다.

BootLoader

BootLoader는 OS를 로드하기 위한 프로그램이다. 이를 위해서 간단한 화면처리 및 키보드, Serial, 네트워크 IO처리를 지원한다.

OS에 따라서는 지원하는 bootloader가 여러가지가 있는데, Linux의 경우 grub가 대표적이다.

GRUB의 경우 아래와 같이 3단계로 나눠져 있다.

  1. stage 1 – MBR에 저장
  2. stage 1.5 – MBR와 첫번째 파티션 사이에 기록됨, 본체 프로그램이다.
  3. stage 2 – 보통 /boot/grub가 포함된 그룹이라고 생각하면 된다. 1.5에서 이것을 연동해서 사용한다.

Kernel Loading

커널은 일반적으로 zlib로 압축된 파일로 구성되어 있다. grub가 kernel을 메모리에 올리때, 압축을 해제하는 작업을 한다. 또한 커널 이미지는 하드웨어에 대한 최소 루틴(드라이버)만으로 구성되어 있어서 최초로 로딩할 때, 시스템에 필요한 필수적인 디바이스를 로딩하고 메모리를 메니징 및 IO 처리 등을 시작한다.

이후, bootloader에 정의된 root file system을 “read only” 모드로 mount를 한 후, /sbin/init (커널에 정이된 최초 실행 프로그램)을 시작한다.

initrd / initramfs의 중간 부팅 과정

만약 /sbin/init 프로세스를 실행하는데, partion이 분할이 되어 있어서 해당 파일을 찾지 못하는 경우가 발생할 수 있다.
– “/boot”, “/usr”, “/”, “/var” 등으로 나눠져 있을 경우

이런 경우 부팅에 문제가 발생할 수 있다. 이를 해결하기 위해서 initrd/initramfs 파일이 도입이되어 나눠져 있는 파티션을 적절하게 mount하고 디바이스를 로딩 시켜준다.

Init Process

init process가 실행되기 까지 몇 가지 과정을 거쳐왔다. init process에서는 각종 서비스를 시작하게 된다.

– 아래는 init process가 실행되기 까지를 도식화한 그림이다.

init process는 OS에 따라 여러가지 type이 존재한다.

  • SysV init
  • systemd
  • Upstart
  • runit

 

위와 같이 Linux Booting 과장에 대해서 간략히 정리한다.