[Linux] systemd & systemctl & rsyslog

728x90

systemd

  • systemd는 init 프로세스를 대체하는 데몬이다. (PID 1)
    • 데몬: 시스템에 의해 실행되는 프로세스
  • 프로세스 트리에서 가장 상위의 프로레스로, 모든 프로세스의 직간접 부모 데몬이다.
  • 특징
    • 부팅 시 병렬화 처리 -> 부팅 속도 향상
    • cgroup을 통한 자원관리 및 프로세스 트래킹
    • 자동 서비스 종속성 관리
      • 종속성, 의존성
        • 어떠한 프로그램을 실행하기 위해서는 이전에 또 다른 프로그램이 실행되어있어야함
        • 어떠한 프로그램을 설치하기 위해서는 사전에 다른 프로그램이 설치되어있어야함
    • 선택적 데몬 실행
    • 별도의 서비스 없이 필요시 데몬 시작
    • systemctl을 이용해 서비스 제어 관리
  • systemd 메인 프로세스는 unit 개체를 통해 시스템을 관리
  • systemd unit의 위치는 총 3곳이다
    • /user/lib/systemd/system : 생성되는 유닛들을 제외한 모든 유닛들의 원본
    • /etc/systemd/system : 부팅 시에 자동적으로 생성되는 유닛들의 위치(활성화 여부확인)
    • /run/systemd/system : 실시간으로 생성되는 유닛들에 대한 위치

현재 실행중인 시스템의 유닛 확인

$ systemctl 또는 systemctl list-units

-a or --all : 모든 유닛

-t or --type : 특정 유닛 지정

$ systemctl -a -t socket

시스템 유닛의 활성화 상태 확인

$ systemctl list-unit-files

state

  • enabled - 부팅 시에 실행됨
  • disabled - 부팅시에 실행 안됨
  • static - 부팅 시 실행되지 않고 다른 유닛에 대해서 실행될 수 있도록 준비된 상태
  • maksed - 실행되지 않고 프리징 됨
  • linux 6 에서 linux 7 로 넘어오면서 많은 서비스들이 새로 개발 됐다.
  • 여기서 방화벽을 책임지는 서비스가 6버전일 때는 iptables 라는 서비스를 썼고 7버전에서는 firewalld 라는 서비스를 사용하게 됐다.
  • iptables 과 firewalld 동시에 실행되어 있으면 충돌이 난다.
  • 7버전에서도 iptables 서비스를 사용할 수 있다. 문제는 두개의 서비스를 모두 켜놓을 경우 충돌이 나기 때문에 이 경우에 masked 상태를 사용한다.
  • disabled 는 수동 실행이 가능하지만 mask 는 수동 실행도 불가능하다.
  • 즉, 동시 실행되는 서비스들에 의해 충돌나는 경우 다른 서비스가 실행되지 못하도록 아예 막아버리는 것이 masked 이다.

유닛 제어 서브 커맨드

systemctl [sub-command] [서비스 unit 명]

  • status : 상태확인
  • start : 시작
  • stop : 종료
  • restart : 프로세스 재시작, reload 와 동일한 역할이다. reload 보다는 restart 를 권장한다.
  • reload : 프로세스 재설정, 프로세스를 종료하지 않고 재설정을 한다. 서비스 설정을 변경하고 reload 를 하면 설정이 적용된다.
  • enable : 활성화
  • disable : 비활성화
  • mask : 마스크 설정
  • unmansk : 마스크 해제

만약 해당 유닛이 시작 상태일 때 mask 상태로 변경하면 해당 서비스는 시작 상태가 유지되나 서비스가 재시작되면 mask 상태로 변경된다.

특정 서비스를 설치하고 앞으로도 계속해서 해당 서비스를 실행 설정해야 할 때

$ systemctl start xxx.service

$ systemctl enable xxx.service

또는

$ systemctl

특정 서비스 종속성 확인

systemctl list-dependencies [unit 명]

해당하는 서비스가 실행되기 위해서 필요한 다른 서비스들을 볼 수 있다.

systemctl 실습

httpd 서비스 상태 확인

$ systemctl status httpd.service

httpd 서비스 시작

$ systemctl start httpd.service

httpd 서비스 활성화

$ systemctl enable httpd.service

httpd 서비스 중지

$ systemctl stop httpd.service

httpd 서비스 비활성화

$ systemctl disabled httpd.service

httpd 서비스 잠금

$ systemctl mask httpd.service

