시스템 보안을 알아보던 중, Linux 시스템의 부팅과정이 어떻게 이루어지는지 알 필요가 있고 자주 망각하기 때문에 정리하려고 글을 쓰려한다.

Desktop에 Ubuntu를 설치해놨으니 부팅과정이 어떻게 이루어지는지는 알고 쓰는게 좋을 것 같다 .. --

 

 

리눅스 부팅 프로세스는 다음과 같이 크게 이루어진다.

1. Hardware Initializing

2. OS Loading

3. Launching System Services

4. User Interaction

Linux Boot Process

 

우리가 컴퓨터 전원을 누르게 되면 BIOS/UEFI가 실행되고 CPU, RAM 과 같은 하드웨어 컴포넌트를 초기화 한다.

BIOS와 UEFI는 차후 자세히 설명하고 간단히 설명하자면 컴퓨터 내부 Built-in program code를 실행하는 펌웨어 인터페이스이다.

이후, 하드웨어 초기화가 완료되면 POST(Power-On-Self-Test)를 진행하게 되는데, POST는 하드웨어의 상태를 체크하는 절차라고 보면 된다.

 

POST에 실패하게 되면 컴퓨터에서 "삐-" 거리는 소리가 들릴 것이고 내부에서는 BIOS/UEFI에 에러 메시지를 반환할 것이다.

(에러 메시지에 따라 에러 핸들링이 처리되는 코드는 당연히 존재한다.)

성공하게 되면 BIOS/UEFI는 MBR(Master Boot Record)를 호출하고 Boot loader의 위치를 탐색한다.

MBR (Master Boot Record)

MBR같은 경우 여러개의 Partition Entry의 주소가 담겨져 있고, 해당 Partition Entry에는 Bootloader image가 담겨져 있다.

(멀티부팅에서 컴퓨터를 킬 때마다 Linux와 Windows 가 저장된 파티션을 선택하는 화면이 나오는데 그 부분이 아마 Partition Entry List 인듯 하다.)

 

아래 사진에서

1. Bootstrap code Area: primary boot loader 정보가 담겨져 있다.

2. Partition Entry 1~4: 파티션 테이블 정보가 담겨져 있다.

3. Boot Signature: MBR의 무결성 체크를 위한 서명

( Secure Boot에 사용되는 것으로 알고 있는데, 나중에 때가되면 정리해서 설명하겠다. )

MBR Structure

MBR에는 4개의 Partition entry가 존재하는데, 일반인이 쓰기에는 하나만 써도 다른 것들은 쓸 일이 없지만, 연구개발자들은 4개도 부족한 것 같다. (Limitation에서 4개 밖에 없다는 점을 언급하는 것으로 보아..)

 

GRUB (Grand Unified Boot Loader)

 

Linux에서 자주 널리 쓰이는 boot loader이다. 

Bootloader는 OS Image를 실행하고 메모리에 올리는데 사용되며, Unix 계열의 OS에서 자주 쓰인다.

OS를 실행하고 메모리에 올린다는 말은, 우리가 선택한 OS의 Kernel을 메모리에 올린다는 뜻이다. GRUB은 configuration file인 

grub.cfg, menu.lst 가 존재한다. 이를 통해 유저가 부팅 옵션을 커스터마이징이 가능하다.

 

Initrd Image(초기 RAM 디스크 이미지)

 

GRUB를 통해 리눅스 커널을 메모리에 로드하게 되면, 커널은 스스로 압축 해제한 후, initrd를 이미지를 임시 루트 파일 시스템으로서 미리 지정된 메모리 위치에 로드된다.

커널은 Initrd 내부의 코드를 실행하며, 코드는 디스크 컨트롤러, 파일 시스템과 같은 필수적인 드라이버를 로드한다. 

이 과정은 실제 루트 파일 시스템으로 전환하기 위해 시스템을 준비하는 과정이다.

작업이 완료되고 커널이 초기화를 완료하면 initrd는 커널에 시스템 제어권을 인계하고 커널은 실제 루트 파일 시스템을 마운트한다.

(initrd는 실제 루트 파일 시스템을 가동하기 위한 빌드업 과정이라고 보면 될 것 같다.)

 

이후 내용은 다음 글에서 설명하겠다.