systemd initd
initd systemd
# 현상
ubuntu 14.04에서 systemctl 설치 후에
systemctl enable {path}
로 서비스를 등록해줘도 제대로 등록되지 않고, start/status를 해도 resource not found로 파일을 제대로 찾지 못했다.
```
systemctl list-units
```
# 원인
이유는 14.04 initd, 16.04 systemd가 default 이기 때문이었다.
process pid 1번 process인 init가 systemd로 바뀐거고
제대로 동작하도록 하려면 grub을 수정해서 init이 systemd로 동작하도록 변경해주어야한다
/etc/default/grub 파일에 아래와 같이 init=/lib/systemd/systemd 를 추가해주고
```
GRUB_CMDLINE_LINUX="init=/lib/systemd/systemd ......"
```
```
update-grub
reboot
```
* 별다른 문제 없이 떠야 정상이겠지만 openstack vm이라면 systemd용 cloud-init 이 존재하지 않아서 필요한 네트워크 세팅등을 끝내지 못해 bootup 에 실패할 수 있다
# 해결
14.04에서 init=systemd로 잡고 올려서 쓰거나 그냥 16,04를 쓴다
# 더 찾아보기
## initd
initd synchronous, blocking
## upstart
upstart event-driven, asnynchronous
perfect backward compatibility with sysvinit
ubuntu 16.04 deprecated
## systemd
### 추세
최근 linux 배포판 대부분(cetnos >= 7 , ubuntu >= 16.04)은 systemd를 채택하고 있음
유닉스 철학(https://ko.wikipedia.org/wiki/유닉스_철학)을 위반했다는 비평을 받기도함.
특히 1번 '각 프로그램이 하나의 일을 잘할 수 있게 만들것'
### 특징
systemd로 바꾸게 되면 기존의 sysVinit(/sbin/init, /etc/init.d/*, /etc/rc*.d) 데몬 관리용 스크립트들과 배포판별로 제공하던 런레벨 관리자도 사용하지 않음
systemd는 dbus(message bus system, interprocessing communication)를 이용해서 병렬적으로 실행하도록함
journalctl를 이용해 데몬 출력/로그 관리
### initd compatibility
TODO
### 유용할만한 command (몰랐던거 위주로)
```
# 부팅시 자동실행/비활성화
systemctl enable/disable
# 서비스 의존성, order
systemctl list-dependencies
# 실패한 units
systemctl --failed
# -H 이용한 remote 조회(비번을 알거나 key가 있어야 동작함) 굳이 이렇게 해야되나싶다 ㅎㅎ
systemctl status sshd -H root@{ip}
# 시스템 부팅시간 분석
systemd-analyze # start up (kernel + initrd + userspace) 토탈 시간
systemd-analyze blame # 동작 시간 오래걸린거 부터 보임
systemd-analyze plot # svg파일 만들어준다. 신기..
# journalctl
journalctl
journalctl -b # 부팅 로그
journalctl -f # tailing
journalctl --since=today # 오늘 로그
```