systemd

정승균·2020년 12월 16일
0

리눅스

목록 보기
17/29
post-thumbnail

Ⅰ. systemd


  • 시스템 설정을 유닛 단위로 통합 관리
unit type설명
*.device시스템 장치
*.mount파일 시스템 마운트 포인트
*.automount파일 시스템 오토 마운트 포인트
*.path시스템에서 감시하는 경로
*.service시스템 서비스(daemon process)
*.slice다른 유닛들에 사용되는 일부분
*.socket시스템에서 생성하는 소켓
*.swap스왑 공간
*.target유닛의 논리적 그룹
*.timer타이머
*.snapshot유저가 설정한 target

Ⅱ. Unit 관리


1. 유닛 리스트 보기

  • % systemctl [option]
    • default : loaded unit 리스트 출력
    • -t unittype : unittype에 해당되는 유닛만 출력
    • -a : load되지 않은 유닛들도 출력
    • --state==STATE : 조건을 지정하여 출력
    • -l : long-format으로 보기
jsg@jsg-ubuntu:~$ systemctl

jsg@jsg-ubuntu:~$ systemctl -t service -a
  UNIT                       LOAD      ACTIVE   SUB     DESCRIPTION
  accounts-daemon.service    loaded    active   running Accounts Service
  acpid.service              loaded    active   running ACPI event daemon
  alsa-restore.service       loaded    active   exited  Save/Restore Sound Card State
  ...
LOADACTIVESUB
해당 유닛을 systemd가 인식했는지유닛의 현재 상태ACTIVE의 low level 작동
- loaded : 메모리가 인식한 유닛
- not-found : 유닛을 찾지 못함
- active : 동작중인 유닛
- in-active : 동작하지 않은 유닛
- running : 프로세스가 작동 중
- excited : 프로세스가 성공의 종료 값을 리턴하고 종료됨
- dead : 프로세스가 알 수 없는 상태로 종료됨
- waiting : 다른 유닛의 이벤트를 기다리는 중
- listening : 소켓이 리스닝 상태임
- mounted : 파일 시스템이 마운트 됨
  • 기본적으로 less 창으로 결과값을 띄우지만 그게 싫을 경우,
    $ export SYSTEMD_PAGER= 로 환경변수 설정

2. 유닛 정보 출력

  • $ systemctl status [name] ... name값이 없으면 시스템 정보를 출력
jsg@jsg-ubuntu:~$ systemctl status
jsg-ubuntu
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: 수 2020-12-16 17:05:46 KST; 5h 37min ago
   CGroup: /
           ├─user.slice
           │ └─user-1000.slice
           │   ├─user@1000.service
           │   │ └─init.scope
           │   │   ├─1620 /lib/systemd/systemd --user
           │   │   └─1621 (sd-pam)         
           │   └─session-c2.scope
           │     ├─1259 lightdm --session-child 12 19
           │     ├─1637 /usr/bin/gnome-keyring-daemon --daemonize --login
           │     ├─1639 /sbin/upstart --user
           │     ├─1721 upstart-udev-bridge --daemon --user
           ...
jsg@jsg-ubuntu:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-12-16 23:04:15 KST; 12s ago
 Main PID: 5670 (nginx)
   CGroup: /system.slice/nginx.service
           ├─5670 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─5671 nginx: worker process
           └─5672 nginx: worker process

Dec 16 23:04:15 jsg-ubuntu systemd[1]: Starting A high performance web server and a reverse proxy server...
Dec 16 23:04:15 jsg-ubuntu systemd[1]: Started A high performance web server and a reverse proxy server.
  • Loaded : loaded (유닛 설정 파일; 부팅시 실행 여부; 설치시 부팅 실행 여부 기본값)

3. 유닛 상태 확인

  • $ systemctl is-active name : Active 상태인지 확인. Active면 exit code 0을 반환
jsg@jsg-ubuntu:~$ systemctl is-active nginx
active
jsg@jsg-ubuntu:~$ echo $?
0
  • $ systemctl is-failed name : 구동에 실패했는지 확인. 실패면 exit code 0 반환
jsg@jsg-ubuntu:~$ systemctl is-failed nginx
active
jsg@jsg-ubuntu:~$ echo $?
1

4. 유닛 시작 / 중지

  • # systemctl stop name : 중지
root@jsg-ubuntu:~# systemctl stop nginx
root@jsg-ubuntu:~# systemctl is-active nginx
inactive
  • # systemctl start name : 시작
root@jsg-ubuntu:~# systemctl start nginx
root@jsg-ubuntu:~# systemctl is-active nginx
active
  • # systemctl reset-failed : failed된 유닛 재실행

5. 유닛 죽이기

  • # systemctl kill name --signal=SIGNAL
root@jsg-ubuntu:~# systemctl kill nginx --signal=SIGABRT
root@jsg-ubuntu:~# systemctl is-active nginx
failed

6. 유닛 enable 설정

  • # systemctl is-enabled name : enable인지 확인. enable이면 exit code 0 반환
  • # systemctl enable name : enable 설정
  • # systemctl enable --now name : enable 설정하고 start시킴
  • # systemctl disable name : enable 해제

