본문 바로가기
프로그래밍/리눅스

Linux CentOS7 systemd 프로그램 정리

by 참외롭다 2023. 3. 20.
반응형

개요

systemd는 System and Service Manager로 시스템의 부팅 및 서비스 관리를 위한 프로그램이다.

이전 버전까지의 init 역할을 대신하면서 CentOS 7 버전부터 사용되고 있다. 기존의 init 프로세스와 동일하게 PID 1번이 할당된다.

systemd의 핵심은 unit 이라 불리는 일종의 object 이다. 유닛은 service, target, socket, path 와 같이 다양한 type을 가진다.


systemd 관련 디렉터리

/etc/systemd/system

 

유닛의 환경 설정 파일이 위치하는 디렉터리이다.

디렉터리 내에는 '.wants' 라는 디렉터리가 존재하는데, 이 디렉터리는 특정 유닛의 구동에 필요한 설정파일을 심볼릭 링크로 담고 있다.

 

/run/systemd/system 

 

런타임 유닛 파일이 위치하는 디렉터리이다.

 

/usr/ilb/systemd/system 

 

시스템에서 사용되는 service 및 target 유닛 파일이 위치하는 디렉터리이다.


systemd의 구조

 

유닛(unit)

 

systemd는 유닛이라고 부르는 대상으로 나뉘고 다양한 유닛의 타입이 존재한다. 유닛에 관한 자세한 정보는 'man systemd.unit' 에서 확인할 수 있다.

 


 

서비스(service)

 

시스템에서 제공하는 서비스로 웹 서버나 메일 서버 같은 데몬을 뜻한다. systemd 체제에서 서비스는 systemctl 이라는 하나의 명령어로 제어된다.

자세한 사항은 'man systemd.service' 에서 확인가능하다.

 

서비스 관련 상태정보는 'systemctl status servicename' 으로 확인가능하다.

 


타깃(target)

 

타깃은 부팅 레벨, 특정 동기화 저점과 같이 유닛을 그룹화할 때 사용한다. 'man systemd.target' 에서 확인할 수 있다.

 

주요 타깃은 다음과 같다.

 

- poweroff : 시스템을 종료시키는 타깃이다.

 

- rescue : 응급복구 모드로 전환하는 타깃이다.

 

- emergency : / 를 읽기 전용으로 마운트한다.

 

- multi-user : 콘솔 모드로 전환하는 타깃으로 텍스트 기반 로그인만 지원한다.

 

- grapical : X window 모드로 전환하는 타깃으로 X 기반의 로그인을 지원한다.

 

- reboot : 재부팅시키는 타깃이다.

 

- runleveln : 

 

이전 버전의 init 에서는 부팅과 관련된 런레벨을 0~6 까지의 숫자값으로 정의했는데, systemd 체제에서는 runleveln.target 이라는 이름으로 심볼릭 링크를 제공한다. 관련 파일은 /lib/systemd/system 디렉터리에서 확인할 수 있다.

 

부팅과 관련된 타깃의 주요 역할은 특정 레벨에서 특정 서비스들이 부팅 시에 자동으로 활성 또는 비활성 여부를 지정하는 것이다.

부팅 시에 특정 서비스 자동 활성화 여부는 타깃 관련 디렉터리에 실행 파일에 대한 심볼릭 링크 파일을 생성하고, 비활성화는 심볼릭 링크 파일을 삭제하는 방법으로 지정한다.


소켓

 

소켓 유닛은 systemd에 의해 제어되면서 소켓 기반으로 동작하는 파일 시스템, 네트워크, IPC 등이 해당된다.

텔넷 서비스를 대표적인 예로 들 수 있는데 systemd 에서는 텔넷 서비스를 telnet.socket이라는 유닛으로 제공한다.

자세한 사항은 'man systemd.socket' 에서 확인할 수 있다.


systemd 관련 명령어

# systemctl

# systemd 기반 시스템 및 서비스 관리를 제어하는 명령어이다.

# systemctl [option] 명령어 [serviceName]

# option

# -l  : 유닛 관련 정보를 출력할 때 전체출력한다.

# -t : 유닛의 유형을 지정한다.

# -a : 유닛 정보를 출력할 때 모든 유닛을 지정한다.

# -failed : 실패한 유닛 정보만 출력한다.


# 명령어

