Linux

Linux systemd 완전 정복하기

Joon0464 2024. 5. 7. 20:11

systemd

리눅스 시스템 관리에 있어서 systemd는 중요한 구성 요소 중 하나입니다. 이 글에서는 systemd가 무엇인지, 그리고 systemd에서 사용하는 유닛 파일들에 대해 자세히 알아보겠습니다.

systemd란?

 

systemd는 리눅스 시스템과 서비스 관리자로, 초기화 시스템(init), 시스템 서비스 관리자, 그리고 세션 관리자의 역할을 합니다. 대부분의 최신 리눅스 배포판에서는 기본 초기화 시스템으로 systemd를 사용합니다. systemd는 시스템의 부팅 과정을 책임지며, 시스템이 가동되는 동안 서비스들을 시작, 중지, 관리합니다.

systemd의 주요 기능

  • 병렬 처리: systemd는 서비스들을 병렬로 시작합니다. 이는 시스템의 부팅 시간을 단축시킵니다.
  • 유닛 파일: 서비스, 소켓, 디바이스 등을 관리하기 위한 설정 파일입니다.
  • 종속성 관리: 서비스들 사이의 종속성을 관리하여, 필요한 서비스들이 올바른 순서로 시작되도록 합니다.
  • 자동 마운트: 외부 저장 장치를 자동으로 마운트하고 관리합니다.
  • 로그 관리: systemd의 일부인 journald를 통해, 시스템 로그와 서비스 로그를 관리합니다.

또한 init은 초기화 때 순서대로 서비스를 시작하지만 systemd는 어느 서비스든 종속성만 충족되면 시작할 수 있으므로 시작 시간을 단축시킬 수 있습니다. 언제 무엇을 어떻게 실행할 것인지 systemd에 지시하기 위한 방법으로 unit을 사용하게 됩니다.

systemd unit


systemd에서는 다양한 리소스를 '유닛(Unit)'으로 관리하며 서비스(.service), 마운트(.mount), 소켓(.socket) 등 다양한 유형이 있습니다. Systemd는 다양한 unit 을 통해 리눅스 시스템의 서비스와 자원을 관리합니다. 각 unit 은 시스템의 다른 부분을 관리하며, 다음은 주요 unit 의 종류와 그 설명입니다.

1. service 유닛

  • 서비스나 애플리케이션을 관리하는 데 사용됩니다.
  • 어떻게 서비스가 시작되고, 중지되고, 재시작되는지를 정의합니다.

2. target 유닛

  • 여러 유닛을 그룹화하여 관리하는 데 사용됩니다.
  • 시스템의 특정 상태에 도달하기 위해 필요한 유닛들을 조합할 수 있습니다.

3. mount 유닛

  • 파일 시스템 마운트 지점을 관리합니다.
  • /etc/fstab에 있는 마운트 지점을 systemd unit으로 변환할 수 있습니다.

4. timer 유닛

  • 시간 기반의 작업을 스케줄링하는 데 사용됩니다.
  • cron 대신 사용할 수 있으며, 특정 시간에 서비스를 시작하도록 할 수 있습니다.

5. socket 유닛

  • IPC 소켓, TCP 소켓 등 네트워크 소켓을 관리합니다.
  • 서비스가 필요할 때만 서비스를 시작하도록 하는 데 사용될 수 있습니다.

6. device 유닛

  • 시스템의 디바이스를 나타냅니다.
  • udev 규칙에 의해 생성되며, 특정 디바이스에 대한 의존성을 정의할 때 사용됩니다.

7. automount 유닛

  • 파일 시스템 마운트 지점을 자동으로 마운트하는 데 사용됩니다.
  • 접근 시에만 마운트를 활성화하도록 설정할 수 있습니다.

8. swap 유닛

  • swap 유닛은 스왑 공간을 관리합니다.
  • swap 파일이나 swap 파티션을 정의하여 사용할 수 있습니다.

9. path 유닛

  • 패스 유닛은 파일 시스템의 경로를 감시하고, 변경 사항이 있을 때 서비스를 활성화합니다.
  • 특정 파일이나 디렉토리의 변화를 감지할 때 사용됩니다.

10. snapshot 유닛

  • 시스템의 현재 상태를 snapshot으로 저장합니다.
  • 시스템 설정이나 서비스 상태를 임시로 저장하고 복원할 때 사용됩니다.

11. slice 유닛

  • 시스템 프로세스를 그룹화하여 리소스 관리를 수행합니다.
  • cgroups를 사용하여 리소스 사용량을 제한하고 관리합니다.

12. scope 유닛

  • 시스템에서 직접 생성하지 않은 프로세스를 systemd의 관리 하에 두기 위해 사용됩니다.
  • 사용자가 직접 시작한 프로세스 또는 다른 시스템 프로세스에서 파생된 프로세스를 관리하는 데 사용할 수 있습니다.
  • 주로 시스템의 리소스 할당 및 관리를 위해 systmed에 의해 내부적으로 사용됩니다.

