본문 바로가기
Linux/Linux

Linux) 리눅스 부팅 과정

by LILO 2021. 4. 27.
반응형

Linux Booting Sequence

 

리눅스 부팅 순서(과정)은 시스템 엔지니어 면접에서 가장 많이 나오는 질문 중 하나입니다. 

"왜 많이 나오는걸까?"라는 생각을 했었습니다.

 

 

위는 부팅 로그와 관련된 "dmesg"입니다. 보통 예상치 못한 재기동이 될 때나 OS가 행 걸리고나서 원인을 분석하려고 봅니다. 재기동이 된 시점을 찾으려면 리눅스의 부팅 순서를 정확하게 알고 있어야 해당 부분의 로그를 찾을 수 있겠다는 생각이 들었습니다.

 

제가 생각했을 때 직접적인 이유는 Trouble Shooting(문제 해결)과 기본적으로 자신이 사용하고 있는 OS가 어떠한 로직으로 돌아가는 것인지 알고 사용하는지를 알기 위함인것 같습니다.

 

 

 

Linux Booting Sequence

 

먼저 서버(Bare Metal)의 전원 버튼을 눌러서 서버를 킵니다

 

 

 

 

 

서버를 키면 ROM-BIOS 프로그램이 실행됩니다.

 

BIOS 프로그램이 켜지면 가장 먼저 자체진단기능을 실행합니다. 이는 POST(Power On Self Test)라고 불립니다.

 

- CMOS 검사, CPU, Memory, GPU 등 각종 장치의 이상 유무를 검사한 후 이상이 없다고 판단이 되면 장치를 사용할 수 있도록 초기화 시킵니다. 

- 장치에 이상이 있으면 비프음이 울립니다.

 

POST 과정이 이상이 없으면 부팅 매체에서 부트로더를 불러옵니다. 앞 전에 파일 시스템에서 이야기할 때 언급했던 0번 섹터인 MBR에 해당되는 부분을 읽어오는 것입니다.

부트로더가 메모리에 적재되면 BIOS는 종료되고 해당 시스템의 제어권은 부트로더가 가지게 됩니다.

 

부트로더: OS가 사용되기 전에 미리 실행되고 커널이 제대로 시동되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 OS를 시동시키는 역할 (예전에는 LILO가 현재는 GRUB이 Default로 지정되어있음)

 

 

 

 

부트로더 실행되는 것을 확인합니다.

 

 

부팅할 커널을 선택합니다. 부트로더 창은 5초의 Timeout이 기본으로 설정되어 있습니다. 만약 설정 값을 바꾸고 싶을 경우에는 "/boot/grub2/grub.cfg"를 이용해서 바꾸면 됩니다.

 

추가로 저는 "부팅 이미지는 어느 위치에 있는지는 알겠는데 도대체 어떻게 선택창이 생기는 것일까?"라는 의문이 생겼었습니다.

 

 

아래 사진을 보면 "/boot/grub2/grub.cfg"라는 설정 파일에 가지런히 나열되어 있는 것을 확인할 수 있습니다.

 

1번과 2번의 부팅 이미지명이 정확히 명시되어 있는 것을 볼 수 있고 어느 파티션을 참조하고 있다는 것도 확인할 수 있습니다. 

 

GRUB에서 커널 이미지를 불러 들이고 해당 시스템의 제어권을 커널에게 넘겨 줍니다.

 

 

 

 

커널이 로딩되고 커널은 swapper라는 Process ID가 0인 친구를 호출합니다.

swapper라는 프로세스는 굉장히 낯설 수도 있습니다. 왜냐하면 "ps -ef"를 쳐도 나오지 않는 프로세스이기 때문입니다.

 

 

1번과 2번 프로세스의 부모 프로세스로 예상을 할 수 있습니다. 우리가 리눅스를 사용하다 보면 무언가를 실행되고 있는 시간도 있을테고 사용자의 입력 값을 기다리다 지쳐서 잠들어있는 시간도 있을 것입니다.

 

swapper 프로세스는 잠들어 있는 프로세스를 메모리에서 내려놓고 디스크 공간에 잠시 스왑 시켜줍니다. 프로세스가 일을 해야돼서 깨어나야될 시간이 되면 디스크의 프로세스를 다시 메모리로 적재 시키는 역할을 합니다.

 

엄청 간단하게 생각하면 swapper는 프로세스를 스케줄링을 담당하는 스케줄러 역할을 하고 리눅스에서 유일하게 부모 프로세스가 없는 친구입니다.

 

 

 

 

swapper가 이와 같이 커널이 사용할 장비 드라이버들을 초기화하고 init 프로세스(PID 1)를 실행합니다.

 

init 프로세스는 "/sbin/init"으로 실행되고 유저를 위해서 시스템을 설정합니다. 

 

- 파일 시스템의 구조 검사를 하고 마운트합니다

- 서버 데몬을 띄우고 유저의 로그인을 기다립니다

- 유저가 로그인 하면 사용자를 위한 쉘을 띄워줍니다.

 

"/sbin/init"이 동작중이지 않으면 systemd나 service도 동작하지 않습니다. 이 부분을 체감하고 싶으시면 Docker를 이용해 CentOS 설치하는 LAB을 테스트해보면 좋을 것 같습니다.

※ 위의 부분이 Official CentOS Docker image로 "systemctl or service" 명령을 사용할 수 없는 이유입니다. 이의 해답도 /sbin/init에 있다는 점이기도 하고요

 

부팅 로그들을 보면 init 프로세스는 /etc/rc.d/와 /usr/lib/systemd/ 쪽을 참조하고 있음을 알 수 있습니다.

 

 

 

반응형