httpd 서비스 잠금해제

$ systemctl unmask httpd.service

httpd 서비스 시작 후에 pid 확인

$ systemctl start httpd.service
$ systemctl status httpd.service | grep "Main PID"

httpd 서비스 리로드 후 pid 확인

$ systemctl reload httpd.service
$ systemctl status httpd.service | grep "Main PID"

httpd 서비스 재시작 후 pid 확인

$ systemctl restart httpd.service
$ systemctl status httpd.service | grep "Main PID"

log : 시스템에 일어나는 이벤트 들에 대한 기록

중요한 이슈 발생시에 해당 시간에 일어났었던 일에 파악하기 위한 첫번째 수단

  • 로그가 저장되는 위치 : /var/log
  • 로그를 관장하는 서비스 : systemd-journald, rsyslogd

systemd-journald : 로그를 수집하는 역활 (/run/), 메모리 영역에서 수집한다. 그래서 전원이 꺼지면 수집한 로그들이 전부 사라진다.
rsyslogd : 로그를 저장하는 역활 (/var/)

rsyslog 서비스

수집된 로그들을 저장하는 역할을 한다.

  • /var/log/messages : 대부분의 로그기록(인증, 메일, 정기적 예약, 부팅, 디버그를 제외한 로그가 저장)
  • /var/log/secure : 인증에 관련된 로그
  • /var/log/maillog : 메일에 관련된 로그
  • /var/log/cron : 반복적인 예약에 관련된 로그
  • /var/log/boot.log : 부팅에 관련된 로그

facility(기능).priority(우선순위) 로 조합이 되서 로그 파일이 만들어진다.

아래와 같이 작성할 수 있다.

authpriv.err

authpriv.=notice

facility(기능)

  • authpriv : 인증
  • auth,security : login
  • cron : cron,at 과 같은 스케쥴링
  • daemon : telnet,ftp 와 같은 데몬서비스
  • kern : 커널
  • mail : 메일
  • local1-8 : 부팅
  • lpr : 프린트
  • mark : syslog에 의해 만들어지는 날짜유형
  • user : 사용자

priority(우선순위)

메시지에 대한 위험도를 나타낸다.

  • 0:emerg
  • 1:alert
  • 2:critical
  • 3:error
  • 4:warning
  • 5:notice
  • 6:info
  • 7:debug

rsyslog.conf 설정 변경후 반영

vi /etc/rsyslog.conf 로 들어온 후에 /RULE 로 RULE 에 대한 항목들을 검색할 수 있다.

$ vi /etc/rsyslog.conf
authpriv.* /var/log/secure1

위와 같이 작성한다.

rsyslog 를 restart 해주면 설정이 반영된다.

$ systemctl restart rsyslog.service

그 후에 logger -p authpriv.* “test” 이런식으로 로그를 찍으면 /var/log/secure1 에 로그가 남는다.

로그 발생시키기

$ logger -p [기능.우선순위] “메시지”

$ logger -p authpriv.* “test”

$ tail -1 /var/log/secure

이러면 해당하는 test 가 로그로 남겨진 것을 볼 수 있다.

이런식으로 logger -p [기능.우선순위] “메시지” 이런식으로 로그를 남길 수 있다.

실시간 로그 모니터링

$ tail -f /var/log/로그파일

로그 메세지 발생

logger -p [기능.우선순위] "메세지"

로그 파일 저장 체계

로그 순환(locate)

  1. 로그가 일정기간이 지나면 해당 로그 파일을 압축해서 보관 한다.
  2. 일정 기간 후에 압축했었던 로그 파일을 삭제 한다.

systemd-journald 서비스

rsyslog 를 통해서 로그들을 저장하고 있기는 하지만 모든 로그를 확인할 수 있는 것은 아니다.

systemd-journald 서비스에서 저장하는 로그를 볼 수 있다. 메모리 영역에서 로그들을 수집한다. 메모리 영역에서 로그들을 기록하기 때문에 전원이 꺼지면 대부분의 로그 기록이 사라진다.

$ journalctl
옵션은 아래와 같다.

  • -n 숫자 : 최근 내역에서 숫자 만큼 출력, -n 10 이면 가장 최근 10개 로그만 출력한다.
  • -p 우선순위 : 해당 우선순위 이상으로 출력, -p alert 이면 alert 이상의 우선순위를 갖는 로그만 출력하는 식(alert + emerg)
  • -f : 실시간으로 모니터링
  • --since yyyy-mm-dd : 해당 날짜부터 현재까지 출력
  • --since yyyy-mm-dd --until yyyy-mm-dd : since 부터 until까지 출력

