그냥 사는 이야기

Linux의 init process 그리고 systemd 본문

Development/System

Linux의 init process 그리고 systemd

없다캐라 2020. 4. 28. 18:58
반응형

Init 프로세스

부팅이 시작되면 OS에서는 부트로더의 실행부터 커널 이미지 로딩등 커널단에서 부터 필요한 동작이 순차적으로 진행되며 유저 영역에서는 Init 프로세스가 최초로 시작됩니다. 따라서 PID 1번으로 시작하며 모든 프로세스의 부모프로세스로서 위치합니다.

리눅스의 부팅과정 및 init process

init.d란?

init.d는 위의 init 프로세스가 실행되기 위한 스크립트 파일들이 나뉘어서 보관한 곳입니다.

리눅스에서는 .d로 끝나는 디렉토리는 파일명 순서대로 읽는다는 관례가 있어서 시작 스크립트는 S숫자 로 시작하고, 종료 스크립트는 K숫자로 시작했습니다. 그래서 프로그램 하나를 설치하면 기동, 종료스크립트가 init.d 디렉토리에 설치되었습니다.

유닉스 계열에서 참조하여 리눅스에서 한동안 사용되던 init이 시대가 변하여 systemd로 대체되었습니다.

Systemd

systemd는 리눅스 시스템의 모든 정보를 동일한 인터페이스로 모아서 관리해 줍니다. 마치 윈도우의 제어판 + 서비스관리자 + msi 등등을 모아놓은 종합선물세트 같은 존재입니다. 예전 init 시스템에서는 파일 이름만 맞춰서 init.d 에 던져놓으면 내가 책임지고 런레벨에 따라서 Start/Stop을 했다면, Systemd라는 통합 시스템에서는 서비스라는 파트가 따로 있어서 거기에 Start/Stop 스크립트가 등록됩니다.

처음 systemd 가 들어왔을때 많은 보수적인 리눅스 관리자들의 반발이 심했다고 합니다.

왜 굳이 중앙통제를 해야하느냐 복잡하다 등등. 하지만 그것도 시대의 조류에 모두 밀려났습니다. 사실 init.d 랑 비교하면 systemd 가 복잡한건 맞으나 서비스 제어에 비교할수 없는 우위에 있습니다. 예를들어 어떤 서비스가 뜰때까지 기다려라 하는 의존성 확인부터 프로세스가 어느 네임스페이스에서 기동할지도 결정할 수 있습니다. 물론 init 에서 안되는건 아닙니다만, 본인이 그 모든 기능을 다 짜야하는데 사실상 불가능합니다. Systemd 문법에 맞게만 짜주면 알아서 해주니 비교할 게임이 아닙니다.

그리고 시스템 부팅동안의 과정들을 병렬화하여 동작시킵니다.

호환성을 위한 흔적들

아주 오래된 프로그램의 호환성을 위해 일부를 남겨놓아서 현재의 리눅스 시스템에도 흔적만 있습니다. 1번 프로세스가 init 인지 아닌지 등으로 컨테이너인지 아닌지 확인하는 것 같은 프로그램을 위해서 1번 프로세스는 init으로 남겨두었습니다. 실제로는 init.d 를 호출하는 systemd 인터페이스가 동작하는 것이지만요...
그래서 init 은 시스템 이름을 말하는 것이고 Init.d 는 그 시스템이 이용하는 스크립트를 정리해놓은 디렉토리입니다.

$ ls -atl `which init `
lrwxrwxrwx 1 root root 20  2월  6 23:45 /usr/sbin/init -> /lib/systemd/systemd

$ ls -alt /lib/systemd/systemd
-rwxr-xr-x 1 root root 1497296  2월  6 23:45 /lib/systemd/systemd

$ file /lib/systemd/systemd
/lib/systemd/systemd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=38ae9d0ec61c9afe19ea37a6aa8a1e8dba6278d6, for GNU/Linux 3.2.0, stripped

 

 

Comments