system management daemon
Linux 환경에서 init을 대신한 프로세스
기존 init의 특징
- UNIX에서 시작됨
- /etc/inittab 설정 파일 기반으로 작동함 => init.d
- 스크립트를 순차적으로 실행해서 다른 프로세스를 동작시킴
- init 프로세스가 최초로 실행되는 프로세스
- 모든 프로세스의 부모 프로세스로써 작동함
- init.d 란 init 프로세스가 실행되기 위한 스크립트 파일들을 나누어 저장한 장소
systemd 의 특징
- 리눅스 시스템의 모든 정보를 동일한 인터페이스로 관리(유닛)
- 윈도우의 서비스 관리자처럼 systemd에서 start/stop script를 등록하여 사용함(서비스 제어하기가 init보다 훨씬 쉬워짐)
- 프로세스의 의존성을 해결할 수 있음(A프로세스 이후에 B 프로세스가 생성되어야 한다는 규칙 등)
- 시스템 부팅 과정을 병렬 동작시켜서 효율적임
- 현재는 일부 Linux에도 systemd가 아닌 init이 남겨져 있으나, 이는 init.d를 호출하는 systemd 인터페이스
systemd 구성 (파란색 : 필수)
- systemd : init 데몬
- systemd-journald : 다른 데몬(프로세스)들의 출력(syslog, 표준, 에러 출력), 로그 저장 데몬
- systemd-logind : 사용자 로그인, 세션 등 관리 데몬
- systemd-udevd : 장치 관리자 데몬
- systemd-networkd : 네트워크 관리 데몬. DHCP 뿐만 아니라 Virtual Lan 설정까지 가능
- systemd-resolved : DNS 해석 데몬
- systemd-timesyncd : NTP로 컴퓨터 시간 동기화 데몬
- systemd-boot : UEFI 부트로더
systemd 주요 기능
서비스 관리하기
- systemctl list-units (시스템의 내부 유닛들 목록)
list-units는 기본적으로 실행중인 유닛
$ systemctl list-units
모든 유닛을 보고 싶다면
$ systemctl --all list-units
서비스 유닛만 보고 싶다면
$ systemctl -t service list-units
부팅 때 로드되지 않은 유닛까지 보고 싶다면
$ systemctl -t service list-unit-files
각 서비스들의 상태를 자세히 보려면 status 명령을 사용
$ systemctl status "unit_name"
서비스를 실행하는 방법
$ sudo systemctl start "unit_name"
서비스를 중지하는 방법
$ sudo systemctl stop "unit_name"
다시 시작하는 restart
$ sudo systemctl restart "unit_name"
설정 파일을 다시 불러오는 reload
$ sudo systemctl reload "unit_name"
시작 프로그램 등록 enable
$ sudo systemctl enable "unit_name"
Linux hostname 변경
init 보다 쉽게 호스트 이름 변경 가능
hostnamectl 이란 명령 이용
- $ hostnamectl : 호스트명, 샤시, Machine ID, Boot ID, 가상화, Kernel 정보 출력
- $ hostnamectl set-hostname "hostname"
- 빈 문자열일 경우 기본 호스트명으로 재설정
시스템 시간 동기화
systemd 의 timesyncd를 사용하여 동기화
- /etc/systemd/timesyncd.conf 파일에서 설정 가능
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.
[Time]
#NTP=
#FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
- Time 섹션 제외한 부분이 주석처리 되어있음
- NTP : NTP 서버리스트를 입력하는 부분 (서버의 주소 입력)
- FallbackNTP : NTP에서 받아오지 못했을 때의 2차 NTP 리스트
- 설정 파일 변경 후 저장하고 서비스를 시작하고 시작프로그램으로 등록하면 동기화가 됨
- # systemctl start systemd-timesyncd
- # systemctl enable systemd-timesyncd
- timedatectl 명령어로 현재 상태를 확인했을 때 NTP service: active 라고 나온다면 정상
시스템 자원 제어
- 제어할 수 있는 자원
-
- CPU
- Memory
- I/O
- the number of Processes
- Any user
- Container
- Service
-
- 필수 사항
-
- systemd v240 이후 버전
- CGroup v2 사용 설정
-
- 부팅 때 커널 옵션으로 systemd.unified_cgroup_hierarchy=1 을 넣어줌
- (systemd의 v241 milestone에 CGroup v2를 기본으로 설정하는 것이 올라와서 v241 부터는 커널 옵션이 필요없을 듯.)
-
- 자주 제어하는 리소스
-
- CPUQuota: CPU 할당비율 (%)
- 100%가 CPU의 한 코어를 전부 사용할 수 있다는 뜻이므로 CPU 코어를 최대 2개까지만 제한하고 싶다면 200%로 값을 주면 됨
- MemoryHigh: 메모리 제한 크기
- 설정된 메모리까지 사용하게 되면 시스템은 공격적으로 메모리를 회수하려함( 프로세스는 느려짐) 다만 어쩔 수 없을 경우에는 이 값을 넘어서 메모리를 할당하기도 함
- MemoryMax: 메모리 최대 사용 크기
- 값을 넘게 된다면 OOM killer가 작동하여 자체적으로 score/ filter를 하여 프로세스를 kill
- TasksMax: 최대 프로세스 수
- 설정된 프로세스 수를 넘어서 프로세스가 생성되지 않음
- CPUQuota: CPU 할당비율 (%)
-
- systemd-cgls
- 현재 실행되고 있는 서비스들과 각 계층을 확인
- systemctl status
- 각종 제한을 확인 가능
- 일시적으로만 제한하고 싶다면( 리부팅 전까지 )
- systemctl 에 --runtime 옵션을 같이 사용
- runtime 없이 쓰면 영구적 제한
- 제한 설정 되돌리기(revert)
- # systemctl revert {process_name}
- 특정 사용자의 자원 사용을 제한(UID 이용)
- # systemctl --runtime --force edit user-{UID}{process_name}
- 메모리 제한 예시
- # systemctl --runtime set-property {process_name} MemoryHigh=3G MemoryMax=4G
- 해당 프로세스에 메모리 제한 3G를 걸고, 4G 이상 할당되면 다른 프로세스 kill
Cron 스케줄링 → Timer, (calendar timer) Unit으로 관리 job Scheduling(Timer)
- timer는 이름 그대로 일정 시간이 지난 이후에 작업을 수행하도록 하는 기능
- 이전에는 cron이란 프로그램으로 crontab 설정 파일을 이용해서 스케줄링을 했음
- linux 시스템이 꺼지지 않는 한 cron service가 죽지 않음
- .timer 확장자를 가짐
- .timer 유닛을 /etc/systemd/system/ 디렉토리에 저장해야 함
- .timer 파일은 Timer 영역이 있어야 함
- condition 1 :"화요일과 목요일"
- condition 2: "10일에서 20일 사이"
- condition 3: "오후 2시"
- /etc/systemd/system/에 .timer 유닛 생성
-
- # vim /etc/systemd/system/mytimer.timer
-
- realtime timer를 만들어야 하므로 OnCalendar 옵션을 설정함
- ["요일"] "년"-"월"-"일" "시":"분":"초" [timezone] 같은 포맷으로 설정
-
- 요일은 있어도, 없어도 됨 MON-TUE-WED-THU-FRI-SAT-SUN
- timezone은 설정하지 않는다면 시스템 시간이 기본적으로 사용
- 값을 하나하나 설정하고 싶다면 ' , '(comma) 사용
- 어떠한 값이라도 매치가 되려면 ' * ' (Asterisk) 를 사용
-
- 위 조건을 만족하는 포맷
-
- Tue,Thu *-*-10..20 14:00:00
- 이 포맷을 더 편하게 쓰기 위한 OnCalendar 옵션이 존재함
- minutely, hourly, daily, monthly, weekly, yearly, quarterly, semiannually
-
- Timer에 대한 조건을 만들었다면 Timer가 실행할 서비스에 대해서도 설정해야 함
- 이러한 서비스 유닛도 사용자 정의 서비스이므로 /etc/systemd/system/ 에 저장해야 함
- /usr/bin/wall Hello World 라는 명령을 수행하는 서비스 유닛을 임시로 만듦
[Unit]
Description=my Service
[Service]
ExecStart=/usr/bin/wall Hello World
8. 위 조건을 다 갖춘 Script
[Timer]
OnCalendar=Tue,Thu *-*-10..20 14:00:00
Unit=myService.service
- 서비스를 직접 실행하면 모든 콘솔 창에 Hello World가 뜨는 것을 볼 수 있음
- 타이머를 실행함
- # systemctl start mytimer.timer
- 타이머 설정된 목록을 보고 싶다면
- # systemctl list-timers
에러, 크래시 디버깅
이벤트 기록을 systemd-journald이 함
- 프로그램이 에러가 나서 크래시되면 coredump 파일을 남길 수 있게 리눅스가 지원
- 에러 내용,파일, 시간 등을 기록
- journalctl 과 연동되어 작동함
- systemd-journald에 접근을 못한다면 자신의 coredump만 볼 수 있음
- $ coredumpctl "option" "cmd" "filter"
- option :
- -1 : 마지막 하나의 coredump 데이터만 가져옴
- -S, --since : 시작 날짜를 지정
- -U, --until : 종료 날짜를 지정
- cmd :
- list
- info
- dump( stdout 으로 출력 가능 )
- debug
현재 시스템 상태를 그대로 저장했다가 다시 사용할 수 있는 snapshot 기능 지원(systemctl snapshot 명령어를 사용)프로세스들의 추적을(얼마나 자원을 사용하는지, 잘 종료 됐는지 등등) "cgroup(control group)"이란 그룹들을 이용해 한다.유저들의 로그인을 다양하게 관리할 수 있게 해주는 'systemd-logind'란 데몬을 사용
참고링크
https://mamu2830.blogspot.com/p/blog-page_13.html
https://stackframe.tistory.com/14
'SRE > Linux Basics' 카테고리의 다른 글
cron, 크론탭 (0) | 2022.12.02 |
---|---|
cut, 문자열 자르기 (0) | 2022.12.02 |
Linux에서 세션을 종료해도 Process를 Running 하는 법, Daemonize (2) | 2022.10.25 |
리눅스 환경에서의 운영 (0) | 2022.09.01 |
Linux Command, 리눅스 명령어 사전(추가 중) (0) | 2022.09.01 |