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)
'OS > LINUX' 카테고리의 다른 글
리눅스-RHEL OpenSSH 개념 & 원리 (2) | 2025.08.05 |
---|---|
RHEL-CentOS 리눅스 디스크 관리 – 디스크 연결 인터페이스 방식 (2) | 2025.08.04 |
RHEL-CentOS 리눅스 디스크 관리 – 기본 구조부터 이해하기 (1) | 2025.08.03 |
YUM(Yellowdog Updater Modified) 패키지 정보 확인 RHEL (2) | 2025.07.31 |
RPM(Redhat Package Manager)을 이용한 패키지 관리 RHEL (1) | 2025.07.31 |