OS

[ Linux ] Systemd 세부 특징

jogaknabi_1023 2024. 11. 4. 15:21

이전 게시물에서 넘어와 여기서는 Systemd 에 대한 자세한 내용을 알아보도록 하겠다.

아래는 systemd의 특징을 세부적으로 분류한 것이다.

자료 출처:  https://www.kernelpanic.kr/17

 

1) 서비스/데몬 관리

systemd 에서 unit 은 systemd가 관리할 수 있는 객체이다.

- /etc/systemd/system : 시스템 관리자가 수동으로 생성 및 관리하는 유닛들이 저장되어 있는 디렉토리

- /run/systemd/system : 시스템이 런타임 상태일 때 임시로 유닛 파일을 저장하는 디렉토리 (/run 경로에 있어서 재부팅되면 모두 삭제된다.)

- /usr/lib/systemd/system : 특정 유닛이 포함된 패키지를 설치하면 저장되는 디렉토리의 원본 파일. 사용자가 서비스를 enable 시키면 이 디렉토리에 존재하는 파일이 /etc/systemd/system 디렉토리에 링크된다.

 

<unit 의 종류>

각각의 unit 들에 대한 구성 파일들은 /etc/systemd/system 경로에서 확인할 수 있다. 확장자에 따라 구성 파일의 unit 을 유추할 수 있다.

=> 여기서 "같은 이름의 서비스 유닛이 존재한다" 란 말은 해당 unit 들은 일반적인 unit 과 달리 다른 unit 과의 상호작용하며 긴밀하게 연결되어 있다는 것을 뜻한다.(path, timer, socket)
만약 socket unit(example.socket) 에서 8080포트에서 클라이언트의 요청을 수신한다고 하면 service unit(example.service) 이 클라이언트의 요청을 받을 때 자동으로 시작되는 것처럼 !

 

1. Service Unit

  • 기본적으로 [Util], [Install] 섹션이 존재하며 [service] 섹션에 서비스 유닛에 대한 옵션 값들을 정의되어 있다.
  • systemctl 을 이용하여 서비스를 시작하면 systemd는 해당 유닛 파일이 존재하는지 확인하고, 없으면 같은 이름으로 된 init 스크립트 파일을 찾아 실행하지만 systemd가 모든 init 스크립트를 실행할 수 있는 것은 아니다.
    추가로 init을 사용하는 시스템이면 초기화 명령어들이 쉘 스크립트 형식으로 적혀 있지만, systemd 시스템에서는 unit 파일들을 통해 더욱 직관적인 보기가 가능해졌다.
더보기
더보기

<service unit의 [service] 섹션의 옵션>

(1) type : service unit의 유형

- simple

- forking

- oneshot

- dbus

- notify

(2) ExecStart : unit 이 시작할 때 실행할 명령이나 스크립트 경로

- ExecStartPre : ExecStart 이전에 실행될 사용자 정의 명령어 지정
- ExecStartPost : ExecStart 이후에 실행될 사용자 정의 명령어 지정

(3) ExecStop : unit이 Stop 되었을 때, 실행할 명령이나 스크립트
(4)ExecReload : unit이 Reload 되었을 때, 실행할 명령이나 스크립트
(5)Restart — 활성화되면, 이미 중지되어 있는 unit을 제외한 unit이 종료되면 서비스를 재시작
(6)RemainAfterExit (default : False이며 보통 Type=oneshot과 함께 사용) : True로 세팅되었을 경우, 서비스는 모든 프로세스가 종료되어도 실행 상태인 것으로 간주한다.

 

2. Device Unit

  • sys/udev 장치 트리에 등록된 정보를 담고 있다.
  • 하드웨어가 추가되거나 디스크를 파티셔닝 한 경우, 생성된다.
  • Device Unit의 경우, unit 파일에 [Device] 섹션이 따로 존재하지 않고, systemd가 ‘systemd’라는 udev tag 가 표시된 모든 장치의 Device Unit 파일을 동적으로 생성한다.

3. Mount Unit

  • 마운트 포인트를 관리하는 유닛
  • 사용자가 파일시스템이 생성된 파티션 장치를 마운트 포인트에 연결하면 Mount Unit이 생성되고 마운트를 해제하면 Mount Unit이 제거됨
  • 즉 /etc/fstab 파일에 마운트 정보를 등록한 뒤, 시스템을 재부팅하면 Mount Unit 파일이 생성된다. Mount Unit은 파일에서 [Mount]섹션에 정보가 저장된다.

4. Automount Unit

  • 자동마운트 유닛은 유닛 파일에서 [Auto-mount]섹션에 정보가 저장된다.

5. Swap Unit

  • 스왑 영역을 관리하는 유닛
  • 스왑 영역을 활성화하면 스왑 영역으로 사용되는 (파티션 장치나 파일)이름 뒤에 .swap 확장자가 추가된 유닛이 생성된다.

