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)
- 로그가 일정기간이 지나면 해당 로그 파일을 압축해서 보관 한다.
- 일정 기간 후에 압축했었던 로그 파일을 삭제 한다.
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