시스템 부팅 과정, 부트로더와 런레벨

리눅스 시스템이 부팅되는 과정은 아래와 같다.

  1. 전원을 켜면 바이오스가 실행되며, POST(Power On Self Test, 하드웨어들을 인식하여 이상 유무를 체크)와 부트로더를 로딩한다.

  2. 부트로더는 커널로드와 스와퍼 프로세스를 호출한다. 리눅스 부트로더는 LILO 혹은 GRUB 을 사용하는데, 이런 부트로더들은 리눅스 커널을 선택하고 메모리에 로드하여 부팅을 진행한다.

  3. 스와퍼 프로세스는 리눅스 커널로드에서 인식했던 장치들의 드라이브를 초기화하고, init 프로세스(/sbin/init)를 수행한다.

  4. init 프로세스는 /etc/inittab 을 읽어들이며, 런레벨을 결정한다.

  5. /etc/rcS.d 아래의 스크립트들을 실행하여 시스템을 초기화하고, rcX.d 스크립트로 부팅 레벨에 대해 디렉터리 내의 스크립트를 순차적으로 실행시킨다.

  6. 부팅 레벨이 5일 경우에는 X-윈도우를 실행하여 GUI 환경을 구성한다.


부트로더

부트로더란 bootstrap loader 의 줄임말로, 디스크 등에 저장된 운영체제 프로그램을 읽어 메모리에 로드해주는 프로그램이다.

그렇기 때문에, 운영체제가 시동되기 이전에 시스템이 부팅될 때 먼저 실행됨으로써 커널이 돌아가기 위한 작업을 마무리하고, 운영체제 이미지를 메모리에 복사함으로써 최종적으로 운영체제를 시동시킨다.

부트로더(부트 매니저)는 512 바이트의 크기로, 하드디스크의 첫번째 섹터인 MBR에 위치한다.

MBR은 부트로더와 파티션 정보를 저장하며, 각각의 주 파티션들은 자신의 부트 레코드를 MBR에 기록한다.

따라서 여러 운영체제를 파티션을 나눠 설치할 수 있고, 부팅 시 운영체제를 선택하여 작업할 수 있는 것이다.

일반적으로 LILO 와 GRUB 을 많이 사용하는데, LILO는 리눅스 전용이고 GRUB은 다른 운영체제에서도 사용이 가능하기 때문에, 듀얼부팅을 할 때 GRUB 을 확인할 수 있다.

앞서 언급했듯이, 시스템에 전원이 들어올 경우 바이오스에서 제어권을 가지고 하드웨어를 점검한 후, MBR에 위치한 LILO 혹은 GRUB에게 제어권을 넘기는 것이다.

GRUB

GRUB은 리눅스의 전통적인 부트로더들 중 하나로, LILO의 단점을 보완해 설정 및 사용을 편리하게 만든 부트로더이다.

부트 정보를 사용자가 변경 가능하기 때문에, 정보가 올바르지 않더라도 바로 수정이 가능하다.

대화형 설정이며 파일 시스템과 커널 실행 포맷을 인식하기 때문에, 디스크 상에서 커널의 물리적 위치를 알 필요 없이 커널 경로와 커널 이미지 파일명만 알고 있으면 부팅이 가능하다.

환경 설정 파일은 /etc/default/grub/etc/grub.d/*에 존재하여, 이들을 참조하여 GRUB이 /boot/grub/grub.cfg 설정 파일을 자동으로 만들어낸다.


런레벨

리눅스를 부팅할 때 작동하는 서비스들이 있는데, 이들을 런레벨에 따라 조정할 수 있다.

부팅 과정에서 모든 프로세스들의 부모 프로세스인 init 을 수행할 때 런레벨에 따라서 init 의 처리가 달라진다.

런레벨은 0 부터 6 까지로 아래와 같다.

런레벨기능
0시스템 종료
1root 만 로그인 가능한 단일 사용자 모드, 시스템 점검 및 복구, 루트 비밀번호 분실 시 사용
2네트워크가 없는 다중 사용자 모드
3CLI 환경에서의 다중 사용자 모드
4미사용
5GUI 환경에서의 다중 사용자 모드
6시스템 재시작

각 런레벨에 따른 스크립트들이 /etc/rc0.d 아래에 링크가 걸려있으며, 일반적으로는 /etc/init.d 아래에 있는 파일들이 원본이다.

링크된 스크립트의 파일명은 S, K, D 와 숫자로 시작하는데, 각각 시작, 종료, 비활성화를 의미한다.

/etc/rcS.d 아래에는 init 프로세스가 시작하는 시점에 실행될 스크립트들이 들어있어서, 런레벨이 진입하기 전에 기본적으로 실행된다.

즉 맨 앞에서 언급한 부팅 순서에서 4~5번을 정리하자면, init 프로세스가 /etc/inittab 을 읽어 런레벨을 결정하고, /etc/rcS.d 아래의 스크립트들을 실행해준 뒤, 런레벨에 맞는 /etc/rcX.d 디렉토리의 스크립트를 실행한다.

현재 실행된 런레벨은 runlevel 명령어로 확인 가능하며, sudo init [런레벨]처럼 사용하여 런레벨을 바꿀 수도 있다.

$ runlevel
N 5