systemd란?
init의 세대교체
- 리눅스를 부팅하면 커널이 가장 먼저 실행시키는 프로세스
- 기존의 리눅스는 가장 먼저 init 프로세스를 실행하고 init 프로세스가 필요한 다른 프로세스를 실행
- 기존의 init 프로세스는 단계적으로 런 레벨을 올려가며 해당 런 레벨의 rc 스크립트를 차례대로 실행
- 하지만 init은 아주 오래전 리눅스에서부터 사용하던 아주 오래된 프로세스였고 이에 계속해서 기능이 추가되면서 프로그램들이 복잡해지다 보니 효율 또한 떨어지게 되었다.
- 이에 systemd는 init의 단점을 보안하며 기존 리눅스의 의존성을 해치지 않도록 개발되었다.
- systemd는 가능한 한 병렬로 시작 프로그램을 실행시키는 것으로 부팅 속도를 끌어올리고, 프로그램 실행을 위한 파일로는 쉘 스크립트가 아니라 service라는 systemd만의 unit을 통해 체계적이면서 가동성이 좋도록 개발되었다.
- systemd는 단지 init 뿐만 아니라 다른 프로그램들의 기능마저 대체
- 네임서버 주소를 설정하는 resolv.conf의 자리를 systemd-resolved가 대체, DHCP 서버에서 IP를 받아와서 네트워크 인터페이스에 설정하는 dhcpcd의 자리를 systemd-networkd가 대체
- systemd는 전통적으로 Unix계열 운영체제의 PID 1이었던 init(System V Init)을 교체하는 역할뿐만 아니라 초기화 스크립트 관리자이고 로그시스템 관리자이기도 하다.
- 또한 하드웨어에 대한 부분과 cgroup 관리 등 시스템 전반적인 부분에 관여하고 있다.
- systemd는 유닛단위로 시스템을 관리한
- 관련 파일
- /etc/systemd 내의 설정 파일
- 서비스 또는 타깃 파일에 의해서 관리되는 파일
- /usr/lib/systemd/system 내의 유닛 파일
- systemd로 관리되는 다양한 유닛의 실행 및 종료를 위한 파일
파일의 내용은 [Unit], [Service], [Install] 세 부분으로 나눠짐
ex)
[Unit]
Description=NETCAT Server
[Service]
ExecStart=/usr/local/bin/nc -l -p 9999
[Install]
WantedBy=multi-user.target
systemd 유닛
유닛의 종류
- systemd는 전체 시스템을 시작하고 관리하는 데 유닛(units)이라 부르는 구성 요소를 사용
- systemd는 관리 대상의 이름을 ‘서비스 이름. 유닛 종류’의 형태로 관리
- 유닛은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름을 사용
유닛 |
기능 |
예 |
엔지니어 |
service |
데몬의 시작, 종료, 재시작 담당 |
atd.service |
클라우드 엔지니어 |
socket |
소켓을 관리하는 유닛 |
dbus.socket |
시스템 엔지니어 |
device |
리눅스의 여러 장치들을 관리 |
dev-sda.device |
mount |
마운트 포인트 관리 |
boot.mount |
automount |
자동 마운트 포인트 관리 |
proc-sys-fs-binfmt_misc.automount |
systemd 관련 명령어
systemctl 명령어
- systemctl [옵션] [명령] [유닛 이름]
- 옵션
- -a : 상태와 관계없이 유닛 전체를 출력한다.
- -t [유닛의 종류] : 지정한 종류의 유닛만 출력한다.
- 명령
- start : 유닛을 시작한다.
- stop : 유닛을 정지한다.
- reload : 유닛의 설정 파일을 다시 읽어온다.
- restart : 유닛을 재시작한다.
- status : 유닛이 현재 상태를 확인한다.
- enable : 부팅 시 유닛이 자동으로 시작되도록 설정한다.
- disable : 부팅 시 유닛이 자동으로 시작되지 않도록 설정한다.
- 부팅했을 때 실행되는 프로그램 목록
- systemctl list-unit-files | grep enabled