init 프로세스 그리고 systemd

컴퓨터공부/리눅스 2016. 10. 8. 16:31 Posted by 아는 개발자

리눅스 pc를 부팅 할 때 커널 메모리에 로드되고 여러가지 초기화 과정(하드웨어, 페이지 테이블)이 정상적으로 이뤄지면 커널은 프로세스들을 만들어 사용자가 컴퓨터가 사용 할 수 있는 환경을 만드는데 이때 가장 먼저 만들어 지는 프로세스가 init 프로세스이다


(첫번째로 만들어지기 때문에 pid를 1을 가진다. 프로세스 이름은 init이다)


init프로세스는 가장 먼저 생성되어 부팅시 자동으로 실행해놓은 프로그램들(네트워크 서비스나 usb driver 등록 등등)을 실행시켜준다. 실행시켜주는 방법은 간단히 fork 해서 프로세스를 생성하는 것이다. 정상 부팅후 pstree로 프로세스간 관계를 살펴보면 다음과 같다.


(init 프로세스를 시작으로 여러 프로세스들이 얽혀서 생성되었다. 모든 프로세스들의 조상인 느낌이다, 하지만 가장 마지막에 죽는다)


밖에 보이지 않고 뒤에 숨어서 여러 프로세스를 관리하는 것을 데몬이라고 하는데, init 프로세스가 가장 대표적인 예이다. 시스템이 꺼지기 전까지 살아남아서 시스템의 전반적인 사항들을 관리한다.


init 프로세스가 생성하는 프로세스의 목록은 /etc/rc[숫자].d 에 저장되어있다. 여기서 [숫자]는 부팅의 런레벨을 말한다. 런레벨이랑 리눅스 부팅의 종류를 말한다. 이렇게 간단히 UI가 뜨는 방식의 부팅이 있지만 싱글모드, 콘솔모드, 무한 재부팅모드 등 여러 모드가 존재한다. 우분투는 기본적으로 runlevel 2 로 부팅된다. runlevel 명령어로 현재의 위치를 확인 할 수 있고 /etc/init/rc-sysinit.conf를 통해 기본 runlevel을 바꿀 수 있다.



/etc/rc[숫자].d 폴더 내에는 부팅 runlevel에 해당하는 자동 실행 프로세스들을 갖고 있다. 폴더 내에 있는 파일들은 링크(바로가기)의 형태로 존재한다. 


(실제 바이너리는 /init.d/ 내에 모두 존재하는 것을 확인 할 수 있다)


프로세스 생성 작업들은 모두 일련화(Sequalization), 하나하나씩 차례대로 일어난다. "하나만 잘하자!"는 리눅스의 철학을 반영한 예라고 어떤 개발자는 그런다.


그런데 이것을 뒤집은 새로운 방식의 부팅 프로세스가 systemd이다.


init프로세스가 모든 작업을 차례차례 진행했다면, systemd는 프로세스 생성과정에서 병렬화 기능을 제공해(aggressive parallelization capabilites) init 프로세스보다 빠르게 부팅이 가능하도록 한다. 더 많은 feature들이 있는 것 같은데 아직 전반적인 지식이 부족해서 이해하지는 못하고 있다..


아직 모든 리눅스 OS에 적용된것은 아니고, Fedora, CentOS7 에만 적용되었다. Debian에서는 아직 정식으로 적용되진 않았다.