본문 바로가기
Linux

[Linux] 운영체제의 부팅

by oncerun 2020. 11. 17.
반응형

PC에 설치된 운영체제를 부팅하려면 '부트 프로그램'이 필요하다. 이 프로그램을 boot loader 또는 bootstrap loader라고 하는데 하드디스크로부터 운영체제를 메모리로 적재시키는 프로그램이다.

먼저 컴퓨터의 전원을 켜면 프로세서가 주기억장치에 저장되어있는 BIOS 프로그램을 찾아 실행시킨다.(예외도 있다.)

대개 이것은 첫 번째 프라이머리 하드디스크에서 첫 트랙의 첫 번째 섹터에 해당하는 MBR(Master Boot Record)에 설치된 부트로더를 메모리에 올려서 실행시킨다.

 

부트 로더는 컴퓨터가 시작될 때 수행되는 첫 번째 프로그램으로 운영체제를 메모리에 적재하여 실행시키며, 운영체제에 시스템의 제어를 넘겨주는 일을 수행하는 작은 기계어 프로그램이다.

 

부트 로더는 MBR에 함께 존재하는 파티션 테이블의 정보를 이용하여 부팅 가능한 파티션을 찾고 운영체제 커널을 찾아 로드하고 실행시킨다.

파티션 테이블에는 파티션 별로 다음과 같은 정보가 저장된다.

- 파티션의 시작과 끝을 나타내는 주소 : 파티션의 크기와 위치를 알 수 있다.

- 파티션이 부팅 가능한가에 관한 정보

- 파티션 타입: 두 자리 16진수로 표현되며 운영체제, 파일 시스템의 종류나 개발 회사 등을 나타낸다.

 

서버용 리눅스를 사용하는 경우, 특별히 시스템을 점검해야 하는 상황이 아니라면 시스템을 종료하지 않는다.

따라서 윈도 시스템을 사용하는 경우와 달리 부팅이 자주 일어나는 일이 아니다. 리눅스의 부트 로더 프로그램으로는 과거에 LILO가 널리 사용되었으나 최근의 배포판에는 거의 GNU의 'GRUB 2''가 사용된다.

 

부트로더 프로그램인 GRUB는 커널 실행을 위한 옵션 설정을 위해 설정 파일로 /boot/grub/grub.conf을 사용한다.

커널 자체도 프로그램이므로 부트 로더가 커널을 메모리에 적재해야 커널이 실행된다. 여기까지가 부트 로더의 역할이다.

커널이 메모리에 로드되었지만 아직까지 사용자 로그인의 처리나 서버 데몬 프로그램 등의 사용자 환경이 준비되어 있지 않다. 리눅스 시스템이 지속적으로 제공해야 하는 서비스는 일반적으로 데몬 프로세스에 구현되어 있다.

따라서 커널은 각 데몬 프로세스를 하나의 서비스로 관리하기 위해 초기화 데몬을 수행한다.

 

init 프로세스

 커널은 사용자 환경을 준비하기 위해 /sbin/init 프로그램을 실행시켜 초기화 작업을 위임한다.

이 프로그램을 init 프로세스라고 하는데 나머지 부팅 과정을 담당하며 최종적으로 사용자 환경을 준비하는 기능을 한다.

 

프로세스라는 것은 파일에 저장되어 있던 프로그램이 메모리에 적재되어 실행 중인 상태를 말한다.

프로세스는 고유의 프로세스 번호를 갖는데 이것을 PID라고 하며, 자신을 실행시킨 부모 프로세스의 고유번호를 의미하는 PPID도 갖는다. 커널은 init을 실행시키면서 모든 제어권을 init에 넘기고 이후에는 사용자 프로그램이 특정 기능을 요청하면 처리해 주는 등의 일을 하게 된다. init 프로세스는 커널이 가장 처음 실행시키는 사용자 프로세스이며 pid 1번을 가지는 특별한 프로세스로 커널 프로세스를 제외한 모든 사용자 프로세스의 부모 또는 조상 프로세스가 된다.

 

