Linux boot process

ohyujeong·2023년 12월 10일
0

linux

목록 보기
1/9

Legacy BIOS

  1. Power On

  2. BIOS 펌웨어 동작
    펌웨어(firmware)란 하드웨어의 기본적인 구동 및 제어를 담당하는 특수 용도의 소프트웨어로, ROM(read-only memory)에 기록된다.

  • POST(Power-On Self-Test) 실행
    - 컴퓨터의 중요한 하드웨어가 동작하는지 테스트
  • Boot Device 선택
    - 제공되는 간단한 GUI(설정 인터페이스)에서 선택
    - 컴퓨터 부팅 시 보통 F12/F2 키를 눌러 진입 가능
  • 파티션 테이블 구조 - MBR(Master Boot Record)
    - 선택된 Boot Device의 첫번째 섹터에 위치한 MBR을 조회
  1. MBR의 부트코드를 실행
  • MBR에는 간단한 부트 코드가 포함되어 있다. 이 코드로 하드 드라이브의 파티션 테이블을 확인하고 부팅 가능한 파티션을 찾는다.
  1. VBR(Volume Boot Record)
  • 부팅 가능한 파티션의 첫번째 섹터인 VBR이 자신이 속한 파티션에 있는 Boot loader를 찾고 메모리에 로드
  1. Boot loader
  • Linux에는 GRUB(GRand Unified Boot loader), LILO(LInux LOader) 와 같은 여러 종류의 Boot loader가 있지만 GRUB이 가장 많이 사용된다. 최근에는 GRUB2가 보편적으로 사용되고 있다.
  • GRUB2를 사용한다면 /boot/grub/grub.cfg 경로에 설정파일이 위치한다.
  • Boot loader GUI 메뉴가 화면에 표시되고, 만약 여러 운영체제가 설치되어 있다면 그 중 선택할 수 있다.
  • Kernel을 Init RD(Ram Disk)와 함께 메모리에 로드한다.
    - Kernel 이미지는 /boot/vmlinuz-x.x.x-xx 에 위치해 있다.
    - InitRD는 실제 root file system을 사용할 수 있게 되기 전에 마운트되는 임시적인 root file system이다.
  1. Kernel 동작
    • GRUB 설정 파일에 설정되어 있는 root file system을 마운트한다.
    • /sbin/init 프로그램 실행
  2. Init
  • SysVinit -> Upstart -> systemd 순서대로 사용되어졌고 최근에는 거의 systemd 를 사용한다.
  • /etc/inittab 설정파일을 읽어 Runlevel을 결정

    SysVinit, Upstart, systemd

    SysVinit 은 Runlevel이라고 하는 시스템 상태를 정의하고 모든 프로세스와 서비스를 Runlevel에 맞춰 실행한다. 초기의 init프로그램이다.
    UpstartSysVinit 을 대체하기 위해 만들어졌다. Runlevel을 사용하는 대신 시스템 이벤트를 사용하여 서비스를 실행/중지했다.
    systemd 은 가장 최근의 init프로그램이다. Runlevel 대신 target이라는 개념을 사용하고 있다. 순차적으로 init을 수행한 SysVinit과 달리 병렬로 서비스를 실행하여 부트 시간을 단축할 수 있다.

  1. Runlevel/target
  • 설정된 Runlevel/target에 해당하는 스크립트 및 서비스를 실행한다.
  • Runlevel 이란 Linux 시스템에서 특정 상태나 모드를 나타내는 숫자로, Runlevel에 따라 실행하는 실행모드와 실행되는 서비스가 달라진다.

    Runlevel과 Target의 관계

    각 runlevel은 특정 systemd-target과 매핑된다. * 로 표시된 부분은 default 설정이다.


UEFI (Unified Extensible Firmware Interface)

  • 2005년 개발
  • 부팅을 위해 펌웨어와 운영체제 사이에서 필요한 기능들에 대해 표준화 및 체계화
  • UEFI 응용프로그램 실행 가능
  • 펌웨어와 OS간 공유변수 사용 가능
  1. Power On

  2. UEFI 부트 매니저 작동 (efibootmgr)

  • 파티션 테이블 구조 - GPT(GUID Partition Table)
    - 각 파티션에 GUID(고유 식별자)를 할당하여 특정한 GUID를 가지고 있는 ESP(EFI System Partition)를 식별할 수 있게 한다.
    - MBR은 하나의 부트로더만 저장할 수 있는 반면, GPT에는 여러 부트로더를 저장하기 위한 별도의 전용 EFI 시스템 파티션(ESP)이 있다. 이는 서로 다른 부트로더가 필요한 두 개 이상의 운영 체제가 있는 경우 매우 유용하다.
  • GPT에서 특정 GUID를 가지고 있는 ESP(EFI System Partition) 파티션을 탐색하고 식별한다.
  1. ESP(EFI System Partition)
  • ESP의 /boot/efi/EFI/ubuntu 경로에 Boot loader를 가지고 있다.
    grub.cfg : GRUB 설정파일
    grubx64.efi : Boot loader 파일
  • Boot loader가 메모리에 로드되고 제어권이 Boot loader에게로 넘어간다.
  • 사용자에게 운영체제를 선택할 수 있는 메뉴를 제공한다.
  1. Boot loader
  • Boot loader가 실행되고 GRUB 설정파일을 읽고 그 내용을 바탕으로 Kernel과 initramfs를 로드한다.
  1. Kernel 동작
    • GRUB 설정 파일에 설정되어 있는 root file system을 마운트한다.
    • /sbin/init 프로그램 실행
  2. Init
  • systemd 가 실행되어 default target으로 지정된 graphical.target (Ubuntu 22.04.3 LTS 버전 기준) 에 정의된 서비스와 스크립트를 실행한다.

    default target

    default target을 정의하는 파일은 /etc/systemd/system/default.target 이다. 이 경로에 없다면 /lib/systemd/system/default.target 파일에서 default target정보를 확인할 수 있다. 아래와 같이 default target으로 설정된 graphical.target 을 가리키고 있다.

    아래는 graphical.target 파일로, 어떤 의존성이 있는지, 어떤 서비스를 실행해야 하는지 정의한다.


참고

https://velog.io/@markyang92/boot
https://blog.kubesimplify.com/linux-boot-process-simplified
https://www.computernetworkingnotes.com/linux-tutorials/differences-between-sysvinit-upstart-and-systemd.html
https://yonlog.tistory.com/59
https://www.baeldung.com/linux/boot-process

profile
거친 돌이 다듬어져 조각이 되듯

0개의 댓글