2021-11-02 리눅스 부팅순서
개요
리눅스의 부팅순서를 설명한다.
서버의 전원 버튼을 누르고 몇 분이 지나면 로그인 프롬프트가 뜬다는 사실은 모두가 알고 있다. 우리가 전원 버튼을 누르고 로그인 프롬프트가 뜨기 전 까지의 과정을 처음부터 따라가보자.
참고사항
리눅스의 부팅순서, RAID의 각 레벨별 설명은 시스템 엔지니어 면접시 단골 질문이기도 하고 OS 트러블슈팅 시 실제로 많은 도움이 되기 때문에 반드시 알아두는 게 좋다.
여담
내 경험으로는 AWS의 Data Center Technician 포지션 면접 때 받은 질문이 "각 RAID 레벨별 동작방식을 설명하시오."였다.
 물론 이걸 영어로 답변해야한다. 그래서 광탈해버렸다.
요약
리눅스 부팅순서는 크게 6단계로 구분할 수 있다.
| # | Name | Description | 
|---|---|---|
| 1 | BIOS | BIOS가 MBR을 실행한다. | 
| 2 | MBR | MBRMaster Boot Record가 GRUB을 실행한다. | 
| 3 | GRUB | GRUBGrand Unified Bootloader가 Kernel을 실행한다. | 
| 4 | Kernel | Kernel이 /sbin/init을 실행한다. | 
| 5 | Init | Init 프로세스가 런레벨 프로그램들을 실행한다. | 
| 6 | Runlevel | 런레벨 프로그램들이 /etc/rc.d/rc*.d를 실행한다. | 
각 단계별 상세설명
1. BIOS
- BIOS는 Basic Input/Output System기본 입출력 시스템의 약자이다.
- 일부 시스템 무결성 검사를 수행한다.
- 부트로더 프로그램을 검색, 로드 및 실행한다.
- BIOS는 플로피, CD-ROM 또는 하드 드라이브에서 부트 로더를 찾는다.
 BIOS 시작 중에 키(일반적으로 F2 또는 F12이며 시스템마다 다르다)를 눌러 부팅 순서를 변경할 수 있다.
- 부트 로더 프로그램이 감지되어 메모리에 로드되면 BIOS가 이를 제어한다.
- 요약 : BIOS는 MBR 부트 로더를 불러오고 실행하는 역할을 한다.
2. MBR
- MBR은 마스터 부트 레코드(Master Boot Record)의 약자이다.
- MBR은 부팅 디스크의 첫 번째 섹터에 위치해있다. 일반적으로 첫번째 디스크 장치명을 의미하는 /dev/hda또는/dev/sda이다.
- MBR은 크기가 512바이트이다. 여기에는 세 가지 구성 요소가 있다. - Bootstrap code : 446bytes 크기의 첫번째 부트 로더 정보
- Partition table : 64bytes 크기의 파티션 테이블 정보
- Signature : 마지막 2바이트는 MBR 유효성 체크 영역으로 항상 0x55AA 값이 들어간다. (Signature 값이 0x55AA가 아닌 다른 값일 경우 부팅시 Operating System not found에러와 함께 부팅이 불가능하다.)
 
- MBR에는 GRUB(구 시스템의 경우 LILO)에 대한 정보가 들어 있다.
- 요약 : MBR은 GRUB 부트 로더를 로드하고 실행한다.
3. GRUB
- GRUB은 Grand Unified Bootloader의 약자이다. 
- 시스템에 여러 개의 커널 이미지가 설치된 경우 실행할 이미지를 선택할 수 있다. 
- GRUB는 부팅시 시작 화면을 표시하고 사용자가 리눅스 커널 선택을 할 때까지 몇 초 동안 기다린다. 아무 선택도 하지 않으면 grub 설정파일에 지정된 대로 기본 커널 이미지를 로드한다. 
- GRUB은 파일 시스템에 대한 정보를 갖고 있다. 구버전의 리눅스 부트로더인 LILO(Linux Loader)는 파일 시스템을 이해하지 못했다. 
- GRUB의 설정 파일은 - /boot/grub/grub.conf이다. (- /etc/grub.conf는 이 파일에 대한 링크파일). 다음은 CentOS의- grub.conf샘플이다.- #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-194.el5PAE) root (hd0,0) kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ initrd /boot/initrd-2.6.18-194.el5PAE.img
- 위의 정보에서 알 수 있듯이 GRUB 설정파일에는 커널과 initrd 이미지가 포함되어 있다. 
- 요약 : GRUB은 커널 및 initrd 이미지를 불러오고 실행한다. 
4. Kernel
- GRUB 설정파일(grub.conf)의root=에 지정된 대로 루트 파일 시스템을 디스크 장치에 마운트한다.
- 리눅스 커널은 /sbin/init프로세스를 실행한다.
- init는 리눅스 커널에서 실행되는 첫 번째 프로그램이기 때문에 프로세스 ID(PID)가 1이다.
 시간날 때 쉘에서- ps -ef | grep init명령어를 입력해서 init 프로세스의 pid를 직접 확인해보자.
