[Linux] 리눅스 시스템 부팅 프로세스(리눅스 부팅 과정)

dan·2025년 12월 28일

Red Hat Linux

목록 보기
5/9


지난 포스팅에서, root password 재설정을 통해 부팅 과정 중간에 개입하여 관리자 권한을 되찾는 과정을 익혔다. 어떤 지점에서 개입하여 관리자 권한을 재설정한 것인지 조금 더 명확히 이해하기 위해, 리눅스 부팅 과정을 자세히 알아보자.


1. 요약

리눅스 시스템 부팅 과정은 다음과 같다.

1) 전원 ON
2) BIOS/UEFI 펌웨어 - 하드웨어 시작
3) 부트로더 위치 찾기 + 시작
4) 부트로더에서 OS 선택
5) 선택된 OS에 맞는 커널 + initrd(초기 RAM 디스크) 시작
6) init 프로세스(sysV/systemd) 시작
7) 선택된 런레벨/target에 따라 서비스 시작

2. 시스템 부팅이란

시스템 부팅이란, '전원을 켠 후 로그인 프롬프트가 나타나기까지의 과정'이다. 커널을 메모리에 올려 실행 가능하게 만드는 것이 시스템 부팅 프로세스이며, 이 과정을 통해 하드웨어와 소프트웨어를 초기화하고, OS를 메모리에 올려 사용 가능한 상태로 만드는 것이 시스템 부팅의 목표이다.

리눅스 시스템 부팅을 위해서는 몇 가지 과정을 거친다.

1) 전원 공급(POST)
2) BIOS/UEFI 단계
3) 부트로더(GRUB, LILO 등) 실행
4) 커널 로딩 및 초기화
5) init(systemd) 프로세스 시작
6) 사용자 공간 서비스 실행 및 로그인

상세 단계별 개념은 후술할 내용에서 다뤄보자.


3. 리눅스 시스템 부팅 프로세스

3.1 하드웨어 단계

1) Power On

전원 버튼을 통해 피지컬 서버에 전원이 공급되면, 메인보드는 리셋 벡터(Reset Vector)를 통해 CPU가 BIOS 코드를 호출하도록 한다.

Inter CPU의 경우, 전원 공급 직후 초기 부팅 시에는 real mode로 동작한다. 이 시점에서는 전체 메모리의 1MB 영역까지만 접근할 수 있다.

초기 부팅 직후, CPU는 EIP(Extend Instruction Pointer: 메모리에 등록된 code의 주소를 가리키는 포인터)에 숨겨진 특정 주소로 점프한다. 이 주소는 펌웨어(BIOS/UEFI)의 엔트리 포인트로 매핑되는 영역이며, 이 영역이 리셋 벡터(Reset Vector)이다. Real Vector는 real mode에서는 접근할 수 없도록 숨겨져 있다.

리셋 벡터를 통해 펌웨어(BIOS/UEFI)로 접근하고, 이 곳에서 펌웨어 코드(BIOS Code)를 실행한다. 펌웨어 코드는 시스템 하드웨어 구성을 저장하고 있다.

2) POST, BOOT SECTOR(MBR/VBR/EBR)

POST(Power-On-Self Test)는 CPU, RAM, 제어 장치, BIOS Code, 주변 장치 등에 대한 검사를 진행한다. OS와 기존 가상화 확장, 보안 등에 대한 구성을 확인한다.

  • MBR(Master Boot Record)

    POST 과정이 완료되면 BIOS는 부팅 디바이스(HDD 등)을 검색하고, 해당 디바이스의 파티션 테이블을 검색한다. 파티션되지 않은 장치의 Boot Sector는 VBR이 된다.

    파티션 테이블이 확인되면, 해당 파티션의 첫 번째 블록에서 부트로더 코드를 검색하여 메모리에 로드시킨다.

    • 파티션 테이블(64 bytes) : 4개의 Primary partition 정보(시작-끝 블록, 크기 등)
  • VBR(Volume Boot Record)

    각 Primary partition의 첫 번째 블록.
    파티션되지 않은 장치의 Boot Sector는 VBR이다.

  • EBR(Extended Boot Record)

    각 논리 파티션의 첫 번째 블록(하나의 Primary partition을 분할한 것).
    EBR의 파티션 테이블에는 모든 논리 파티션이 링크되어 있다.

3.2 부트로더 단계


부트로더란 리눅스가 부팅되기까지 부팅의 전과정을 진행하는 부팅전문프로그램을 의미한다.

