systemd 은 뭐하는 아이 일까?
평소에 리눅스를 사용하면서 systemctl 나 reboot 를 사용하게 되는데
이걸 명령어로만 생각했지 어떻게 동작하는 지 어떤 원리로 존재하는 생각해본 적이 없다..
컴퓨터 처럼 버튼이 있는 것도 아니고.. 그렇다고 윈도우처럼 작업관리자가 있는 것도 아니고..

리눅스 전반의 서비스나 부팅을 관리하는 프로그램이 존재하는데 그게 systemd 이다.
윈도우의 작업관리자랑 유사하다고 보면 괜찮을 것 같다!

systemd 이란 ?
systemd는 System and Service Maager, 시스템의 부팅 및 서비스 관리하는 프로그램
systemd 관련 디렉터리
systemd 는 여러 디렉터리에 나뉘어 설치 되는데, 주요 디렉터리는 아래와 같다.
경로 | 설명 |
/etc/systemd/system | 유닛의 환경 설정 파일이 위치하는 디렉터리 |
/run/systemd/system | 런타임 유닛 파일이 위치하는 디렉터리 |
/usr/lib/systemd/system | 시스템에서 사용되는 service 및 target 유닛 파일이 위하는 디렉터리 |
systemd를 왜 사용할까?
- 병렬 처리를 통해 시스템 부팅 속도 증가
- 데몬의 On-demand 시작 제공
- 서비스의 의존성 자동 해결
- 서비스를 시작을 위해 소켓 및 D-BUS 사용
- Linux cgroups(control groups) 를 사용한 프로세스 추적
- 시스템 상태의 스냅샷(snapshot) 및 복원 기능 제공
- 마운트 및 자동 마운ㅌ 지점 유지
- 자체적인 로그 관리
- 시스템의 주요 설정인 날짜 및 시간, 호스트명 등을 변경하는 명령어들도 자체적으로 내장
그냥 깔끔하게 정리하자면
systemd 의 핵심 기능
- 서비스 관리
systemd는 시스템 부팅 시 시작되는 서비스와 종료되는 서비스의 시작, 중지, 재시작 등을 관리
각 서비스는 unit 파일로 정의되며, systemctl 명령어를 통해 제어
- 병렬화된 부팅
기존의 init 시스템은 직렬적으로 서비스를 시작했으나,
systemd는 의존 관계를 분석해 병렬로 여러 서비스를 동시에 시작하여 부팅 속도를 크게 향상
- 소켓 기반 활성화
systemd는 서비스가 필요할 때만 해당 서비스를 활성화
즉, 클라이언트가 소켓에 연결을 시도할 때 서비스가 시작, 리소스 사용을 효율적으로 관리 가능
- 로그 관리
journalctl을 통해 systemd는 자체적인 로그 시스템인 journald를 통해 시스템 및 서비스 로그를 관리
이는 일관된 형식으로 로그를 제공하며, 로그를 쉽게 검색하고 분석 가능
- 타이머 및 예약 작업
cron과 유사한 기능을 제공하는 systemd는 timer 유닛을 통해 작업을 예약 가능
특정 시간에 서비스를 실행하거나 작업을 자동화 할 수 있음
- 장치 관리
systemd는 udev와 통합되어 시스템의 장치를 자동으로 인식하고 적절한 처리를 수행
- 종속성 관리
서비스 간의 의존 관계를 효율적으로 처리하여 서비스가 올바른 순서로 시작되고,
서비스 장애 시 다른 서비스에 미치는 영향을 최소화
systemd 의 구조
1. 유닛(Unit)
systemd 는 유닛(unit)이라 부르는 대상(object) 으로 나뉘고 다양한 유형이 존재
유닛 관련 정보 확인하는 명령어
man systemd. unit
주요 유닛
서비스(Service)
시스템에서 제공하는 서비스, 즉 웹 서버이나 메일 서버 같은 데몬(daemin)
관련 파일명이 '.service' 로 끝나며, systemctl 이라는 하나의 명령으로 제어
서비스 관련 정보 확인하는 명령어
man systemd. service

