본문 바로가기
오픈소스 읽기 (OLD)/Init 시스템 - Systemd

2. Systemd 기본 개념잡기 (2/2)

by 커널패닉 2021. 3. 18.
반응형

같은 카테고리의 글 보기

www.kernelpanic.kr/category/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4%20%EC%9D%BD%EA%B8%B0/Init%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20-%20Systemd

 

'오픈소스 읽기/Init 시스템 - Systemd' 카테고리의 글 목록

 

www.kernelpanic.kr

2.3 프로세스 관리

앞 포스트에서 Init은 서비스를 실행한다고 하였다. 실행된 서비스는 항상 Init만을 부모 프로세스로 가진다. 따라서 일반적으로 우리가 쉘에서 프로그램 실행 / 종료를 하듯이 해당 서비스를 종료하거나, 재시작하기 까다롭다. (nohup, 시그널 등을 활용하면 가능하기는 하다.) 또한 쉘 프로그램에서는 서비스 프로그램의 로그나 상태 등을 알 수 없다. (쉘에서 서비스의 로그를 알 수 없는 이유는 일반적으로 로그를 출력하는 stdout / stderr에 대한 파이프 라인이 연결되어 있지 핞기 때문이다. 자세한 내용은 라눅스 시스템 프로그래밍에서 파이프라인 참조) 그렇기 때문에 init이 서비스의 생명주기 관리 및 모니터링을 한다.

 

2.3.1 서비스 모니터링

Systemd는 systemctl이라는 유틸을 통해서 서비스의 상태를 모니터링 및 관리 한다. 우선 시스템의 상태를 모니터링 하는 명령어는 다음과 같다.

# systemctl status <service>  # 단일 서비스에 대한 상태 확인
# systemctl status                    # 모든 서비스에 대한 상태 확인

실제 사용 예는 다음과 같다. 우선 systemctl status 명령을 통해서 전체 서비스에 대한 정보를 확인한다. 실행중인 전체 서비스 리스트가 나오는데, State가 degraded이다. 이것은 일부 서비스가 정상적으로 동작하지 않고 있음을 의미한다. 실제로 3개의 서비스가 Failed라고 출력되는 것을 확인 할 수 있다.

systemctl status

어떤 서비스가 정상적으로 동작하지 않는지를 확인하기 위해서 systemctl --failed를 입력했다. 이 명령어는 Failed 상태에 있는 서비스만을 출력하는 명령이다. 명령을 실행하면 아래 3개의 서비스에 문제가 있음을 확인할 수 있다.

systemctl --failed

vmware 서비스가 왜 정상동작을 하지 않는지를 확인하기 위해서 systemctl status vmware.service를 입력하였다. 그러면 아래와 같이 서비스의 상태와 서비스가 출력한 로그 정보 등이 나온다. 아쉽게도 여기서는 별다른 힌트가 될 만한 에러 메시지가 보이지는 않지만, 이와 같은 방식으로 문제에 대한 힌트를 찾아볼 수 있다.

systemctl status vmware.service

 

2.3.2 서비스 관리

systemctl 유틸은 서비스를 관리하는데에도 사용된다. 서비스를 실행 / 중지하는데 일반적으로 주로 사용되는 명령어는 크게 5가지가 있다. 각 명령어는 다음과 같다.

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

 

2.4 시스템 관리

Systemd는 핵심적인 시스템 서비스들을 실행한다. 이 중 일부는 다른 init 시스템도 실행하는 내용이지만, systemd만큼 다양한 영역에서 시스템 관리 서비스을 제공하지는 않는다. Systemd가 제공하는 시스템 서비스들은 다음과 같다.

  • systemd-network: 네트워크 관리 서비스로, DHCP(동작 IP 할당) 작업, 와이파이 연결, 네트워크 브릿징 등의 다양한 기능을 제공한다.
  • systemd-udevd: 등록된 디바이스가 연결되면 동적으로 디바이스 노드를 만든다. 예를 들어서 usb를 연결하면 특정 폴더에 마운트 되도록 할 수 있다.
  • systemd-journald: 시스템 서비스와 커널 로그를 저장한다. 아래 2.5 유틸리티 제공 절에서 보다 상세히 다루었다.
  • systemd-timesyncd: 시스템 시간을 네트워크 시간과 동일하게 맞춰주는 서비스이다.
  • 번외) dbus: 리눅스 IPC를 돕는 버스 서비스이다. systemd만의 고유한 서비스가 아님에도, freedesktop.org에서 systemd의 장점으로 넣었길래 일단 추가했다. (이유를 안다면 부디 알려주기를 바란다.) dbus는 오늘날 리눅스에서 가장 핵심적인 시스템 서비스 중 하나이기 때문에, 조만간 dbus를 주제로 포스트를 올릴 예정이다.

 

2.5 유틸리티 제공

systemd는 리눅스 시스템에서 중요한 유틸리티들을 두 가지 제공하는데, 하나는 systemd의 서비스 활용을 돕는 프로그램들이고, 다른 하나는 sd api들이다. 우선 systemd 프로그램으로는 joutnalctl과 networkctl이 있다. journalctl을 이용해서 개발자들은 시스템 서비스 및 커널의 로그를 쉽게 볼 수 있다. 사용법은 간단하다. journalctl을 입력하면 된다.

$ journalctl                        # 시스템 로그를 출력
$ journalctl -h                    # 도움말 옵션
$ journalctl -f                     # 지금부터 입력되는 로그 출력
$ journalctl | grep [regex]  # 특정 패턴의 로그만 필터링하여 출력

위의 사용법은 많이 사용하는 journalctl의 옵션들을 뽑아본 것이고, 상세한 옵션은 jounalctl -h를 입력하여 확인 할 수 있다.

systemd-network 서비스를 사용하는 경우, networkctl을 이용해서 서비스를 모니터링 할 수 있다. 기본적인 사용법은 아래와 같다.

$ networkctl                     # 네트워크 상태 정보 출력
$ networkctl status [link]  # 네트워크 링크에 대한 상세 정보 출력 (ip, dns, 게이트웨이 등)

다음으로 systemd는 다양한 분야의 api들을 제공한다. 그리고 systemd에서 제공하는 api들은 시스템 프로그래밍에 상당히 유용하기 때문에 알아두면 꽤나 유용하다. 아래는 대표적으로 사용되는 api들이고, 이 외에도 자잘한 몇 가지 api가 더 있다.

  • sd-bus: dbus를 사용하기 위한 api를 제공한다. gdbus와 더불어 가장 많이 사용되는 dbus api 중 하나이다.
  • sd-event: C언어로 eventloop를 관리하는 것을 돕는 api이다. C로 간단한 event 기반 프로그래밍을 할 때 유용하다.
  • sd-journal: 시스템 로그 출력을 위한 api이다.

위 api에 대한 상세한 사용법은 다음 문서를 참조하면 도음이 된다. (영어 주의)

api docs
sd-bus www.freedesktop.org/software/systemd/man/sd-bus.html

0pointer.net/blog/the-new-sd-bus-api-of-systemd.html

sd-event www.freedesktop.org/software/systemd/man/sd-event.html

0pointer.net/blog/introducing-sd-event.html

sd-journal www.freedesktop.org/software/systemd/man/sd-journal.html
반응형