# get-default : 현재 시스템에 설정된 런레밸 target 정보를 출력한다.

# set-default targetname : 시스템의 런레벨을 targetname으로 바꾼다.

# isolate targetname : 지정한 타깃의 런레벨로 즉시 변경한다.

# rescue : 응급 복구 모드로 즉시 전환한다.

# poweroff : 시스템을 즉시 종료한다.

# reboot : 시스템을 즉시 재부팅한다.

# enable servicename : 부팅 시에 특정 서비스를 구동한다.

# disenable servicename : 부팅 시에 특정 서비스를 구동하지 않는다.

# is-enabled servicename : 부팅 시 특정 서비스 구동여부를 확인한다.

# start servicename: 특정 서비스를 즉시 시작한다.

# stop servicename : 특정 서비스를 종료한다.

# restart servicename : 특정 서비스를 재시작한다.

# reload servicename :  특정 서비스의 환경 설정만 다시 읽어 들인다.

# mask servicename : 특정 서비스의 윤닛 파일을 /dev/null로 링크시켜 시작되는 것을 막는다.

# unmask servicename : 특정 서비스의 mask 를 해제한다.

# is-active demonname : 특정 데몬이 활성화 되어있는지를 확인한다.

# status demonname : 특정 데몬에 대한 상태 정보를 출력한다.

# kill demonname : 특정 데몬의 프로세스르 종료시킨다.

# demon-reload : systemd 매니저 관련 환경 설정을 다시 읽어 들인다.

# 유닛 관련 정보를 출력한다. 
$ systemctl

# 사용 가능한 유닛 유형을 출력한다.
$ systemctl -t help

# 실패한 유닛 정보만 출력한다
$ systemctl --failed

# 서비스 관련 유닛 정보만 출력한다.
$ systemctl list-units --type=service

# 서비스 관련 모든 유닛 정보를 출력한다.
# systemctl list-units --type=service --all

# 시스템 런레벨을 multi-user.target으로 설정한다.
$ systemctl set-defult multi-user.target

# 현재 시스템 런레벨을 multi-user.target(runlevel3.target)으로 즉시 변경한다.
$ systemctl isolate runlevel3.target

# 현재 시스템 런레벨을 graphical.target(runlevel5.target)으로 즉시 변경한다.
$ systemctl isolate graphical.target

# 부팅 시에 진입하는 런레벨 타깃으로 전환한다.
systemctl isolate default.target

# 응급 복구 모드로 즉시 전환한다.
$ systemctl rescue

# 시스템을 종료시킨다.
$ systemctl poweroff

# 시스템을 재부팅시킨다. 
$ systemctl reboot

# 설치된 유닛 파일의 목록 및 상태 정보를 출력한다.
$ systemctl list-unit-files

# 소켓 관련 유닉의 상태 정보를 출력한다.
$ systemctl list-sockets

# sshd.service 유닛의 의존성 관련 유닛 정보를 출력한다.
$ systemctl liso-dependencies sshd.service

# 기본 타깃 유닛의 의존성 관련 유닛 정보를 출력한다.
$ systemctl list-dependencies

# 부팅 시에 sshd.service를 구동하도록 설정한다.
$ systemctl enable sshd.service

# 부팅 시에 sshd.service를 구동되지 않도록 설정한다.
$ systemctl disable sshd.service

# sshd.service가 관련 명령을 이용해서 시작되는 것을 막는다.
$ systemctl mask sshd.service

# sshd.service에 대한 마스크 설정을 해제한다.
$ systemctl unmask sshd.service

# sshd.service가 부팅 시에 구동되는지 확인한다.
$ systemctl is-enable sshd.service

# sshd.service를 즉시 시작한다.
$ systemctl start sshd.service

# sshd.service를 즉시 중단한다.
$ systemctl stop sshd.service

# 텔넷 서비스를 즉시 시작한다.
$ systemctl start telnet.socket

# sshd 서비스가 활성화되어 있는지 여부를 검사한다.
$ systemctl is-active sshd

# sshd 프로세스를 종료시킨다.
$ systemctl kill sshd

# crond 서비스에 대한 상태 정보를 자세히 출력한다.
$ systemctl -l status crond

# sshd.service를 재시작한다.
$ systemctl restart sshd.service

