Ubuntu Linux

리눅스 시스템의 부팅 (1)

미고코딩 2022. 5. 21. 17:24

리눅스의 부팅은 PC의 전원을 켜는 순간부터 리눅스가 완전히 동작해 로그인 프롬프트가 출력되는 과정을 모두 포함해서 이야기합니다.

 

시스템을 관리하는 사람이라면, 이 과정에 대한 이해도가 높아야 합니다. 과정이 진행되면서 지금이 어느 단계인지, 이런 부분에 대한 이해를 포함한 이야기입니다. 부팅이 진행되다 어떤 문제가 발생했을 때 조치가 필수적이기 때문이죠.

 

리눅스 시스템의 부팅은 PC 부팅, LINUX 부팅으로 나뉩니다. 리눅스가 설치된 하드웨어의 부팅과 리눅스 OS 부팅 절차로 구분된다는 이야기입니다. 리눅스는 본래 PC를 기반으로 개발됐기 때문에, PC를 중심으로 한번 살펴보겠습니다.

 

 

과정을 6가지로 나눌 수 있는데,

 

1. 전원 켜기

2. 바이오스 단계

3. 부트 로더 단계

4. 커널 초기화

5. systemd 서비스 단계

6. 로그인 프롬프트 출력

 

가 되겠습니다. 사실상 1단계는 전원버튼을 누르는 것만으로 끝입니다. 우리가 본격적으로 살펴봐야할 단계는 2단계인 바이오스부터 입니다.

 

 

 

바이오스 단계

PC의 전원을 키면 가장 먼저 바이오스가 동작합니다. 바이오스는 보통 ROM에 저장되어 있어 ROM-BIOS 라고도 불립니다. 바이오스는 PC에 장착된 기본적인 하드웨어의 상태를 확인한 후 부팅 장치를 선택하여 부팅 디스크의 첫 섹터에서 512B를 로딩합니다.

 

이 512B를 바로 부트 레코드 (Master Boot Record) 라고 합니다. 이는 디스크의 어느 파티션에 2차 부팅 프로그램인 부트 로더가 있는지 찾아 메모리에 로딩하는 작업을 합니다.

 

해당 그림은 바이오스 단계를 세부적으로 나눈것입니다. 위와 같은 흐름으로 부트로더가 로드된다고 이해하시면 됩니다.

 

 

 

부트 로더 단계

바이오스 단계에서 MBR은 부트 로더를 찾아 메모리에 로딩합니다. 부트 로더는 일반적으로 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공합니다.

 

리눅스의 대표적인 부트 로더는 GRUB와 LILO 입니다.

 

우분투에선 GRUB를 사용하는데, 기본적으로 멀티부팅이 아닐 경우 GRUB는 메뉴 출력 없이 바로 부팅작업을 진행합니다. 메뉴를 출력하려면 /etc/default/grub 를 통해 파일을 수정해야합니다.

권한에 접근해야 하기 때문에 sudo vi /etc/default/grub 로 접근했습니다. 위 그림은 grub 파일에 접근한 직후입니다.

 

중단에 보이는 GRUB_TIMEOUT_STYLE=hidden 과 GRUB_TIMEOUT=0이 우리가 수정할 부분입니다.

 

GRUB 메뉴를 선택하는 화면을 우리가 보고 넘어가야 하기 때문에, 두 옵션을 바꿔야 합니다.

 

위와 같이 코드를 수정하면, hidden 옵션은 비활성화 되고, 부팅 시 10초간 GRUB 선택메뉴가 출력됩니다.

 

해당 옵션을 적용하려면 :wq로 저장 후 터미널로 나와서 grub를 업데이트 해주어야 합니다. 

 

위 사진에 보이듯 sudo update-grub 로 업데이트를 진행할 수 있습니다.

 

직후 shutdown -r now 명령으로 ubuntu를 재부팅합니다. 

 

그럼 위와 같은 화면을 볼 수 있습니다. 위 화면이 부트 로더 시작화면이 되겠습니다.

 

 

 

 

systemd 서비스 단계

systemd 서비스 단계에 이르면 리눅스가 본격적으로 동작하기 시작했다고 생각하시면 됩니다. 우분투에서 systemd 서비스는 기존의 init( initialize ) 스크립트를 대체한 것으로 다양한 서비스를 동작시킵니다.

 

