Linux

리눅스 부팅 과정

rygus 2025. 7. 30. 00:14
728x90

안녕하세요. 

오늘은 리눅스 부팅 과정에 대해 살펴보겠습니다.

1. 전원 공급 및 BIOS 단계

먼저 메인보드에 전원이 들어오면서 CPU가 ROM에 저장되어 있는 펌웨어인 BIOS를 실행합니다.

BIOS는 아래 두 절차를 실행하게 됩니다.

 

a. POST (Power-On Self-Test): CPU, 메모리, 그래픽카드 등 하드웨어들에 문제가 있나 없나 검사하는 단계
b. 부팅 장치 선택: BIOS는 설정된 부팅 우선순위에 따라 부팅할 장치를 결정하는 단계

(컴퓨터를 처음 구매하실 때 부팅 usb를 만들어서 bios에 진입하여 부팅 순서를 바꾸어 윈도우 설치를 많이들 해보셨을겁니다.)

 

2. 부트로더 (Bootloader) 단계

모든 저장 장치(USB, 디스크 등)는 첫 번째 섹터에 MBR(Master Boot Record)"이란 영역을 갖고 있습니다. 

해당 영역에는 커널을 메모리에 올릴 수 있는 부트로더라는 녀석이 들어있습니다. 

(리눅스에서 가장 널리 사용되는 부트로더는 **GRUB(GRand Unified Bootloader)**입니다.)

"부트로더"가 RAM에 올라가고 "부트로더"는 메모리에 커널을 올립니다.


부트로더가 실행되면 사용자에게 부팅할 운영체제나 커널 버전을 선택할 수 있는 메뉴를 보여줍니다. 

사용자가 선택하거나 정해진 시간이 지나면 다음 단계로 OS에게 제어권을 넘깁니다.

VMware 등에서 리눅스 환경을 가상화 해보셨다면 많이들 보셨을겁니다. 

 

3. PID 1번 실행 단계

커널이 메모리에 올라가고 나면 커널은 이제 PID 1번을 갖는 리눅스의 첫 프로세스를 실행시킵니다. 

init 또는 systemd인데요. 

최신 리눅스 배포판(우분투 15.04 버전부터)에서는 전통적인 init 시스템 대신 systemd을 사용합니다.

최신 환경에서는 systemd를 사용합니다. 

현재 저는 우분투 22.02 버전을 사용하고 있습니다. 

그렇다면 왜 systemd가 아닌 init이라고 나와있는 것일까요? 

최신 리눅스 배포판(우분투 15.04 버전부터)에서는 전통적인 init 시스템(SysVinit) 대신 systemd를 기본 init 시스템으로 사용합니다. 

하지만 과거의 init 시스템을 기반으로 만들어진 수많은 스크립트와 프로그램들이 문제없이 동작하도록, /sbin/init 파일을 실제 systemd 실행 파일을 가리키는 심볼릭 링크로 만들어 두었습니다.

실제로 심볼릭 링크를 통해 init에서 systemd로 향하는 것을 확인할 수 있습니다.

 

여튼 이 systemd는 부모 프로세스로 수많은 자식 프로세스들을 생성하여 시스템에 필요한 프로세스들을 실행하게 됩니다. 

 

왼쪽 빨간 박스의 systemd가 오른쪽 초록 박스의 수 많은 자식 프로세스들을 생성하게 되는 것입니다.

이렇게 systemd가 부팅에 필요한 프로세스들을 모두 실행하면 비로소 로그인 프롬프트가 나타나 부팅 과정이 완료되게 됩니다.

 

번외. systemd와 init의 차이

가장 큰 차이점은 init의 경우 직렬 방식을 사용하고 systemd의 경우 병렬 방식을 사용하게 됩니다. 

init 프로세스는 부팅이 시작되면 모든 서비스를 순차적으로 실행합니다.

만약 맨 앞에 있는 서비스가 켜지는데 오래 걸린다면 덩달아 뒤에서 기다리던 프로세스들의 시작도 늦춰지는 것입니다. 

부팅 자체가 많이 지연될 위험이 있습니다.

 

그러나 systemd의 경우 부팅에 필요한 프로세스들만 먼저 "병렬적"으로 실행하여 다른 프로세스들도 기다릴 필요가 없어지니 부팅시간이 init에 비해 많이 빠르다는 장점이 있습니다. 

 

감사합니다.