BIOS가 디스크의 MBR에서 부트로더를 찾고, 부트 로더가 GRUB 설정 파일을 찾으면 부트로더는 일정 시간(약 3~5초)를 카운트다운한다.
사용자는 이 시간 사이에 부트로더에 개입할 수 있다.

일반적으로, 사용자가 부트로더에 개입하는 케이스는 다음과 같다.

1) 다른 런레벨로 시작(런레벨 오버라이드)
2) 다른 커널 선택(새 커널이 시작되지 않을 때 대비)
3) 다른 OS 선택(예- Fedora와 RHEL이 함께 설치된 컴퓨터에서, RHEL이 오동작 시 Fedora로 시동한 뒤 RHEL 파일 시스템을 마운트하여 문제 해결 시도
4) 부트 옵션 변경

1) GRUB(GRand Unified Bootloader): Linux & Wondows 겸용 멀티 부트로더

GRUB는 "Grand Unified Bootloader"의 약어로서 GNU하에서 개발된 멀티부트로더이다. GRUB는 다른 부트로더와 마찬가지로 하드디스크의 첫번째 부트섹트인 MBR(Master Boot Record)이라는 곳에 저장된다.

시스템에 전원이 공급되면 가장 먼저 ROM-BIOS에서 시스템 제어권을 가지고 장착된 하드웨어에 대한 기본적인 점검과 인식을 한다. 이 과정이 모두 끝나고 나면 ROM-BIOS는 하드디스크의 첫번째 부트섹트인 MBR에 있는 부트로더에게 그 제어권을 넘겨준다.

GRUB는 Stage 1 → 1.5 → 2를 거치는 부트로더이다.

# GRUB Stage 1
-> MBR 또는 VBR에 저장되어 있는 부트 이미지가 메모리에 로드되고 실행됨
(core.img의 첫 번째 섹터 로드)

# GRUB Stage 1.5
-> MBR과 첫번째 파티션 사이에 있는 블록에 저장된 core.img가 메모리에 로드되고 실행됨
   core.img의 configuration 파일과 파일시스템을 위한 드라이버를 로드
   
# GRUB Stage 2
-> /boot/grub 파일 시스템에 직접 접근하여 커널(vmlinux)의 압축을 풀어 메모리에 로드,
   커널이 필요로 하는 모든 드라이버와 모듈, 파일시스템(ext2, ext3, ext4...)등이 담긴 
   RAM 디스크 파일(initrd.img)를 메모리에 로드
   

GRUB은 파일 시스템(ext2, ext3 등)과 함께 동작할 수 있다.
UEFI 버전도 가능하다(grub.efi).

2) LILO(LInux LOader): Linux only(거의 사용되지 X)

리눅스에서 사용하는 부트로더에는 지금은 거의사용되지 않는 LILO(Linux Loader)라는것이 있었고, 현재는 대부분 GRUB를 사용한다.

LILO는 리눅스라는 운영체제에 한정되어 사용되었던 부트로더였다. 하지만 GRUB는 윈도우와 리눅스등에서 모두 사용될수 있는 멀티부트로더라고 할 수 있다.

3.3 커널 단계

하드웨어 단계와 부트로더 단계를 거치며, 부트로더는 커널 파일과 RAM 디스크 파일을 메모리에 로드해 놓은 상태이다.

1) 커널이란


커널이란 애플리케이션과 하드웨어 사이에 존재하는 부분으로, 컴퓨터의 자원(CPU, 메모리, 저장 장치, 주변기기)을 관리하며 소프트웨어가 이를 안전하고 일관된 방식으로 사용할 수 있도록 한다.

커널의 역할

1) 스케줄러 작동 : 어떤 프로그램이 언제 CPU 할당받을지 결정
2) 메모리 관리 : 각 앱의 데이터를 분리 보관, 필요 시 RAM 할당
3) 장치 및 파일 처리 : GPU, SSD, NIC card 및 FS용 드라이버와 통신
4) I/O 중재 : 앱을 대신하여 파일 및 네트워크 데이터를 read & write
5) 안정성 보장 : 사용자 모드(앱)과 커널 모드(OS 핵심)을 분리, 버그가 있는 앱이 전체 시스템을 다운시키지 못하도록 방지

2) 로드된 커널 파일의 실행

커널은 컴퓨터의 각종 하드웨어를 사용하는 데 필요한 드라이버와 모듈을 로드한다. 이 시점에서는 주로 하드웨어 실패를 찾아야 한다(관련된 기능이 올바로 동작하지 않는 문제를 차단해야 하기 때문).

