Linux

systemd 훑어보기

일단해볼게 2023. 11. 26. 20:33

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

 

 

  • 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.  
          2. # vim /etc/systemd/system/mytimer.timer
        2. realtime timer를 만들어야 하므로 OnCalendar 옵션을 설정함
        3. ["요일"] "년"-"월"-"일" "시":"분":"초" [timezone] 같은 포맷으로 설정
          1. 요일은 있어도, 없어도 됨 MON-TUE-WED-THU-FRI-SAT-SUN
          2. timezone은 설정하지 않는다면 시스템 시간이 기본적으로 사용
          3. 값을 하나하나 설정하고 싶다면 ' , '(comma) 사용
          4. 어떠한 값이라도 매치가 되려면 ' * ' (Asterisk) 를 사용
        4. 위 조건을 만족하는 포맷
          1. Tue,Thu *-*-10..20 14:00:00
          2. 이 포맷을 더 편하게 쓰기 위한 OnCalendar 옵션이 존재함
            1. minutely, hourly, daily, monthly, weekly, yearly, quarterly, semiannually
        5. Timer에 대한 조건을 만들었다면 Timer가 실행할 서비스에 대해서도 설정해야 함
        6. 이러한 서비스 유닛도 사용자 정의 서비스이므로 /etc/systemd/system/ 에 저장해야 함
        7. /usr/bin/wall Hello World 라는 명령을 수행하는 서비스 유닛을 임시로 만듦
          1. /etc/systemd/system/myService
            [Unit]
            Description=my Service
            
            [Service]
            ExecStart=/usr/bin/wall Hello World​​
             
        8. 위 조건을 다 갖춘 Script
          1. /etc/systemd/system/mytimer.timer\
            [Timer]
            OnCalendar=Tue,Thu *-*-10..20 14:00:00
            Unit=myService.service
             
             
        9. 서비스를 직접 실행하면 모든 콘솔 창에 Hello World가 뜨는 것을 볼 수 있음
        10. 타이머를 실행함
          1. #  systemctl start mytimer.timer
        11. 타이머 설정된 목록을 보고 싶다면
          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

'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