각 서비스가 시작하는 과정은 화면에 메시지로 출력되는데, 우분투에서는 기본적으로 이 메시지가 보이지 않도록 하고, 대신에 우분투 스플래시 화면이 출력됩니다.

 

 

위 사진과 같은 형식으로 말이죠.

 

systemd는 리눅스의 시스템과 서비스 관리자로서 유닉스의 init 프로세스가 하던 작업을 대신 수행합니다. systemd는 다양한 서비스 데몬을 시작하고, 프로세스들의 상태를 유지하며 시스템의 상태를 관리합니다.

 

계속 언급되는 init 프로세스가 무엇인지는 지금 설명하려고 합니다.

 

init 프로세스

init 프로세스는 스크립트를 순차적으로 실행해 다른 프로세스를 동작시킵니다. 우분투는 14.10 버전까지 자체적으로 개발한 upstart를 기존의 init 대신 사용해왔습니다. 다만 현재는 upstart 를 기본적으로 제공하지 않습니다. 사용자가 직접 apt install 을 해야합니다.

 

이를 명확히 확인하기 위해 man init을 해봤습니다.

 

기존에는 upstart에 대한 메뉴얼이 출력되던 것이 이제는 systemd에 대한 설명으로 대체되었습니다. init이 systemd로 대체된 겁니다.

 

upstart와 관련된 스크립트 파일을 /etc/init 디렉터리에 '작업명.conf' 파일로 구성되어 있는데, 현재는 몇가지 스크립트만 남아있습니다.

 

전통적으로 init과 관련된 스크립트 파일을 /etc/init.d 디렉터리에 있고, 아직 일부 서비스의 스크립트 파일이 남아있습니다.

 

init 스크립트 방식의 서비스와 systemd 서비스가 아직 공존하는 시기라고 생각하시면 됩니다. 일종의 과도기 같은거죠.

 

 

 

 

init 프로세스와 런레벨

init 프로세스는 없어졌지만, init 프로세스에서 사용하던 런레벨의 개념은 이해하고 있어야 합니다. 아직 init 을 사용하는 리눅스 배포판 또는 유닉스도 있고, 런레벨을 지금도 사용하기 때문입니다.

 

init은 시스템을 7가지 단계로 구분하고 있는데, 각 레벨은 아래 표와 같습니다.

 

런레벨 의미 관련 스크립트의 위치
0 시스템 종료 /etc/rc0.d
1, S 응급 복구 모드(단일 사용자 모드) /etc/rc1.d 또는 /etc/rcS.d
2 다중 사용자 모드 /etc/rc2.d
3 /etc/rc3.d
4 /etc/rc4.d
5 그래피컬 다중 사용자 모드 /etc/rc5.d
6 재시작 /etc/rc6.d

 

자주 사용하는 런레벨은 3, 5입니다. 3은 다중 사용자 2,3,4 중에 하나를 골라 사용하는 거고, 5는 평소에 사용하는 사용자 모드이기 때문입니다. 이는 기억해두는 것이 좋습니다.

 

systemd는 리눅스의 서비스 관리와 관련된 복잡한 구조를 가지고 있으며, 여기서 그 내용을 모두 다루기는 힘듭니다. 다만 기본적인 개념을 이해하고 있으면 접근하는 데에 크게 어려움을 겪지는 않을테니 그것만으로 의미가 있을겁니다.

 

우부투는 15.04 버전부터 systemd를 기본 서비스 관리자로 사용하고 있습니다.

 

systemd는 init 방식에 비해 몇가지 장점을 가지고 있는데,

 

1. 소켓 기반으로 작동해 inetd와 호환성을 유지한다.

2. 셸과 독립적으로 부팅이 가능하다.

3. 마운트 제어가 가능하다.

4. fsck 제어가 가능하다.

5. 시스템 상태에 대한 스냅숏을 유지한다.

6. SELinux와 통합이 가능하다.

7. 서비스에 시그널을 전달할 수 있다.

8. 셧다운 전에 사용자 세션의 안전한 종료가 가능하다.

 

 

이정도로 정리할 수 있을 것 같습니다.

 

systemd 관련 명령은 다음 게시글에서 다루도록 하겠습니다.