1. 로드된 커널파일 실행, 콘솔에 관련 정보 띄워줌
2. PCI bus 점검 및 감지된 주변장치(Peripheral) 확인 후 /var/log/dmesg 파일에 기록
3. 커널은 swapper 프로세스(PID 0)를 호출, swapper(PID 0)는 커널이 사용할 각 장치드라이브들을 초기화
4. Root file system (" / ")을 읽기 전용으로 마운트ㅡ이 과정에서 마운트 실패시 "커널 패닉" 메시지 출력
5. 문제없이 커널이 실행되고 나면 언마운트 후 Root File System을 읽기+쓰기 모드로 리마운트
6. 이후 Init 프로세스(PID 1)를 호출

3.4 Init(sysV)

init 시스템은 sysV와 systemd로 구분된다.

sysV init은
1) init 프로세스 - 커널 실행 후 처음으로 실행되는 프로세스(PID 1)
2)/etc/inittab 파일 - 모든 시작 활동을 감독하는 파일
3)일련의 shell script - 각각의 해당 서비스를 시작
로 구성된다.

1) Configuration: /etc/inittab

etc/inittab의 초기 시스템 구성 파일을 읽어옴(Operation mode, 런레벨, 콘솔 등)

2) Initialization: /etc/init.d/rc

/etc/init.d/rc.S(debian) 명령 실행: 시스템 초기화-스왑영역 로드, 필요 없는 파일 제거, 파일시스템 점검 및 마운트, 네트워크 활성화 등

3) Services: /etc/init.d 및 /etc/rcN.d 디렉토리들

지정된 런레벨에 해당하는 스크립트 및 서비스 실행,
/etc/init.d 의 실행 가능한 서비스들 모두 실행(cron, ssh, lpd 등등)

3.5 Init(systemd: BSD Init)

systemd

systemd는 Ubuntu, RHEL 등의 init system이다. sysV에 비해 시작 속도가 빠르다. target 유닛을 사용해 부팅, 서비스 관리, 동기화 프로세스를 진행한다. systemd가 적용된 리눅스 시스템이 시작되면, 첫 번째로 시작하는 프로세스(PID 1)는 systemd 데몬이 된다(init 데몬 아님).

Cent OS 7 버전 이후에는 런레벨 개념이 systemd target으로 대체되었다.

target

target은 런레벨이 익숙한 사람들을 위해 System V init 런레벨과의 호환성을 유지하고 있다(예 - graphical.target은 runlevel5로 생각 가능). 하지만 target이 런레벨보다 종류가 더 많고, 더욱 다양한 유닛을 한층 더 세부적으로 관리한다.

이후의 systemd 서비스를 관리하기 위한 기본 명령은 systemctl이다.

systemd boot process

systemd는 시스템이 시작되면 종속 요소를 만족시키는 기본 target(데스크톱은 graphical.target, 서버들 대부분은 multi-user.target의 symbolic link)의 모든 서비스 또한 시작시킨다.

#첫 번째 .target 유닛

[Unit]

Description=yon boot target
Requires=multi-user.target
Wants=yonbar.service
After=multi-user.target rescue.service rescue.target
  • Requires = hard dependencies
  • Wants = soft dependencies (시작이 필요하지 않은)
  • After = 여기서 정의된 서비스들 실행 이후에 부팅할 것

4. 마치며

실무를 수행할 당시, 사내 정전 일정으로 인해 부서 내 가용 서버를 모두 shutdown해야 했었던 적이 있다. 다만, 전임자의 부재로 인해 특정 서버들의 root password를 몰라 접속이 불가능했고, 결국 피지컬 서버 강제 종료라는 극단적인 방법으로 서버 shutdown을 수행했던 경험이 떠올랐다.

root password를 재설정하여 관리자 권한을 다시 설정해줌으로서 이전의 극단적인 방법으로 서버를 shutdown하지 않을 수 있다는 점을 알게 됨과 더불어, 리눅스 부팅에 대해 심층적으로 살펴보며 부팅 단계의 A to Z를 이해하는 엔지니어로 거듭나기로 다짐한다.

참조 링크:

리눅스 시스템 부팅 프로세스(리눅스 부팅과정)
Linux, 부트로더 GRUB
커널이란 무엇인가
System V init vs Systemd (런레벨vs타겟)

profile
Hello Engineering World

0개의 댓글