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"
-
- list-units는 기본적으로 실행중인 유닛
Linux hostname 변경
init 보다 쉽게 호스트 이름 변경 가능
hostnamectl 이란 명령 이용
- $ hostnamectl : 호스트명, 샤시, Machine ID, Boot ID, 가상화, Kernel 정보 출력
- $ hostnamectl set-hostname "hostname"
- 빈 문자열일 경우 기본 호스트명으로 재설정
시스템 시간 동기화
systemd 의 timesyncd를 사용하여 동기화
- /etc/systemd/timesyncd.conf 파일에서 설정 가능
- /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 라는 명령을 수행하는 서비스 유닛을 임시로 만듦
-
/etc/systemd/system/myService
[Unit] Description=my Service [Service] ExecStart=/usr/bin/wall Hello World
-
- 위 조건을 다 갖춘 Script
-
/etc/systemd/system/mytimer.timer\
[Timer] OnCalendar=Tue,Thu *-*-10..20 14:00:00 Unit=myService.service
-
- 서비스를 직접 실행하면 모든 콘솔 창에 Hello World가 뜨는 것을 볼 수 있음
- 타이머를 실행함
- # systemctl start mytimer.timer
- 타이머 설정된 목록을 보고 싶다면
- # systemctl list-timers
- /etc/systemd/system/에 .timer 유닛 생성
- 예시
에러, 크래시 디버깅
이벤트 기록을 systemd-journald이 함
- 프로그램이 에러가 나서 크래시되면 coredump 파일을 남길 수 있게 리눅스가 지원
- 에러 내용,파일, 시간 등을 기록
- journalctl 과 연동되어 작동함
- systemd-journald에 접근을 못한다면 자신의 coredump만 볼 수 있음
- $ coredumpctl "option" "cmd" "filter"
- option :
- -1 : 마지막 하나의 coredump 데이터만 가져옴
- -S, --since : 시작 날짜를 지정
- -U, --until : 종료 날짜를 지정
- cmd :
- list
- info
- dump( stdout 으로 출력 가능 )
- debug
- option :
현재 시스템 상태를 그대로 저장했다가 다시 사용할 수 있는 snapshot 기능 지원(systemctl snapshot 명령어를 사용)프로세스들의 추적을(얼마나 자원을 사용하는지, 잘 종료 됐는지 등등) "cgroup(control group)"이란 그룹들을 이용해 한다.유저들의 로그인을 다양하게 관리할 수 있게 해주는 'systemd-logind'란 데몬을 사용
출처
'Linux' 카테고리의 다른 글
tar 이용하기 (1) | 2023.11.26 |
---|---|
Service 생성하기 (0) | 2023.11.26 |
crontab 이용하기 (1) | 2023.11.26 |
chown, chmod 이용하기 (0) | 2023.11.26 |
rsync 이용하기 (1) | 2023.11.26 |