Linux systemd 가이드: 시스템 관리의 핵심
Linux systemd 완벽 가이드: 시스템 관리의 핵심
최신 리눅스 시스템에서 가장 중요한 구성 요소 중 하나인 systemd는 시스템 및 서비스 관리자로, 초기화 시스템과 중앙 관리 기능을 제공합니다. 이 글에서는 systemd의 주요 명령어와 사용법을 자세히 알아보겠습니다.
systemd란 무엇인가?
systemd는 리눅스 시스템의 초기화 프로세스(PID 1)로서, 시스템 시작 시 다양한 서비스와 데몬을 병렬로 실행하고 관리합니다. 전통적인 SysV init 시스템을 대체하여 현대 리눅스 배포판의 표준이 되었습니다.
systemd는 다음과 같은 주요 기능을 제공합니다:
- 서비스 병렬 시작을 통한 부팅 시간 단축
- 서비스 자동 재시작
- 서비스 종속성 관리
- 소켓 기반 활성화
- 타이머 기반 활성화
- cgroup을 통한 자원 제어
주요 명령어
systemd 환경에서 시스템을 관리하기 위한 주요 명령어들은 다음과 같습니다:
- systemctl: 서비스 관리를 위한 주요 명령어
- systemd-analyze: 부팅 성능 분석
- systemd-cgls: cgroup 계층 구조 표시
- systemd-cgtop: cgroup 자원 사용량 모니터링
- systemd-loginctl: 사용자 세션 및 시트(seat) 관리
이제 각 명령어에 대해 자세히 살펴보겠습니다.
systemctl
systemctl은 systemd의 핵심 명령어로, 서비스 시작/중지/재시작, 상태 확인, 활성화/비활성화 등 다양한 관리 기능을 제공합니다.
기본 명령어 사용법
전체 서비스 목록 조회
인자 없이 systemctl을 실행하면 시스템의 모든 유닛(unit)과 그 상태를 보여줍니다:
$ systemctl
...
ipmi.service loaded active exited IPMI Driver
ipmievd.service loaded failed failed Ipmievd Daemon
irqbalance.service loaded active running irqbalance daemon
kubelet.service loaded active running kubelet: The Kubernetes Node Agent
lvm2-lvmetad.service loaded active running LVM2 metadata daemon
network.service loaded failed failed LSB: Bring up/down networking
nscd.service loaded active running Name Service Cache Daemon
ntpdate.service loaded active exited Set time via NTP
...출력에서 각 서비스의 로드 상태, 활성 상태, 실행 상태와 설명을 확인할 수 있습니다.
서비스 설정 변경 적용
서비스 설정 파일을 변경한 후에는 systemd에게 설정을 다시 로드하도록 알려야 합니다:
$ systemctl daemon-reload이 명령어는 서비스 설정을 변경한 후 반드시 실행해야 변경 사항이 적용됩니다.
서비스 활성화/비활성화
부팅 시 서비스가 자동으로 시작되도록 설정하려면:
$ systemctl enable [서비스명]부팅 시 서비스가 자동으로 시작되지 않도록 설정하려면:
$ systemctl disable [서비스명]서비스의 활성화 상태를 확인하려면:
$ systemctl is-enabled [서비스명]
enabled서비스 시작/중지/재시작
서비스를 시작하려면:
$ systemctl start [서비스명]서비스를 중지하려면:
$ systemctl stop [서비스명]서비스를 재시작하려면:
$ systemctl restart [서비스명]설정만 다시 로드하려면(가능한 경우):
$ systemctl reload [서비스명]서비스 상태 확인
서비스가 현재 실행 중인지 확인하려면:
$ systemctl is-active [서비스명]
active서비스의 상세 상태를 확인하려면:
$ systemctl status -l [서비스명]
kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Wed 2018-12-26 14:14:53 JST; 5 months 21 days ago
Docs: https://kubernetes.io/docs/
Main PID: 77429 (kubelet)
Tasks: 24
Memory: 68.2M
CGroup: /system.slice/kubelet.service
└─77429 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni상태 출력에서는 서비스의 로드 상태, 활성 상태, 주 PID, 사용 중인 리소스, 프로세스 트리 등의 정보를 확인할 수 있습니다.
모든 유닛 파일 목록 조회
시스템에 설치된 모든 유닛 파일과 그 활성화 상태를 조회하려면:
$ systemctl list-unit-files
...
initrd-udevadm-cleanup-db.service static
ip6tables.service disabled
ipmi.service enabled
ipmievd.service enabled
iptables.service enabled
irqbalance.service enabled
kdump.service masked
kubelet.service enabled
libstoragemgmt.service masked
...유닛 파일의 활성화 상태는 다음과 같은 값을 가질 수 있습니다:
- enabled: 부팅 시 자동 시작됨
- disabled: 부팅 시 자동 시작되지 않음
- static: 직접 활성화할 수 없고, 다른 유닛에 의해서만 시작됨
- masked: 완전히 비활성화되어 시작할 수 없음
실패한 서비스 확인
현재 실패 상태인 서비스 목록을 확인하려면:
$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
ipmievd.service loaded failed failed Ipmievd Daemon
network.service loaded failed failed LSB: Bring up/down networking
systemd-tmpfiles-clean.service loaded failed failed Cleanup of Temporary Directories
systemd-tmpfiles-setup.service loaded failed failed Create Volatile Files and Directories
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
4 loaded units listed.이 명령어는 시스템 문제를 진단할 때 매우 유용합니다.
systemd-analyze
systemd-analyze 명령어는 시스템 부팅 성능을 분석하는 데 사용됩니다.
기본 부팅 시간 분석
$ systemd-analyze
Startup finished in 862ms (kernel) + 868ms (initrd) + 1min 4.908s (userspace) = 1min 6.639s이 출력은 커널 로드, 초기 RAM 디스크(initrd), 사용자 공간 서비스 시작에 걸린 시간을 보여줍니다.
서비스별 부팅 시간 분석
각 서비스가 부팅 시 얼마나 많은 시간을 소요했는지 확인하려면:
$ systemd-analyze blame
50.457s unbound-anchor.service
30.003s iaas-pm-bootup.service
7.705s cloud-final.service
7.102s cloud-init.service
3.270s ntpdate.service
2.743s network.service
1.252s docker.service
640ms cloud-init-local.service
369ms cloud-config.service
345ms lvm2-monitor.service
...이 명령어는 부팅을 지연시키는 서비스를 식별하는 데 매우 유용합니다.
주요 부팅 체인 분석
부팅 과정에서 가장 긴 시간이 걸린 서비스 체인을 확인하려면:
$ systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.
multi-user.target @34.062s
└─iaas-pm-bootup.service @4.056s +30.003s
└─basic.target @623ms
└─sockets.target @623ms
└─dbus.socket @623ms
└─sysinit.target @622ms
└─systemd-update-utmp.service @617ms +5ms
└─systemd-remount-fs.service @183ms +13ms
└─systemd-fsck-root.service @584542y 2w 2d 20h 1min 49.069s +11ms
└─systemd-journald.socket
└─-.slice이 출력은 부팅 과정에서의 서비스 의존성 체인과 각 단계별 소요 시간을 보여줍니다.
systemd-cgls
systemd-cgls 명령어는 시스템의 cgroup 계층 구조를 트리 형태로 보여줍니다. cgroup(Control Group)은 프로세스 그룹의 자원 사용을 제한하고 모니터링하는 리눅스 커널 기능입니다.
$ systemd-cgls
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─kubepods
│ └─burstable
│ ├─podfc4890ab91dfb8b8a630043af37f52d8
│ │ ├─dc2312d450abd72c1490775e615fbf41abbef49bb4ccdc6a9d9d8bb7ec880724
│ │ │ └─40435 kube-apiserver --apiserver-count=5 --authorization-mode=Node,RBAC --advertise-address=10.xx.xx.xx --allow-privileged=true --client-ca-file=/etc/kubernetes/pki/ca.crt --disable-admission-plugins=Persiste
│ │ └─5b42977c143110757f6d7ae747fbe435f878f8427d30274936eb06bb5dc21b2c
│ │ └─40405 /pause
│ ├─pod734afb7f-08db-11e9-aa26-fa1648a9a65b
│ │ ├─a76db3d9d75d1a48f3231c75b601fd6c7ad1b33ff83e054482b800b2cf6ca049
│ │ │ └─104263 /bin/node_exporter --path.procfs=/host/proc --path.sysfs=/host/sys
...이 명령어는 특히 컨테이너 환경에서 프로세스 계층 구조를 이해하는 데 유용합니다. 위 예시에서는 Kubernetes 클러스터의 파드와 컨테이너가 cgroup 계층 구조로 어떻게 관리되는지 보여줍니다.
systemd-cgtop
systemd-cgtop 명령어는 cgroup의 리소스 사용을 실시간으로 모니터링합니다. top 명령어와 유사하게 CPU, 메모리, 입출력 사용량을 표시합니다.
$ systemd-cgtop
Path Tasks %CPU Memory Input/s Output/s
/ 88 20.9 3.2G - -
/system.slice - 13.7 1.0G - -
/system.slice/kubelet.service 1 13.1 68.8M - -
/kubepods - 2.6 556.8M - -
/kubepods/burstable - 2.6 554.9M - -
/user.slice 3 2.2 1.0G - -
/kubepods/burstable/podfc4890ab91dfb8b8a630043af37f52d8 - 1.7 462.5M - -
/kubepods/burstable/pod705e7ce1217a37349a5567101e60165d - 0.6 19.9M - -
/system.slice/docker.service 14 0.4 376.4M - -
...이 명령어는 시스템 자원 사용을 모니터링하고, 특히 컨테이너나 서비스가 과도한 자원을 사용하고 있는지 식별하는 데 유용합니다.
systemd-loginctl
loginctl 명령어는 사용자 세션과 시트(seat)를 관리합니다. 이 명령어를 사용하여 로그인한 사용자의 세션을 확인하고 관리할 수 있습니다.
$ loginctl list-sessions
SESSION UID USER SEAT
42 1000 myuser seat0
1 sessions listed.$ loginctl list-users
UID USER
1000 myuser
1 users listed.$ loginctl show-session 42
Id=42
User=1000
Name=myuser
Timestamp=Thu 2023-01-01 12:34:56 KST
TimestampMonotonic=12345678
VTNr=1
Seat=seat0
...이 명령어는 다중 사용자 환경이나 그래픽 세션을 관리할 때 특히 유용합니다.
systemd 유닛 파일
systemd는 다양한 유형의 유닛(unit)을 관리합니다. 가장 일반적인 유닛 타입은 다음과 같습니다:
- .service: 시스템 서비스
- .socket: IPC 또는 네트워크 소켓
- .device: 하드웨어 장치
- .mount: 파일 시스템 마운트 지점
- .automount: 자동 마운트 지점
- .target: 동기화 지점(여러 유닛을 그룹화)
- .timer: 예약 작업을 위한 타이머
서비스 유닛 파일 예시
간단한 서비스 유닛 파일의 예시입니다:
[Unit]
Description=My Custom Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/my-service
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target이러한 유닛 파일은 일반적으로 /etc/systemd/system/ 디렉토리에 저장됩니다.
실용적인 systemd 사용 팁
1. 서비스 자동 재시작 설정
중요한 서비스가 실패했을 때 자동으로 재시작되도록 설정할 수 있습니다:
[Service]
Restart=always
RestartSec=10s2. 서비스 의존성 설정
서비스가 다른 서비스 이후에 시작되도록 설정할 수 있습니다:
[Unit]
After=network.target mysql.service
Requires=mysql.service3. 환경 변수 설정
서비스에 환경 변수를 설정할 수 있습니다:
[Service]
Environment="DATABASE_URL=mysql://user:password@localhost/db"
Environment="DEBUG=true"4. 자원 제한 설정
서비스의 자원 사용을 제한할 수 있습니다:
[Service]
CPUQuota=50%
MemoryLimit=1G요약
systemd는 현대 리눅스 시스템의 핵심 구성 요소로, 시스템 초기화와 서비스 관리를 담당합니다. 이 글에서 소개한 명령어들을 활용하면 시스템을 효율적으로 관리하고 모니터링할 수 있습니다:
- systemctl: 서비스 관리와 상태 확인
- systemd-analyze: 부팅 성능 분석
- systemd-cgls: cgroup 계층 구조 확인
- systemd-cgtop: 자원 사용량 모니터링
- systemd-loginctl: 사용자 세션 관리