OS/LINUX

리눅스 Systemd에 대해

KayEsQuo 2025. 8. 4. 08:15

1. Systemd란

Systemd는 리눅스 시스템에서 부팅과 서비스 관리 등을 담당하는 init 시스템임. PID 1번을 차지하고 부팅 시 가장 먼저 실행되는 프로세스임.

  • 기존 SysVinit을 대체함
  • 서비스, 초기화 스크립트, 로깅(journald), 소켓, 타이머 등 통합 관리함
  • 하나의 도구로 시스템 전체 상태를 제어할 수 있음

기존 init 시스템은 순차 실행이라 느렸지만, systemd는 병렬로 서비스 실행 가능해서 부팅 속도 빠름.

 

2. Systemd 특징

  • 시스템 스냅샷 지원: 현재 상태 저장 후 복원 가능
  • CGroup 관리: 서비스별 리소스(CPU, 메모리 등) 제어 가능
  • 빠른 셧다운: 실행 중인 서비스만 정리해서 시스템 종료 빨라짐
  • 서비스 타임아웃: 정해진 시간 안에 시작 안 하면 실패로 처리함
  • 소켓 기반 활성화: 네트워크 요청이 들어올 때 서비스 시작
  • 버스 기반 활성화: D-Bus 메시지 수신 시 서비스 시작
  • 장치 기반 활성화: USB 등 장치 연결 시 자동 실행
  • 경로 기반 활성화: 특정 파일/디렉토리 변경 시 서비스 시작
  • 마운트 관리: 마운트 포인트도 유닛으로 관리 가능

다양한 조건에 따라 서비스를 자동으로 실행할 수 있어서 시스템 자원 효율적으로 사용 가능함.

 

3. System 유닛

Systemd는 유닛(Unit)이라는 단위로 서비스, 소켓, 타이머 등을 관리함. 유닛은 설정 파일이고 다음 경로들에 존재함:

  • /etc/systemd/system : 사용자가 만든 유닛. 우선순위 가장 높음
  • /run/systemd/system : 시스템 부팅 중 생성되는 임시 유닛
  • /usr/lib/systemd/system : 배포판에서 제공하는 기본 유닛

 

System 유닛 파일 예시

 

이 구성은 네트워크가 준비된 이후 실행되며, Redis 서비스도 함께 실행되기를 기대함. 실패 시 자동 재시작하고, 관련된 타이머 유닛도 함께 enable 가능함.

[Unit]
Description=My Web App Service
Documentation=https://mydocs.example.com/service
Requires=network.target
After=network.target
Wants=redis.service
Conflicts=old-web.service

[Service]
Type=simple
ExecStart=/usr/bin/my-web-app
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/usr/bin/killall my-web-app
Restart=on-failure
RemainAfterExit=no

[Install]
WantedBy=multi-user.target
Alias=web.service
Also=my-web-app.timer

 

Unit 섹션 속성 정리

항목 설명 예시
Description 유닛에 대한 설명 Description=My Web Service
Documentation 관련 문서 링크 Documentation=https://example.com/docs
Requires 반드시 필요한 다른 유닛. 없거나 실패하면 이 유닛도 중단됨 Requires=network.target
After 해당 유닛이 실행될 순서를 지정. 명시된 유닛이 먼저 실행됨 After=network.target
Before 이 유닛이 지정된 유닛보다 먼저 실행되어야 함 Before=apache2.service
Wants 함께 실행되길 바라는 유닛. 실패해도 영향 없음 Wants=redis.service
Conflicts 동시에 실행되면 안 되는 유닛 Conflicts=old-web.service

Service 섹션 속성 정리

항목 설명 예시
Type 서비스의 시작 유형. 기본값은 simple Type=simple
ExecStart 서비스를 시작할 명령 ExecStart=/usr/bin/my-service
ExecStop 서비스 중지 시 실행할 명령 ExecStop=/usr/bin/stop-service
ExecReload 서비스 재시작(reload) 시 실행할 명령 ExecReload=/bin/kill -HUP $MAINPID
Restart 서비스 실패 시 재시작 정책 Restart=on-failure
RemainAfterExit 프로세스가 종료된 후에도 활성 상태로 유지할지 여부 RemainAfterExit=no

