systemd란
systemd는 Linux의 시스템 시작(initialize), 데몬 프로그램, 프로세스, 파드 등을 관리하는 소프트웨어의 모음이다. `sytemctl` 명령어가 바로 이 systemd의 인터페이스이다.
unit이란
unit은 sytemd가 작동하고 관리하는 방법을 알고 있는 모든 종류의 리소스를 말한다. unit의 종류에는 데몬에 사용되는 서비스유닛, tcp ports에 사용되는 소켓유닛, 파일과 디렉토리에 사용되는 path유닛, 여러 유닛의 그룹에 해당하는 타겟유닛도 있다. 모든 유닛은 각 유닛의 설정을 담고 있는 유닛파일을 가진다.
systemctl로 유닛 파일 리스트 조회
`systemctl list-unit-files`명령어를 통해 유닛 파일들을 리스트업 할 수 있다. 이때 유닛 파일들의 확장자를 통해 유닛의 타입을 확인할 수 있다. `.mount`, `.service`, `.socket`, `.path`는 각각의 파일이 해당 타입의 유닛에 대한 설정파일임을 표현한다.
[root@localhost student]# systemctl list-unit-files
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
-.mount generated
boot.mount generated
dev-hugepages.mount static
dev-mqueue.mount static
home.mount generated
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
run-vmblock\x2dfuse.mount enabled
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount disabled
var-lib-machines.mount static
var-lib-nfs-rpc_pipefs.mount static
cups.path enabled
ostree-finalize-staged.path disabled
systemd-ask-password-console.path static
systemd-ask-password-plymouth.path static
systemd-ask-password-wall.path static
session-2.scope transient
accounts-daemon.service enabled
lines 1-23
systemctl로 특정 타입 유닛 파일 조회
특정 유닛 타입에 대한 파일만 출력하고 싶다면 다음과 같이 명령어를 수행하면 된다. `systemctl list-units --type <유닛 타입>` 다음은 서비스 타입 유닛을 출력해본 결과이다.
[root@localhost student]# systemctl list-units --type service
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
(...생략...)
sssd-kcm.service loaded active running SSSD Kerberos Cache Manag...
systemd-journal-flush.service loaded active exited Flush Journal to Persiste...
lines 1-23
systemctl로 서비스 상태 확인
서비스의 상태를 확인해보기 위해서는 `systemctl status sshd`를 수행하면 된다. 예를 들어 sshd라는 서비스의 상태를 확인해보기 위해서는 `systemctl status sshd`를 수행하면 된다.
[root@localhost student]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset...
Active: active (running) since Tue 2024-11-19 16:50:59 KST; 5 days ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1101 (sshd)
Tasks: 1 (limit: 10796)
Memory: 1.1M
CGroup: /system.slice/sshd.service
└─1101 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-p...
Nov 19 16:50:59 localhost.localdomain systemd[1]: Starting OpenSSH server daemo...
Nov 19 16:50:59 localhost.localdomain sshd[1101]: Server listening on 0.0.0.0 p...
Nov 19 16:50:59 localhost.localdomain sshd[1101]: Server listening on :: port 2...
Nov 19 16:50:59 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
출력 결과를 보면 sshd의 unit 파일의 경로는 `/usr/lib/systemd/system/sshd.service`이며, 현재 로드 되어있음을 알 수 있다. 시스템이 부팅될 때마다 이 unit 파일이 초기화(initialize)되고, 서비스가 시작된다. 그 외에도 `Active` 항목에서 2024-11-19 부터 쭉 실행중임을, `Main PID`에서는 메인 프로세스 아이디를, 마지막으로 서비스의 로그들도 확인할 수 있다.
systemctl으로 서비스 재시작
`systemctl restart <서비스명>` 명령어로 해당 서비스를 재시작할 수 있다. 이 명령어를 수행하면 서비스가 중단되었다가 재시작 된다. 이 경우에는 새로운 프로세스 ID를 얻게 된다. PID가 위 `1101`에서 아래 `9489`로 바뀐 것을 알 수 있다.
[root@localhost student]# systemctl restart sshd
[root@localhost student]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset>
Active: active (running) since Mon 2024-11-25 21:34:45 KST; 2s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 9489 (sshd)
(...생략...)
systemctl로 서비스 reload
`systemctl reload <서비스명>`을 통해 서비스를 reload할 수 있고, reload 시에는 프로세스 ID가 바뀌지 않는다(`9489`에서 변하지 않음). 서비스가 시작할 때의 설정을 메모리에 로드하게 되는데, 설정 파일을 변경하고 이를 적용하기 위해서는 메모리에 새로운 설정 파일을 로드해야 한다. 이때 사용할 수 있는 명령어가 바로 reload이다.
[root@localhost student]# systemctl reload sshd
[root@localhost student]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset>
Active: active (running) since Mon 2024-11-25 21:34:45 KST; 29min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 9787 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCE>
Main PID: 9489 (sshd)
(...생략...)
systemctl로 서비스 시작하기
`systemctl start <서비스명>` 명령어로 시스템을 시작할 수 있으며, persistent하게 서비스가 작동하길 원하는 경우에는 `systemctl enable <서비스명>`을 수행하면 된다. 이는 시스템이 부팅될 때 해당 서비스도 항상 같이 시작되게 만든다.
본 포스트 시리즈는 「 RH024 Red Hat Enterprise Linux Technical Overview 」 강좌를 요약한 내용입니다.