Ⅲ. target 관리


1. target 리스트 보기

  • $ systemctl -t target : -a 옵션으로 inactive한 target도 볼수 있음

  • 중요한 target으로는 multi-user.target(텍스트 모드) 와 graphical.target(X 윈도 모드)

jsg@jsg-ubuntu:~$ systemctl -t target
UNIT                   LOAD   ACTIVE SUB    DESCRIPTION
basic.target           loaded active active Basic System
cryptsetup.target      loaded active active Encrypted Volumes
getty.target           loaded active active Login Prompts
graphical.target       loaded active active Graphical Interface
local-fs-pre.target    loaded active active Local File Systems (Pre)
local-fs.target        loaded active active Local File Systems
multi-user.target      loaded active active Multi-User System
network-online.target  loaded active active Network is Online
network-pre.target     loaded active active Network (Pre)
...

2. target 변경

  • # systemctl isolate target_name

3. target 기본값 변경

  • $ systemctl get-default : 기본값 보기
jsg@jsg-ubuntu:~$ systemctl get-default
graphical.target
  • # systemctl set-default target_name : 기본값 변경
root@jsg-ubuntu:~# systemctl set-default multi-user
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/multi-user.target.
root@jsg-ubuntu:~# systemctl get-default 
multi-user.target

Ⅳ. 구동 분석


1. 부팅할때 걸린 시간 확인

  • $ systemcd-analyze
jsg@jsg-ubuntu:~$ systemd-analyze
Startup finished in 3.676s (kernel) + 8.523s (userspace) = 12.200s

2. 서비스별 걸린 시간 확인

  • $ systemd-analyze blame
jsg@jsg-ubuntu:~$ systemd-analyze blame
          5.519s NetworkManager-wait-online.service
          3.352s fwupd.service
          1.385s dev-sda1.device
           775ms apparmor.service
           395ms networking.service
	     ...

3. Critical path 형식으로 보기

  • $ systemd-analyze critical-chain
jsg@jsg-ubuntu:~$ systemd-analyze critical-chain 

graphical.target @6h 48min 16.386s
└─multi-user.target @8.366s
  └─getty.target @8.366s
    └─getty@tty1.service @8.363s
      └─rc-local.service @8.339s +14ms
        └─network-online.target @8.336s
          └─NetworkManager-wait-online.service @2.816s +5.519s
            └─NetworkManager.service @2.494s +321ms
              └─dbus.service @2.355s
                └─basic.target @2.349s
		    ...

4. svg파일로 보기

  • $ systemd-analyze plot > svgfile.svg

5. 로그 레벨 변경

  • $ systemctl -p LogLevel show : 현재 로그 레벨
jsg@jsg-ubuntu:~$ systemctl -p LogLevel show
LogLevel=info
  • # systemd-analyze set-log-level <emerg|alert|crit|err|warning|notice|info|debug> : 변경
root@jsg-ubuntu:~# systemd-analyze  set-log-level warning
root@jsg-ubuntu:~# systemctl -p LogLevel show
LogLevel=warning

Ⅴ. journal


1. 로그 보기

  • # journalctl : /run/log/journal
-- Logs begin at 수 2020-12-16 17:05:47 KST, end at 목 2020-12-17 01:17:01 KST. --
12월 16 17:05:47 jsg-ubuntu systemd-journald[323]: Runtime journal (/run/log/journal/) is 4.9M, max 39.2M, 34.3M free.
12월 16 17:05:47 jsg-ubuntu kernel: Linux version 4.15.0-112-generic (buildd@lcy01-amd64-021) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)) #113~16.04.1
12월 16 17:05:47 jsg-ubuntu kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.15.0-112-generic root=UUID=e65ee146-aea7-418b-8946-8993e297d5a6 ro quiet splash
12월 16 17:05:47 jsg-ubuntu kernel: KERNEL supported cpus:
12월 16 17:05:47 jsg-ubuntu kernel:   Intel GenuineIntel
12월 16 17:05:47 jsg-ubuntu kernel:   AMD AuthenticAMD
12월 16 17:05:47 jsg-ubuntu kernel:   Centaur CentaurHauls
12월 16 17:05:47 jsg-ubuntu kernel: Disabled fast string operations
...

2. 옵션

  • -n : 최근 n개
  • -f : 실시간으로 출력
  • -u unit : 특정 유닛에 관한 것만 출력
  • -p loglevel : 특정 로그 레벨만 출력
  • -k : 커널 메세지만 출력
  • -o format : 지정한 포맷으로 출력
  • --since -t<m/h> : 최근 t분/시간 이내의 로그만 출력
  • -r : 역순으로 나열
root@jsg-ubuntu:~# journalctl --since -3h -o short -ru nginx -p warning
-- Logs begin at 수 2020-12-16 17:05:47 KST, end at 목 2020-12-17 01:17:01 KST. --
12월 16 23:28:58 jsg-ubuntu systemd[1]: nginx.service: Failed with result 'core-dump'.
12월 16 23:22:57 jsg-ubuntu systemd[1]: nginx.service: Failed with result 'core-dump'.

0개의 댓글