# sshd.service의 환경 설정 파일을 다시 읽어 들인다.
$ systemctl reload sshd.service

# systemd 관련 설정 파일을 다시 읽어 들인다.
$ systemctl daemon-reload

 

# systemd-analyze

# 시스템 부팅과 관련된 성능을 분석해주는 명령어이다.

# systemd-analyze [argument]

# argument

# time : 부팅시 소요된 시간 정보를 출력한다.

# blame : 서비스별로 부팅 시에 소요된 시간을 출력한다.

# critical-chain : 각 유닛의 시가늘 트리 형태로 출력한다.

# plot : 관련 정보를 SVG  이미지 파일로 생성한다.

# 시스템 부팅에 걸린 시간을 출력한다.
$ systemd-analyze

# 서비스별로 부팅에 소요된 시간 정보를 출력한다.
$ systemd-analyze blame

# 각 유닛에 소요된 시간 정보를 트리 형태로 출력한다.
$ systemd-analyze critical-chain

# 시스템 부팅에 소요된 시간을 SVG 이미지 파일로 생성한다.
$ systemd-analyze plot > systemd.svg

systemd 로그 관리

 

systemd관련 로그는 system-journal 가 생성하고 관리한다. system-journal는 로그인 관련 정보를 커널로 부터 받고, 사용자 프로세스 관련 전보는 syslog로 부터 받는다. 관련 정보는 메타 데이터로 /run/log/journal 디렉터리에 저장되고 재부팅시 사라진다. 로그 관리는 journalctl 이라는 명령어를 사용한다.

 

# journalctl

systemd-journald에 의해 생성된 관련 정보를 질의할 때 사용하는 명령이다.

# journalctl [option][항목]

# option

# l : 추출 가능한 모든 필드정보를 출력한다.

# r : 가장 최근 정보부터 출력한다.

# p :  syslog에 사용하는 로그 레벨을 지정한다.

# --since : 특정 날짜 이후의 정보만 출력한다.

# --until : 특정 날짜까지의 정보만 출력한다.

# 관련 로그 정보를 전부 출력한다.
$ journalctl

# sshd 관련 로그 정보를 출력한다.
$ journalctl /sbin/sshd

# 2016년 6월 20일 0시 이후 로그 정보만 출력한다.
$ journalctl --since=2016-6-20

# 2016년 6월 20일 0시부터 2016년 6월 22일 0시 이전까지의 로그 정보만 출력한다.
$ journalctl --since=2016-6-20 --until=2016-6-22

# 장치 파일인 /dev/sda의 로그 정보를 출력한다.
$ journalctl /dev/sda

 

# 로그 관리

 

/run/log/journal 디렉터리에 저장되는 정보는 휘발성이므로 지속적인 로그 관리를 하려면 /var/log 디렉터리 내에 jounal 디렉터리를 생성하고 관련 명령을 실행해야 한다. 또한 로그 파일의 환경 설정은 /etc/systemd/journald.conf에서 제어한다. 로그 파일 관련 정보는 man.journald.conf 에서 확인할 수 있다.

 


시스템 설정 주요 명령어

 

# timedatectl

 

시스템의 날짜 및 시간을 확인하거나 설정하는 명령어이다.

# timedatectl [command]

# command

# status : 시스템의 시간 및 RTC의 시간 정보를 출력한다.
# set-tiem : 시스템의 시간을 설저하는 명령어이다.
# set-timezone : 타임존을 설정하는 명령어이다.
# set-ntp : ntp 사용 여부를 지정하는 명령어로 1이면 사용, 0 이면 미사용으로 설정된다.

# 시스템의 날짜 시간을 2018년 3월 22일 오후 10시 1분 11초로 설정한다.
$ timedatectl set-time "2018-03-22 22:01:11"

# 타임존으 대한민국으로 설정한다.
$ timedatectl set-timezone Asia/Seoul

 

# hostnamectl

 

시스템에 설정된 호스트명 정보를 출력하거나 설정하는 명령이다.

 

# hostnamectl [command][설정값]

# command
# status : 시스템에 설정된 호스트명과 관련된 정보를 출력한다. command 입력이 없을 경우에 기본값으로 설정되어 있다.
# set-hostname : 호스트명을 설정할 때 사용한다.

# 호스트 명을 www로 설정한다.
$ hostnamectl set-hostname www
반응형