리눅스 배포판과 버전에 따라 초기화 시스템이 다를 수 있다. 과거에 사용되던 ‘전통적 init 데몬(SystemV init 데몬)'은 단순히 런레벨(runlevel)에만 기초하여 순차적으로 서비스를 실행시키는 방법이었다. 런레벨은 ‘부팅 모드’라고 할 수 있으며 뒤에서 설명한다. 이 방법은 단순하지만 새로운 하드웨어나 새로운 서비스의 등장에 효율적으로 대처하기 힘들었다. 따라서 기존 방식과는 달리 이벤트 기반으로 서비스를 실행함으로써 변경에 효율적으로 대처하고 무엇보다 전체 초기화 과정을 빠르게 개선할 필요가 있었다. 예를 들어 시스템 상태가 변경되었다는 이벤트가 발생되면 미리 설정된 대로 관련 서비스 데몬을 시작하거나 정지하는 동작을 한다. USB 방식의 프린터가 연결되면 프린터 관련 서비스 데몬을 시작하고 네트워크가 가동되면 그제야 아파치 웹 서버를 시작하는 방식이다. 그래서 개발된 것이 '업스타트 init 데몬)이며 가장 최근에는 systemd 데몬'으로 발전하고 있다.
CentOS-6.8은 '업스타트 init 데몬' 을 사용하여 초기화 작업을 수행하며, 앞으로 'init', 'init 프로그램', 'init 프로세스', 또는 'init 데몬'이라 함은 이 방식을 가정하기로 한다. 먼저 사용 중인 리눅스 시스템이 어떤 초기화 시스템을 사용하는지 확인할 필요가 있다. - head 명령을 실행하였을 때 PID가 1인 프로세스가 있다면 systemd를 사용하고 있다는 의미이다. '전통적 init 데몬' 이나 '업스타트 init 데몬'은 초기화 과정에서 똑같이 'init'라는 이름의 프로세스를 사용하는데 strings /sbin/init | grep -i upstart 명령을 실행하여 결과가 출력된다면 리눅스 시스템이 '업스타트 init 데몬'을 사용하는 것이다. 리눅스 부팅 과정에서 시스템 서비스가 어떤 과정을 통해 어떻게 시작되는지 살펴보자. 그리고 관리자가 각 서비스를 개별적으로 시작시키거나 종료시키는 방법과 초기 런레벨에서 자동으로 각 서비스를 활성화 또는 비활성화 시키는 방법을 알아보자.
init 프로세스
커널은 사용자 환경을 위해 /sbin/init 프로그램을 실행시켜 초기화 작업을 위임합니다. 이 프로그램을 'init 프로세스'라고 하며, 부팅 과정을 담당하여 최종적으로 사용자 환경을 준비하는 역할을 합니다. 프로세스는 파일에 저장되어 있던 프로그램이 메모리에 적재되어 실행 중인 상태를 말합니다. 실행 중인 프로세스가 다른 프로그램을 실행시키기 위해서는 새로운 프로세스를 만들어야 하는데, 이때 프로세스 간에 부모와 자식 관계가 형성됩니다.
프로세스는 고유한 프로세스 번호를 가지며 이를 PID(Process ID)라고 합니다. 또한, 자신을 실행시킨 부모 프로세스의 고유번호를 나타내는 PPID(Parent Process ID)도 갖고 있습니다. init를 실행시키면서 커널은 모든 제어권을 init에게 넘기고, 이후에는 사용자 프로그램이 특정 기능을 요청하면 처리해 주는 등의 일을 수행합니다. init 프로세스는 커널이 가장 처음 실행시키는 사용자 프로세스이며, PID 1번을 가지는 특별한 프로세스로 '커널 프로세스'를 제외한 모든 사용자 프로세스의 부모 프로세스가 됩니다.
init는 /etc/init/ 디렉터리 안에 포함되어 있는 job 설정 파일을 읽어 들이고 이벤트를 감시한다. init는 리눅스가 종료(또는 셧다운이라 함)될 때까지 실행을 지속하는 데몬 프로세스이다. '업스타트 init 데몬'과 관련이 있는 job 설정 파일의 예를 보면 다음과 같다. 이것은 CentOS 리눅스에 로그인하여 터미널 창을 열고 ls /etc/init 명령을 실행하여 /etc/init/ 디렉터리에 포함된 job 설정 파일을 나열한 결과이다. job 설정 파일의 확장자는.conf이다.
'업스타트 init 데몬'은 이벤트 기반으로 job을 처리합니다. 각 job 설정 파일에는 어떤 상황에서 job을 시작 또는 정지할 것인지, 그리고 job을 수행하기 위해 어떤 명령이나 스크립트를 수행할 것인지에 대한 정의가 들어 있습니다. 이벤트가 발생하면 init 데몬이 자동으로 상응하는 job을 시작하거나 정지시킵니다. 이벤트 발생의 원인으로는 시스템 시작, 런레벨 변경, 특정 job의 시작 또는 종료, USB 장치의 연결 등이 있습니다. job은 태스크(task)와 서비스로 구분되며, 일반적으로는 서비스로 간주됩니다. 서비스는 스스로 종료하지 않고 실행 상태로 유지되며, 데몬 프로그램과 같은 것입니다. 태스크는 일정한 작업을 처리한 후 대기(waiting) 상태로 남는 프로세스입니다. 또한, initctl 명령을 사용하여 init 데몬을 제어할 수 있습니다. initctl list 명령을 실행하면 현재 정의된 job의 목록과 job의 상태를 확인할 수 있습니다.
'업스타트 init 데몬'도 기존의 init 데몬과 호환되도록 설계되었기 때문에 '전통적 init 데몬'의 실행 방식을 알고 있다면 초기화 절차를 쉽게 이해할 수 있을 것이다.
런레벨
런레벨은 리눅스 운영체제에서 시스템이 부팅되면서 동작하는 모드를 나타냅니다. 각 런레벨에는 숫자로 표시되며, 실행되는 프로세스가 결정됩니다. 보통 06까지의 총 7개의 런레벨이 있으며, 0은 시스템을 종료하는 런레벨, 1은 시스템을 단일 사용자 모드로 시작하는 런레벨, 25는 사용자 모드에서 시스템을 시작하는 런레벨, 6은 시스템을 재부팅하는 런레벨입니다. 런레벨은 시스템의 상태를 변경하는 데 사용되며, 시스템 초기화 및 관련 서비스를 실행합니다.
'Computer Science' 카테고리의 다른 글
순차접근 저장장치 (0) | 2023.03.26 |
---|---|
입출력 처리 유형 (0) | 2023.03.26 |
데이터베이스 관리 시스템(DBMS)의 개요 및 목적 (0) | 2023.03.26 |
가상 메모리 (0) | 2023.03.26 |
운영체제의 부팅 (0) | 2023.03.26 |
댓글