journal 영구 저장

/run/log/journal 에 로그 파일이 저장되어 있으나 전원이 꺼지면 사라진다.

영구 저장 시 저장 용량 설정이 존재

전체 파일 시스템의 10% 을 넘어서면 안되고, 남아 있는 공간의 15% 를 넘어서면 안된다.

아래와 같은 방식으로 영구 journal 파일을 영구 저장 시킬 수 있다.

$ mkdir /var/log/journal
$ chmod g+s /var/log/journal
$ chown :systemd-journal /var/log/journal
$ systemctl restart systemd-journald.service

log 실습 1

# rsyslog.conf 파일을 수정해서 cron.err 이상 내용만 
# /var/log/cron1 파일에 저장되도록 설정하시오.

$ vi /etc/rsyslog.conf
cron.err     /var/log/cron1  
$ systemctl restart rsyslog.service

#logger 명령어를 통해서 [cron.info](http://cron.info/) => cronlog1 와 cron.crit => cronlog2 의 메세지를 발생시켜서 
# /var/log/cron 파일과 /var/log/cron1 파일을 확인해보시오.

$ logger -p cron.info "cronlog1"
$ logger -p cron.crit "cronlog2"
$ tail -2 /var/log/cron

# journal 내용을 영구 저장하도록 설정하시오.

$ mkdir /var/log/journal
$ chown :systemd-journal /var/log/journal
$ chmod g+s /var/log/journal
$ systemctl restart systemd-journald.service

systemctl 실습

# 유닛 실행(active) 상태를 확인해보시오.

$ systemctl

# 서비스 유닛의 실행 상태를 확인해보시오.

$ systemctl -t(--type) service

# not-found 나 inactive 인 서비스 유닛의 실행 상태를 확인해보시오.

$ systemctl -t service -a(--all)

# 유닛의 활성화(enable) 상태를 확인해보시오.

$ systemctl list-unit-files (-t service)

# httpd, sshd 서비스의 상태를 확인해보시오.

$ systemctl stauts httpd
$ systemctl stauts sshd

# httpd 서비스를 시작하고 활성화 시키시오.

$ systemctl start httpd
$ systemctl enable httpd

# sshd 서비스를 비활성화 시키시오.

$ systemctl disable httpd

# httpd 서비스를 중지시키고 비활성화 시키시오. 그리고 sshd 서비스를 활성화 시키시오.

$ systemctl stop httpd
$ systemctl disable httpd
$ systemctl enable sshd

# httpd 서비스를 마스크 상태로 만드시오.

$ systemctl mask httpd

# httpd 서비스를 시작해보시오.

$ systemctl start httpd
에러 : 현재 마스크 상태입니다.

# httpd 서비스의 마스크 상태를 해제하시오.

$ systemctl unmask httpd

# sshd 서비스의 상태를 확인하고 리로드와 재시작하면서 pid 를 확인해보시오.

$ systemctl status sshd
$ systemctl reload sshd
$ systemctl status sshd
# pid 유지
$ systemctl restart sshd
$ systemctl status sshd
# pid 달라짐

# sshd의 의존성을 확인해보시오.

$ systemctl list-dependencies sshd

log 실습 2


# rsyslog 를 수정해서 인증에 대한 로그가 crit 이상으로 발생될때에 
# /var/log/securetest 파일에 남도록 설정하시오.

$ vi /etc/rsyslog.conf

/RULE

authpriv.crit           /var/log/securetest

:wq

$ systemctl restart rsyslog.service

# logger 명령어로 인증에 대한 기능으로 error 와 critcal 우선 순위로 
# 각각 auth.error 와 auth.critcal 메세지를 남기고 확인하시오.

$ logger -p authpriv.err "auth.error"
$ logger -p authpriv.crit "auth.critical"

$ tail -2 /var/log/secure 

auth.error
auth.critical

$ tail -2 /var/log/securetest

auth.critical

# journal 에서 notice 우선순위 이상과 err 이상의 내용만 확인해보시오.

$ journalctl -p notice

$ journalctl -p err

# journal 의 내용이 /var/log 안에 저장이 되도록 설정하시오.

$ mkdir /var/log/journal
$ chmod g+s /var/log/journal
$ chown :systemd-journal /var/log/journal

$ systemctl restart systemd-journald.service
728x90