본문 바로가기

Server

[Linux] systemd 은 뭐하는 아이 일까?

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 # 시스템 즉시 재부팅