Linux systemd 가이드: 시스템 관리의 핵심

Linux systemd 가이드: 시스템 관리의 핵심

January 13, 2018·kangwoo
kangwoo

Linux systemd 완벽 가이드: 시스템 관리의 핵심

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=10s

2. 서비스 의존성 설정

서비스가 다른 서비스 이후에 시작되도록 설정할 수 있습니다:

[Unit]
After=network.target mysql.service
Requires=mysql.service

3. 환경 변수 설정

서비스에 환경 변수를 설정할 수 있습니다:

[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: 사용자 세션 관리

참고 자료

Last updated on