power / knowledge
NUT 서비스 자동 시작과 LISTEN 주소 때문에 겪은 문제
UPS 감시는 부팅할 때 자동으로 올라와야 의미가 있다. 정전으로 한 번 꺼졌다 켜졌는데 NUT이 안 떠 있으면 다음 정전에 그대로 당한다.
무엇을 enable할지 찾기
$ systemctl list-units --type=service | grep -E 'nut|ups'
nut-driver@apc.service loaded active running Network UPS Tools - device driver for NUT device 'apc'
nut-monitor.service loaded active running Network UPS Tools - power device monitor and shutdown controller
nut-server.service loaded active running Network UPS Tools - power devices information server
드라이버 서비스는 nut-driver@ 뒤에 UPS 이름이 붙는 형태다. ups.conf 에서 [apc] 라고 지었으니 nut-driver@apc 가 된다.
$ systemctl enable nut-driver@apc.service
$ systemctl enable nut-server
$ systemctl enable nut-monitor
감시만 하는 쪽은 하나면 된다.
$ systemctl enable nut-client
순서가 있다. 드라이버가 먼저 떠야 upsd 가 붙을 UPS가 생기고, upsd 가 떠야 upsmon 이 물어볼 상대가 생긴다.
LISTEN을 IP로 제한했더니 부팅 때 실패했다
upsd.conf 에서 어느 주소로 들을지 정한다. 문서를 보면 0.0.0.0 은 비추천이고 필요한 주소만 여는 걸 권한다.
# 이렇게 하고 싶었다
LISTEN 127.0.0.1 3493
LISTEN <서버의 내부 IP> 3493
그런데 이렇게 두니 부팅할 때 nut-server 가 뜨지 않았다. 손으로 다시 시작하면 잘 된다.
원인은 순서였다. upsd 가 시작하는 시점에 아직 DHCP로 IP를 받기 전이라 bind할 주소가 없다. 없는 주소에 LISTEN하라고 하니 그대로 죽는다. 수동으로 다시 시작할 때는 이미 IP가 있으니 문제가 없었다.
LISTEN 0.0.0.0 3493
결국 0.0.0.0 으로 뒀다. 부팅 시점에 IP가 무엇이든 상관없이 뜬다.
주소로 막는 대신 방화벽에서 3493 포트를 내부망으로만 열어두는 편이 낫다고 본다. systemd 유닛에 네트워크 대기 조건을 거는 방법도 있겠지만, 이쪽이 단순하다.