- initrd는 초기 RAM 디스크initial ram disk의 약자로 메모리 상의 가상 디스크이다.
 initrd는 리눅스 커널이 부팅되고 실제 루트 파일 시스템이 마운트될 때까지 커널에 의해 임시 루트 파일 시스템으로 사용된다.
- initrd는 initramfs이라는 파일시스템을 갖고 있다. initramfs은 리눅스 커널이 초기에 동작할때 필요한 드라이버나 프로그램, 바이너리 파일 등을 가지고 있어 하드 드라이브 파티션 및 기타 하드웨어에 액세스하는 데 도움을 준다.
5. Init
- /etc/inittab설정파일을 참조해 Linux 운영체제의 실행 수준(Runlevel)을 결정한다.
- 다음은 리눅스 서버에서 사용 가능한 Runlevel 목록이다. - Runlevel - 설명 - 0 - 종료 (Halt) - 1 - 단일 사용자 모드 (Single user mode) - 2 - NFS가 없는 다중 사용자 (Multiuser, without NFS) - 3 - 전체 다중 사용자 모드 (Full multiuser mode) - 4 - 미사용 (unused) - 5 - X11 (GUI) - 6 - 재부팅 (Reboot) 
- 대부분의 리눅스 서버는 Runlevel을 3 또는 5로 설정해서 운영한다. 
- Init 프로세스는 - /etc/inittab설정파일에서 기본 Runlevel을 확인한 후 각 레벨에 맞게 프로그램들을 로드한다.
- 시스템에서 - grep initdefault /etc/inittab명령어를 실행하면 Runlevel 기본 설정을 확인할 수 있다.- # In terminal $ grep initdefault /etc/inittab id:3:initdefault:
- 스스로 시스템 장애를 만들고 싶다면 - /etc/inittab설정파일을 열어 Default Runlevel을 0 또는 6 으로 설정하면 된다.
 이제 우리는 Runlevel 0과 6이 무엇을 의미하는지 알기 때문에 아마도 그렇게 하지는 않겠지만.
6. Runlevel programs
- Linux 시스템이 부팅될 때 다양한 서비스가 자동 시작되는 걸 확인할 수 있다. 
 예를 들어- starting sendmail … OK와 같은 메세지가 이에 해당한다. 이러한 프로그램들은 Runlevel 디렉토리(- /etc/rc.d/rc*.d/)에 의해 자동실행되는 프로세스들이다.
- 기본 초기화 레벨Runlevel 설정에 따라 시스템은 다음 디렉토리 중 하나를 골라 그 안에 나열된 프로그램들을 순차적으로 실행한다. - 실행 레벨 0 – /etc/rc.d/rc0.d/
- 실행 레벨 1 – /etc/rc.d/rc1.d/
- 실행 레벨 2 – /etc/rc.d/rc2.d/
- 실행 레벨 3 – /etc/rc.d/rc3.d/
- 실행 레벨 4 – /etc/rc.d/rc4.d/
- 실행 레벨 5 – /etc/rc.d/rc5.d/
- 실행 레벨 6 – /etc/rc.d/rc6.d/
 
- 실행 레벨 0 – 
- /etc하위에 직접 이 디렉토리에 사용할 수 있는 심볼릭 링크도 있다. 따라서- /etc/rc0.d는- /etc/rc.d/rc0.d에 연결되어 있다.
- /etc/rc.d/rc*.d/디렉토리에서 첫글자가 S와 K로 시작하는 프로그램들을 볼 수 있다.- # === 예시 === S12syslog S80sendmail K02NetworkManager # === 해석방법 === S 12 syslog - -- ------ | | +---> 실행할 프로그램 이름 | +-------> 시퀀스 번호 (숫자가 낮을수록 먼저 실행) +----------> 시작 S=Startup or 종료 K=Kill- 첫글자가 S로 시작하는 프로그램은 자동적으로 시작Startup 된다.
- 첫글자가 K로 시작하는 프로그램은 자동적으로 종료Kill 된다.
- 프로그램 이름에서 S와 K 바로 옆에 숫자가 있다. 프로그램이 시작되거나 종료되어야 하는 시퀀스 번호이다.
 
- 첫글자가 
- 예를 들어, - S12syslog는 시퀀스 번호가 12인 syslog 데몬을 시작한다.
 - S80sendmail은 시퀀스 번호가 80인 sendmail 데몬을 시작한다.
 시스템이 부팅될 때 syslog 프로그램은 sendmail의 시퀀스 번호- 80보다 더 낮은- 12이기 때문에 sendmail 프로그램보다 먼저 시작된다.
이상으로 리눅스 부팅순서에 대해 알아보았다.