Unit 파일 경로

systemd에게 인식되려면 unit은 하나의 파일로 직렬화되어야 합니다. systemd는 아래와 같이 여러 위치에서 unit 파일을 찾습니다. 가장 중요한 파일 경로 세 가지는 다음과 같습니다.

/lib/systemd/system

  • 이 디렉토리는 일반적으로 패키지 관리자에 의해 설치된 유닛 파일들을 저장합니다. 즉, 시스템에 설치된 소프트웨어나 서비스가 자동으로 생성하는 유닛 파일들이 여기에 위치합니다.
  • 사용자가 직접 수정하기보다는, 패키지 업데이트 시 변경사항을 반영하기 위해 남겨둡니다. 사용자 정의 설정이 필요한 경우, /etc/systemd/system에 유닛 파일을 복사하여 수정합니다.

/etc/systemd/system

  • 시스템 관리자가 직접 생성하거나 수정한 유닛 파일들을 위한 디렉토리입니다. 여기에 배치된 파일들은 /lib/systemd/system에 있는 파일들보다 우선권을 가집니다.
  • 이는 사용자가 특정 서비스의 동작 방식을 변경하고자 할 때 사용됩니다. 예를 들어, 기본 서비스 유닛 파일에 사용자 정의 옵션을 추가하거나 수정하는 경우입니다.

/run/systemd/system

  • 이 디렉토리는 시스템이 실행 중일 때 생성되는 유닛 파일들을 저장합니다. 주로 시스템의 런타임 중에 발생하는 비지속적인 수정사항을 담당합니다.
  • 여기에 저장된 파일들은 시스템이 재부팅되면 사라지므로, 임시적인 변경을 위해 사용됩니다. 예를 들어, 시스템의 현재 실행 세션에만 적용될 서비스 변경사항을 반영할 때 이용됩니다.

Systemd Unit 파일 작성 방법


Systemd unit 파일은 대략적으로 다음과 같은 구조로 이루어져 있습니다.

/etc/systemd/system/my-web.service 파일을 생성하고 다음 내용을 입력합니다.

[Unit]
Description=My Simple Web Server
After=network.target

[Service]
ExecStart=/usr/bin/python3 -m http.server 8000
WorkingDirectory=/home/user/web
User=user
Restart=on-failure

[Install]
WantedBy=multi-user.target

 

[Unit] 섹션

    • Description: 서비스에 대한 간략한 설명입니다. 이 예제에서는 "My Simple Web Server"라고 설명하고 있습니다.
    • After: 이 서비스가 시작되기 전에 먼저 시작되어야 하는 다른 유닛을 명시합니다. 여기서는 네트워크가 준비된 후(network.target)에 웹 서버가 시작되도록 설정하였습니다.
    • 더 자세한 내용 및 옵션 정보는  [Unit] Section Official Docs 를 참고하면 됩니다.

[Service] 섹션

  • ExecStart: 서비스를 시작할 때 실행할 명령어입니다.  예제에서는 Python 3의 내장 HTTP 서버 모듈을 8000번 포트에서 실행하는 명령어를 사용합니다.
  • WorkingDirectory: 서비스가 실행될 때 작업 디렉토리를 지정합니다. 여기서는 /home/user/web으로 설정하였습니다.
  • User: 서비스를 실행할 사용자를 지정합니다. 이 예제에서는 user 사용자를 사용합니다.
  • Restart: 서비스가 실패할 경우 재시작 정책을 정의합니다. on-failure로 설정하면 서비스가 실패했을 때만 재시작됩니다.
  • 더 자세한 내용 및 옵션 정보는 [Service] Section Official Docs 를 참고하면 됩니다

[Install] 섹션

  • WantedBy: 이 유닛이 활성화될 때 자동으로 시작되어야 하는 대상을 지정합니다. multi-user.target으로 설정하면 시스템이 다중 사용자 모드로 부팅할 때 서비스가 시작됩니다.
  • 더 자세한 내용 및 옵션 정보는 [Install] Section Official Docs 를 참고하면 됩니다 

 

systemctl로 관리하기


 

위에 작성한 my-web.service unit 파일을 활성화하고 시작하기 위해 다음 명령어를 사용합니다.

$ sudo systemctl enable my-web.service
$ sudo systemctl daemon-reload 
$ sudo systemctl start my-web.service

이제 my-web.service가 시스템 부팅 시 자동으로 시작됩니다.

이 내용을 통해 systemd unit 파일의 종류와 기본적인 작성 방법에 대해 알아보았습니다. 추가적으로 systemctl 의 주로 사용하는 명령어는 아래와 같습니다.

