systemd 란
systemd(system daemon)은 Unix 시스템 부팅 후 가장 먼저 생성된 후 다른 프로세스를 실행하는 init 역할을 하는 데몬이다. RedHat 에서 개발을 시작했고 RHEL/CentOS 와 Ubuntu 나 Arch 등 대부분의 리눅스 시스템에 공식적으로 채택되어 사용중이다.
systemd 는 PID 1번을 갖으며 부팅부터 서비스관리, 로그관리 등을 담당한다. 부팅 시 병렬로 실행되기 때문에 부팅속도 역시 빠르다.
부팅 시 필요한 작업을 systemd unit 으로 등록하여 사용할 수 있으며, 해당 파일들은 /etc/systemd/system 에 위치한다.
Good to know
servicevssystemctl차이systemctl이 정식(현대) 명령어이고, service는 과거(init.d)와의 호환을 위한 래퍼(wrapper)이다. systemd 환경에서
service nginx start는 사실systemctl start nginx.service을 호출한다.service는 enable 을 지원하지 않는다.systemctl이 표준이다.init.d 와 upstart
init.d → upstart → systemd 리눅스 init 시스템의 진화 과정이다. init.d는 SysV init 기반의 스크립트형 init 시스템이고, upstart는 이벤트 기반으로 이를 개선한 과도기적 init 시스템이며, 현재 리눅스의 표준 init 시스템은 systemd이다.
Unit과 구성 요소
systemd Unit 파일 구조
[Unit]
Description=Systemd Test
[Service]
ExecStart=/usr/local/bin/example.sh
[Install]
WantedBy=multi-user.targetsystemd 파일의 섹션
- Unit
- Description: 서비스 설명
- Service
- ExecStart: 서비스를 시작하기 위한 실행파일
- Timer
- Install
- …
Unit 타입
- service: 데몬/서비스 관리 (.service)
- socket: 소켓 활성화 (.socket)
- timer: 작업 스케줄 (.timer)
- target: 부트 목표/런레벨 유사 개념 (.target)
- path: 파일/디렉터리 변경 감시 후 트리거 (.path)
- mount/automount: 마운트 관리 (.mount, .automount)
- device: udev 디바이스 이벤트 (.device)
- swap: 스왑 관리 (.swap)
- slice/scope: cgroups로 리소스 그룹화 (.slice, .scope)
서비스 관리
Service 주요 옵션
- Type: simple | forking | oneshot | notify | dbus | idle
- simple(기본): ExecStart 실행 후 곧바로 활성화로 간주
- forking: 백그라운드로 포크하는 데몬에 사용 (PIDFile 권장)
- oneshot: 단발성 작업(설정 스크립트) — RemainAfterExit=true와 함께 사용
- notify: systemd-notify로 준비 완료 신호를 보냄
- ExecStart, ExecStartPre, ExecStartPost, ExecReload, ExecStop
- Restart: no | on-success | on-failure | on-abnormal | always 등
- RestartSec: 재시작 지연
- User/Group: 실행 계정 지정, WorkingDirectory
- Environment/EnvironmentFile: 환경변수
- LimitNOFILE, Nice, IOSchedulingClass 등 리소스 제한
의존성과 설치(Install)
- [Unit]
- Requires=, Wants=: 강/약 의존
- After=, Before=: 실행 순서
- [Install]
- WantedBy=multi-user.target 등: enable 시 심볼릭 링크가 생성되는 대상
- enable/disable는 부팅 시 자동 시작 여부만 제어, start/stop은 즉시 실행 제어
부팅과 Target
Target (런레벨 매핑)
- graphical.target ≈ runlevel5, multi-user.target ≈ runlevel3, rescue.target ≈ runlevel1
- 기본 타깃 확인/설정:
systemctl get-default,systemctl set-default multi-user.target
운영 명령어
자주 쓰는 systemctl
- 상태/제어
systemctl status <unit>systemctl start|stop|restart <unit>systemctl enable|disable <unit>systemctl daemon-reload(유닛 파일 수정 후)
- 나열/검색
systemctl list-units --type=servicesystemctl list-unit-files --type=service
journalctl (로그)
journalctl -u <service>: 서비스 로그journalctl -u <service> -f: 실시간 팔로우journalctl -b: 현재 부팅 사이클 로그-p info|warning|err,--since "2025-09-17 09:00"
스케줄링과 활성화
Timer vs cron
- .timer 유닛으로 스케줄 정의, .service 실행을 트리거
- 모드: OnCalendar= (캘린더), OnBootSec=/OnUnitActiveSec= (상대시간)
- 장점: 유닛 의존성, 로깅(journal), 실패 시 Restart 정책과 통합
예시 (.timer):
[Unit]
Description=DB 백업 타이머
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target예시 (.service):
[Unit]
Description=DB 백업 실행
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh소켓/패스 활성화
- socket: 포트/소켓 접근이 있을 때 관련 .service를 지연 기동
- path: 파일 생성/변경 시 .service 트리거 (PathChanged=, PathExists= 등)
리소스 제어
cgroups와 리소스 제어
- systemd는 cgroups을 통해 각 유닛 리소스를 추적/제한
- CPUAccounting=, MemoryMax=, IPAddressDeny=/Allow= 등으로 제어 가능 (버전 의존)
트러블슈팅
- 유닛 파일 변경 후
systemctl daemon-reload - 권한/경로 확인: ExecStart 경로, 실행권한, WorkingDirectory
- 환경 변수: EnvironmentFile 경로/권한
- SELinux/AppArmor 정책으로 인한 거부 여부 확인
- 부팅 시 실패:
systemctl --failed,journalctl -b -p err