상태값 | 설명 |
loaded | 프로세스가 로드되는 유닛의 환경 설정 파일을 나타냄 |
enabled | 부팅 시에 활성화됨 나타냄 |
disabled | 부팅 시에 비활성화됨을 나타냄 |
active(running) | 프로세스가 하나 또는 그 이상의 프로세스에 의해 동작중임을 나타냄 |
active(exited) | 일회성 프로세스를 성공적으로 실행한 경우에 나타냄 |
active(waiting) | 동작 중인 상태이나 특정 이벤트에 의해 대기 중인 상태를 나타냄 |
inactive(dead) | 프로세스가 종료된 상태를 나타냄 |
static | 활성화가 되지는 않지만, 활성화되는 다른 유닛에 의해 활성화가 가능한 상태를 나타냄 |
타깃(target)
부팅 레벨, 특정 동기화 지점과 같이 유닛을 그룹화할 때 사용
타깃 관련 정보 확인하는 명령어
man systemd. target

Target | 설명 |
poweroff.target | 시스템을 종료시키는 타깃 |
resuce.target | 응급복구 모두(init 체제의 runlevel 1)로 전환하는 타깃 |
emergency.target | resuce.target 과 유사하고, / 를 읽기 전용(read-only)으로 마운트 |
muti-user.target | 콘솔모드(init 체제의 runlevel3)로 전환하는 타깃으로 텍스트 기반 로그인만 지원 |
graphical.target | X Window(init 체제의 runlevel 5) 모드로 전환하는 타깃으로 텍스트 기반 로그인 이외에 X 기반의 로그인을 지원 |
reboot.target | 재부팅시키는 타깃 |
소켓(socket)
systemd에 의해 제어되면서 소켓 기반으로 동작하는 파일 시스템 FIFO, 네트워크 소켓 IPC 등이 해당
소켓 관련 정보 확인하는 명령어
man systemd. socket