6. Target Unit

  • init 프로세스에서 런 레벨과 매핑되는 유닛

7. Path Unit

  • 특정 파일시스템이나 디렉토리를 모니터링하기 위한 정보를 저장
  • [Path]섹션에 저장되며, 같은 이름의 service unit이 존재한다.

8. Timer Unit

  • crontab 같이 일정 주기마다 유닛을 실행 할 때 사용하는 유닛
  • 같은 이름의 service unit이 존재한다.

9. Snapshot Unit

  • 특정시점의 모든 유닛상태를 저장하는 저장하는 유닛
  • 파일 형태로 저장되지 않는다.
  • systemctl snapshot(스냅샷 생성), systemctl isolate(스냅샷 사용), systemctl delete(스냅샷 제거)

10. Socket Unit

  • systemd에 의해 제어되는 IPC(Inter Process Communication), 네트워크 소켓, 파일 시스템의 파일 입출력(FIFO)에 대한 정보를 가지고 있는 unit
  • [Socket] 섹션에 저장되며 socket unit은 같은 이름을 가진 service unit이 존재한다.

11. Scope Unit

  • 유닛 파일에 의해 구성되지 않고, 오직 systemd의 bus interface를 이용하여 계획적으로 생성된다.
  • 프로세스의 집합을 관리하며 서비스 유닛과 다르게 외부적으로 생성된 프로세스를 관리하고 자식프로세스를 생성하지 않는다.
  • 자원을 조직화하고 관리하기 위해 시스템 서비스 작업 프로세스들을 그룹화시키는 것이 목적이며, 특정 scope unit의 상태를 확인하면 CGroup(Control Group)으로 여러 개의 프로세스가 그룹화 된 것을 확인 가능하다.

12. Slice Unit

  • 해당 유닛에는 별도의 [Slice] 섹션이 존재하지 않는다.
  • 슬라이스 유닛은 프로세스 그룹의 자원을 계층적으로 관리하기 위한 개념으로 슬라이스 유닛은 CGroup 트리에 하나의 노드를 생성하므로써 자원을 관리한다.
  • slice unit은 프로세스에 자원을 제한하거나 할당하는 역할을 한다.

unit file 작성과 관련하여 더 자세한 내용은 https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files 을 참고 바란다. (근데 영어다.)

 

 

2) 프로세스 관리

systemd 는 systemctl 이라는 유틸을 통해서 서비스의 상태를 모니터링 및 관리한다. systemctl status <service> 명령어를 사용하여 서비스의 상태를 확인할 수 있다. systemctl --failed 명령어를 통해 실패한 서비스만을 출력하는 것도 가능하다.

위에서는 서비스 상태만을 확인하는 예를 써두었지만 다른 유닛들을 확인할 수도 있다.

 

<service 관리하는 명령어>

  • enable: 서비스를 등록한다. 새로 시스템을 부팅 시 활성화된다.
  • disable: 서비스를 해제한다. 새로 시스템을 부팅 시 활성화 하지 않는다.
  • start: 지금 서비스를 시작한다. 일회성으로 시스템 재부팅 시 enable이 되어 있지 않다면 실행되지 않는다.
  • stop: 지금 서비스를 종료한다.
  • restart: 지금 서비스를 시작한다. 만약 기존에 동작중인 서비스가 있다면, 서비스 종료 후 재시작한다.

 

3) 시스템 관리

아래의 systemd daemon들은 /etc/systemd 경로에서 확인할 수 있다.

자료 출처: https://en.wikipedia.org/wiki/Systemd#/media/File:Systemd_components.svg

          - systemd : init 데몬


- systemd-journald : 다른 데몬(프로세스)들의 출력(syslog, 표준, 에러 출력), 로그 저장 데몬
- systemd-udevd : 장치 관리자 데몬. 예를 들어 usb를 연결하면 특정 폴더에 마운트 되도록 할 수 있다.
- systemd-logind : 사용자 로그인, 세션 등 관리 데몬
- systemd-networkd : 네트워크 관리 데몬. WIFI 연결, DHCP 활동 뿐만 아니라 Virtual Lan 설정까지 가능하다.
- systemd-resolved : DNS 해석 데몬
- systemd-timesyncd : NTP로 시스템 시간을 네트워크 시간과 동기화 시켜주는 데몬
- systemd-boot : UEFI 부트로더

4) 유틸리티 제공

가장 기본적으로 많이 사용되는 utility는 systemctl , journalctl 이 있다. journalctl 을 사용하여 시스템 서비스 및 커널의 로그를 확인할 수 있다.

# 시스템 로그 출력
journalctl
# 도움말 옵션
journalctl -h
# 최근 메시지만 확인
journalctl -n <메시지 갯수>