init은 /etc/init 디렉터리 안에 포함되어 있는 job 설정 파일을 읽어 들이고  이벤트를 감시한다.

ls /etc/init 명령을 실행하여 .conf확장자를 가진 파일들이 job의 설정 파일이다.

 

이러한 init 데몬은 전통적인 방식의 데몬이 아닐 경우 이벤트 기반으로 job을 처리한다.

이벤트가 발생할 때 init 데몬이 인지하여 자동으로 상응하는 job을 시작 또는 정지시킨다.

job은 태스크와 서비스로 구분되는데 기본적으로 서비스로 간주되며 스스로 종료하지 않고 실행 상태로 남아 계속 임무를 수행하는 데몬 프로그램과 같은 것이 서비스이다.

태스크는 일정한 임무를 처리한 후 대기상태로 남는 프로세스이다.

 

전 에벨

 부팅 과정에서 init가 시작되면 /etc/init/rcS.conf의 설정에 의해 init은 /etc/rc.d/rc.sysinit 스크립트를 실행시킨다.

이것은 시스템 초기화를 위한 작업을 수행하는데 패스 설정, 호스트명 설정, 시간 설정, 파일 시스템 검사, 루트 외의 다른 파일 시스템의 마운트, 네트워크 설정 등을 수행한다. 그다음에  init 프로세스는 /etc/inittab 파일에서 지정된 런레벨을 확인하고 telinit 명령을 사용하여 런레벨을 변경한다. 이때 이 파일에서 id:runlevel:initdefault: 부분을 읽어 초기 런레벨을 확인한다. 만약 초기 런레벨이 0이나 6이면 오류가 발생한다.

그러면 /etc/init/rc.conf의 설정에 의해 init 프로세스는 /etc/rc.d/rc 'runlevel' 명령을 실행시킨다. 이 스크립트는 런레벨에 해당하는 rc디렉터리를 찾아 모든 백그라운드 프로세스를 시작시킨다.

 

대부분의 리눅스 배포판은 0~6 사이의 일곱 가지 런레벨을 사용한다.

런레벨 설명
0 시스템이 종료될 때 사용되는 레벨이다. 기본값으로 설정해서는 안된다.
단일 사용자 모드로, 로그인 과정 없이 root 사용자로 로그인되며 콘솔에서 시스템점검이나 복구를 위한 관리자 모드로 사용된다. 명령 행 인터페이스가 제공되며 네트워크 서비스는 제공되지 않는다.
2 기본적으로 네트워크 서비스를 제공하지 않는 다중 사용자 모드이다. 명령 행 인터페이스만 제공한다.
3 모든 네트워킹을 지원하는 다중 사용자 모드로 리눅스 초기 시절에 보편적으로 사용되었던 레벨이며 명령 행 인터페이스만 지원한다.
4 거의 사용되지 않지만 사용자가 필요에 따라서 실행을 원하는 데몬이나 서비스를 /etc/rc.d/rc4.d 디렉터리에 위치시켜 고유의 런레벨로 정의할 수 있다.
5 그래픽 사용자 환경을 제공하는 다중 사용자 모드로, 최근의 배포판에서 기본으로 설정된다
6 시스템을 재부팅할 때 사용되는 레벨이다. 기본값으로 설정해서는 안된다.

 

runlevel 명령으로 이전 런레벨과 현재 런레벨을 순서대로 보여주며 이전 런레벨이 없으면 N이 표시된다.

root사용자는 init 'runlevel' or telinit 'runlevel'을 실행하면 런레벨이 변경된다. 

반응형

'Linux' 카테고리의 다른 글

vi 명령어  (0) 2020.11.17
[Linux] 서비스의 실행과 종료  (0) 2020.11.17
[Linux] 파일의 종류  (0) 2020.11.16
셸 변수  (0) 2020.11.16
명령의 연결과 확장  (0) 2020.11.16

댓글