SRE/Linux Basics

Linux 환경에서 init을 대신한 프로세스, systemd

게임이 더 좋아 2022. 11. 18. 17:57
반응형
728x170

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 부터는 커널 옵션이 필요없을 듯.)

 

  • 자주 제어하는 리소스
      1. CPUQuota: CPU 할당비율 (%)
        • 100%가 CPU의 한 코어를 전부 사용할 수 있다는 뜻이므로 CPU 코어를 최대 2개까지만 제한하고 싶다면 200%로 값을 주면 됨
      2. MemoryHigh: 메모리 제한 크기
        • 설정된 메모리까지 사용하게 되면 시스템은 공격적으로 메모리를 회수하려함( 프로세스는 느려짐) 다만 어쩔 수 없을 경우에는 이 값을 넘어서 메모리를 할당하기도 함
      3. MemoryMax: 메모리 최대 사용 크기
        • 값을 넘게 된다면 OOM killer가 작동하여 자체적으로 score/ filter를 하여 프로세스를 kill
      4. TasksMax: 최대 프로세스 수
        • 설정된 프로세스 수를 넘어서 프로세스가 생성되지 않음



  • 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시"
  1. /etc/systemd/system/에 .timer 유닛 생성
      1. # vim /etc/systemd/system/mytimer.timer
  2. realtime timer를 만들어야 하므로 OnCalendar 옵션을 설정함
  3. ["요일"] "년"-"월"-"일" "시":"분":"초" [timezone] 같은 포맷으로 설정
      • 요일은 있어도, 없어도 됨 MON-TUE-WED-THU-FRI-SAT-SUN
      • timezone은 설정하지 않는다면 시스템 시간이 기본적으로 사용
      • 값을 하나하나 설정하고 싶다면 ' , '(comma) 사용
      • 어떠한 값이라도 매치가 되려면 ' * ' (Asterisk) 를 사용
  4. 위 조건을 만족하는 포맷
      • Tue,Thu *-*-10..20 14:00:00
      • 이 포맷을 더 편하게 쓰기 위한 OnCalendar 옵션이 존재함
      • minutely, hourly, daily, monthly, weekly, yearly, quarterly, semiannually
  5. Timer에 대한 조건을 만들었다면 Timer가 실행할 서비스에 대해서도 설정해야 함
  6. 이러한 서비스 유닛도 사용자 정의 서비스이므로 /etc/systemd/system/ 에 저장해야 함
  7. /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

 

  1. 서비스를 직접 실행하면 모든 콘솔 창에 Hello World가 뜨는 것을 볼 수 있음
  2. 타이머를 실행함
    1. #  systemctl start mytimer.timer
  3. 타이머 설정된 목록을 보고 싶다면
    1. # 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

 

728x90
반응형
그리드형