Install 섹션 속성 정리

항목 설명 예시
WantedBy enable 시 이 타겟에 포함됨. 일반적으로 multi-user.target WantedBy=multi-user.target
RequiredBy 필수적으로 포함될 타겟 지정. 실패 시 타겟도 실패 RequiredBy=network-online.target
Alias 유닛의 별칭 설정. 여러 이름으로 접근 가능 Alias=myservice-alias.service
Also 이 유닛과 함께 enable/disable 할 다른 유닛들 Also=my-helper.timer
DefaultInstance 템플릿 유닛 사용 시 기본 인스턴스 이름 지정 DefaultInstance=web@1.service

 

 

4. systemd 유닛의 종류

systemd는 다양한 유형의 유닛을 통해 시스템 자원을 통합적으로 관리함. 각 유닛은 고유한 확장자를 가지며 아래와 같이 확인 가능함.

  • 서비스 유닛 (.service) → 데몬, 백그라운드 프로세스 실행을 정의함
    $ systemctl status sshd.service
    ● sshd.service - OpenSSH server daemon
       Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
       Active: active (running) since Mon 2025-08-01 10:21:37 KST; 1h 20min ago
        
  • 소켓 유닛 (.socket) → 서비스가 요청을 받을 때 자동 실행되도록 설정
    $ systemctl status sshd.socket
    ● sshd.socket - OpenSSH Server Socket
       Loaded: loaded (/usr/lib/systemd/system/sshd.socket; enabled)
       Active: inactive (dead)
        
  • 타이머 유닛 (.timer) → 특정 시간에 서비스가 실행되도록 설정 (cron 대체 가능)
    $ systemctl list-timers --all
    NEXT                         LEFT         LAST                         PASSED       UNIT                ACTIVATES
    Mon 2025-08-04 00:00:00 KST  5h 39min     Sun 2025-08-03 00:00:01 KST  18h ago      logrotate.timer     logrotate.service
        
  • 경로 유닛 (.path) → 특정 파일 또는 디렉터리의 변경을 감지해 서비스 실행
    $ systemctl status mybackup.path
    ● mybackup.path - Monitor /data/backup for changes
       Loaded: loaded (/etc/systemd/system/mybackup.path; enabled)
       Active: active (waiting) since ...
    Trigger: OnPathChanged=/data/backup
        
  • 마운트 유닛 (.mount) → 파일 시스템 마운트를 systemd에서 직접 관리
    $ systemctl status var-log.mount
    ● var-log.mount - /var/log mount
       Loaded: loaded (/etc/systemd/system/var-log.mount)
       Active: active (mounted) since ...
    Where: /var/log
    What: /dev/sdb1
        
  • 스왑 유닛 (.swap) → 스왑 파티션이나 스왑 파일을 systemd로 관리
    $ systemctl status swapfile.swap
    ● swapfile.swap - /swapfile
       Loaded: loaded (/etc/systemd/system/swapfile.swap)
       Active: active (swap) since ...
        
  • 장치 유닛 (.device) → 장치 상태(Udev 이벤트)에 따라 동작 설정
    $ systemctl status dev-sda1.device
    ● dev-sda1.device - /dev/sda1
       Loaded: loaded
       Active: active (plugged) since ...
        
  • 타겟 유닛 (.target) → 유닛들을 논리적으로 묶어서 제어. runlevel 대체
    $ systemctl isolate multi-user.target
    # GUI 종료되고 multi-user 모드(텍스트 모드) 진입
        
  • 슬라이스 유닛 (.slice) → CGroup 기반으로 리소스 할당 그룹을 정의
    $ systemctl status user.slice
    ● user.slice - User Slice
       Loaded: loaded (/usr/lib/systemd/system/user.slice)
       Active: active since ...
        
  • 범위 유닛 (.scope) → systemd 외부에서 시작된 프로세스를 추적
    $ systemctl status session-2.scope
    ● session-2.scope - Session 2 of user root
       Loaded: loaded
       Active: active (running)