명령어 설명
systemctl enable [서비스명] 해당 서비스를 시스템 부팅 시 자동으로 시작하도록 설정합니다. 이 작업은 서비스의 심볼릭 링크를 생성하여 관련된 타겟에 등록합니다.
systemctl disable [서비스명] 서비스가 시스템 부팅 시 자동으로 시작되지 않도록 설정을 해제합니다. 이는 서비스의 심볼릭 링크를 제거합니다.
systemctl daemon-reload systemd의 설정을 다시 불러오도록 합니다. 이 명령어는 unit 파일을 수정한 후에 변경사항을 적용하기 위해 사용됩니다.
systemctl start [서비스명] 지정한 서비스를 즉시 시작합니다.
systemctl stop [서비스명] 지정한 서비스를 즉시 중지합니다.
systemctl restart [서비스명] 지정한 서비스를 재시작합니다. 서비스를 중지한 다음 다시 시작하는 것과 동일한 효과를 가집니다.
systemctl reload [서비스명] 서비스의 설정을 다시 불러옵니다. 서비스를 중지하지 않고 구성을 새로고칠 때 사용됩니다. 단, 모든 서비스가 이 기능을 지원하는 것은 아닙니다.
systemctl kill [서비스명] 지정한 서비스에 신호를 보내 프로세스를 종료합니다. 특정 상황에서 서비스를 강제로 중지할 때 사용됩니다.
systemctl status [서비스명] 지정한 서비스의 상태를 보여줍니다. 서비스가 활성화되어 있는지, 현재 실행 중인지, 로그 메시지는 어떤 것들이 있는지 등의 정보를 확인할 수 있습니다.
systemctl is-enabled [서비스명] 지정한 서비스가 부팅 시 자동으로 시작되도록 설정되었는지 확인합니다. enabled, disabled, static 등의 상태를 반환합니다.
systemctl is-active [서비스명] 지정한 서비스가 현재 활성화(실행 중) 상태인지 확인합니다.
systemctl list-units --type=service 시스템에서 현재 활성화되어 있는 모든 서비스의 목록을 보여줍니다.
systemctl list-unit-files --type=service 시스템에 설치된 모든 서비스 파일의 목록과 그 상태(활성화, 비활성화)를 보여줍니다.

 

추가적으로 systemd 생태계에서 사용하기 편리하며 알아두면 좋은 커맨드라인 도구가 많이 존재합니다. 

bootctl, timedatectl, coredumpctl, 그리고 journalctl은 systemd 환경에서 시스템 관리와 진단을 위해 사용되는 명령어들입니다. 각각의 명령어는 아래와 같은 용도로 사용됩니다:

  1. bootctl
    • 설명: bootctl 명령어는 systemd-boot 부트로더와 관련된 작업을 수행하기 위해 사용됩니다. systemd-boot는 UEFI 시스템에서 사용할 수 있는 간단한 EFI 부트로더입니다.
    • 사용 케이스: 부트로더의 상태 확인, 부트로더 설치 또는 업데이트, 부트 항목의 관리 등을 할 때 사용합니다.
  2. timedatectl
    • 설명: timedatectl 명령어는 시스템의 날짜와 시간 설정을 관리하기 위해 사용됩니다. 이 명령어를 통해 시간대(timezone) 설정, 네트워크 시간 프로토콜(NTP) 설정의 활성화나 비활성화, 현재 시간 설정 등을 할 수 있습니다.
    • 사용 케이스: 시스템의 현재 날짜와 시간 확인, 시간대 변경, NTP를 통한 시간 동기화 설정 등에 사용됩니다.
  3. coredumpctl
    • 설명: coredumpctl 명령어는 시스템에서 발생한 코어 덤프를 관리하고 검사하기 위한 도구입니다. 이 명령어를 사용하여 코어 덤프 파일의 목록을 확인하고, 특정 코어 덤프의 상세 정보를 보거나, gdb와 같은 디버거로 코어 덤프를 분석할 수 있습니다.
    • 사용 케이스: 프로그램이 비정상 종료되었을 때 생성된 코어 덤프의 분석, 코어 덤프 파일의 관리 등에 사용됩니다.
  4. journalctl
    • 설명: journalctl 명령어는 systemd의 로깅 시스템인 systemd-journald의 로그를 검색하고, 보기 위해 사용됩니다. 이 명령어를 사용하면 시스템 부팅부터 현재까지의 다양한 로그를 필터링하여 볼 수 있습니다.
    • 사용 케이스: 시스템의 오류 진단, 특정 기간 동안의 로그 확인, 서비스 또는 시스템 부팅 관련 로그 분석 등에 사용됩니다.

이 명령어들은 systemd를 사용하는 Linux 배포판에서 시스템 관리 및 문제 해결을 위한 중요한 도구들입니다.

'Linux' 카테고리의 다른 글

Linux 부팅 프로세스  (0) 2024.05.07
Linux 접근 제어 목록(ACL) 이란?  (0) 2024.05.03
Linux seccomp 프로필과 접근제어목록(ACL)이란?  (0) 2024.05.03
Linux Capability 란?  (1) 2024.05.02
RUID EUID SUID 란?  (0) 2024.05.02