systemd 관련 명령어
1. systemctl
systemd 기반의 시스템 및 서비스 관리를 제어하는 명령
- 사용법
systemctl [option] 명령 [서비스명]
- 주요 옵션
옵션 | 명령어 |
-l, --full | 유닛 관련 정보를 출력할 때 긴 이름도 약어로 출력하지 않고 전체 출력함. |
-t, --type= | 유닛의 유형을 지정하는 옵션 |
-a, --all | 유닛 정보를 출력할 때 모든 유닛을 지정하는 옵션 |
--failed | 실패한 유닛 정보만 출력 |
- 런레벨 관련 주요 명령
명령 | 설명 |
get-default | 현재 시스템에 설정된 런레벨 target 정보를 출력 |
set-default [타깃명] | 시스템의 런레벨을 지정한 target으로 변경 |
isolate [타깃명] | 지정한 타깃의 런레벨 즉시 변경 |
rescue | 응급 복구 모드 즉시 전환, 'emergency' 와 유사 |
poweroff | 시스템 즉시 종료, 'halt' 와 동일 |
reboot | 시스템 즉시 재부팅, 'kexec'와 유사 |
- 상태 정보 관련 주요 명령
명령 | 설명 |
list-units | 유닛 관련 정보 출력, 아무 옵션 없이 systemctl 명령 사용 시 기본 적용 |
list-unit-files | 설치된 유닛 파일의 목록 및 상태 정보를 출력 |
list-sockets | 소켓 관련 유닛의 정보를 출력 |
list-dependencies | 명시된 유닛의 의존성 관련 있는 유닛 정보를 출력 |
- 서비스 제어 관련 주요 명령
명령 | 설명 |
enable [서비스명] | 부팅 시, 특정 서비스를 구동 |
disable [서비스명] | 부팅 시, 특정 서비스를 구동시키지 않음 |
is-enable [서비스명] | 부팅 시, 특정 서비스가 구동되는지 여부 확인 ( 구동 : enabled , 비구동 : disabled ) |
start [서비스명] | 특정 서비스를 즉시 시작 |
stop [서비스명] | 특정 서비스를 종료 |
restart [서비스명] | 특정 서비스를 재시작 |
reload [서비스명] | 특정 서비스의 환경 설정만 다시 읽어 들임 |
mask [서비스명] | 특정 서비스이 유닛 파일을 /dev/null 링크 시켜서 시작되는 것을 막을 때 사용 |
unmask [서비스명] | mask 설정된 서비스를 해제 |
is-active [데몬명] | 특정 데몬이 활성화되어 있는 지 여부를 검사 (활성 : active, 비활성 : inactive ) |
status [데몬명] | 특정 데몬에 대한 상태 정보를 출력 |
kill [데몬명] | 특정 데몬의 프로세스를 종료 |
daemon-reload | systemd 매니 관련 환경 설정을 다시 읽어 들임 |
2. systemd-analyze
시스템 부팅과 관련된 성능을 분석
- 사용법
systemd-analyze [argument]
- 주요 인자값
인자값 | 설명 |
tume | 부팅 시에 소요된 시간 정보를 출력, 주로 커널, 램 디스크, 서비스 영역 3가지 정보로 출력 |
blame | 서비스 별로 부팅 시에 소요된 시간을 출력 |
critical-chain | 각 유닛의 시간을 트리 형태로 출력 |
plot | 관련 정보를 SVG(Scalable Vector Graphic) 이미지 파일로 생성 |
3. journalctl
systemd 관련 로그는 systemd-journald 가 생성하고 관리
- 사용법
journalctl [option] [항목]
- 주요 옵션
옵션 | 설명 |
-l, --full | 출력 가능한 모든 필드의 정보를 출력 |
-r, --reverse | 역순으로 출력해주는 옵션으로 가장 최근 정보부터 출력 |
-p, --priority= | syslog 에 사용하는 로그 레벨을 지정하는 옵션 emerg(0), alert(1), crit(2), err(3), warning(4), notice(5), info(6), debug(7) |
--since= | 특정 날짜 이후의 정보만 출력 ('2024-10-15 21:13:00') |
--until= | 특정 날짜까지의 정보만 출력 ('2024-10-15 21:13:00') |
4. timedatectl
시스템의 날짜 및 시간을 확인하거나 설정
- 사용법
timedatectl [command]
- 주요 command
command | 설명 |
status | 시스템의 시간 및 RTC(Real Time Clock)의 시간 정보를 출력 |
set-time | 시스템의 시간을 설정하는 명령 ('2024-10-15 21:13:00') |
set-timezone | 타임존을 설정하는 명령 (Asia/Seoul) |
set-ntp 값 | NTP 사용 여부를 지정하는 명령 (1: 사용, 0:미사용) |
5. hostnamectl
시스템에 설정된 호스텸 정보를 출력하거나 설정하는 명령어
- 사용법
hostnamectl [command] [설정값]
- 주요 command
command | 설명 |
status | 시스템에 설정된 호스트명과 관련된 정보를 출력 |
set-hostname | 호스트명을 설정할 때 사용 |
6. shutdown
시스템을 재시작하거나 전원을 종료하는 명령어, root 만 사용 가능
- 사용법
shutdown [option] 시간 [경고메세지]
- 주요 옵션
옵션 | 설명 |
-r | 시스템을 재부팅할 때 사용 (=reboot) |
-h | 시스템을 종료할 때 사용 (=halt) |
-c | 예약된 셧다운 명령을 취소 |
-k | 실제로 셧다운 하지 않고 경고 메세지만 접속한 사용자들에게 전송 |
7. reboot
시스템을 재시작하는 명령어, 로컬에 접속한 사용자 모두 사용 가능
- 사용법
reboot [option]
- 주요 옵션
옵션 | 설명 |
-w | 시스템을 재부팅을 하지 않ㅎ고, 셧다운한 기록만 저장 |
-f | init을 호출하지 않고 즉시 시스템 재부팅 |
8. halt
시스템을 종료하는 명령어, 로컬에 접속한 사용자 모두 사용 가능
- 사용법
halt [option]
- 주요 옵션
옵션 | 설명 |
-p | 시스템 종료하고 전원까지 끄는 경우에 사용하는 옵션(--poweroff) |
9. poweroff
시스템 종료 및 전원을 끄는 명령어
- 사용법
poweroff
10. init, telinit
init 프로세스에 직접 요청하여 실행레벨을 변경할 떄 사용하는 명령
※ 실행중인 프로세스를 무조건적으로 종료하므로 권장하지 않음.
- 사용법
init 0 #시스템 즉시 종료
init 6 # 시스템 즉시 재부팅
'Server' 카테고리의 다른 글
[Linux] Docker 을 이용하여 CentOS 실습 환경 만들기 (3) | 2024.10.19 |
---|---|
[Linux] 리눅스 디렉토리 구조 및 역할 (1) | 2024.10.18 |
[Ubuntu] 우분투에서 실행 중인 포트 확인 및 죽이기 (0) | 2024.04.01 |
[Linux] CentOS 7 환경 구축하기 - (Oracle Virtual Box) (0) | 2023.02.10 |
[Linux] Oracle VM VirtualBox 설치 및 Ubuntu 가상머신(VM) 구축하기 (4) | 2023.01.18 |