개요
안정적인 라즈베리 파이의 경우도, 홈 서버로 운영하다 보면 예기치 못한 오류로 서비스가 중단되는 경우가 있습니다. 이 경우 가장 손쉬운 해결방법은 장치를 재부팅하는 것입니다. 하지만 언제 발생할지 모르는 장애를 우리가 지켜보고 있는 것은 비효율적입니다.
이번 포스트에서는 우리 대신 이러한 오류시 복구 작업이 자동으로 수행되도록 라즈베리 파이를 설정하겠습니다. 이를 위해서 라즈베리파이의 Watchdog 모듈을 설정해보겠습니다.
Watchdog Timer는 하드웨어 타이머로 메인 서비스가 멈추는 것을 감지해 시스템을 자동으로 리셋시키는 장치입니다. 즉, 어떠한 이유로 라즈베리파이가 멈추면 동작하여 시스템을 재부팅합니다.
경고 또는 일러두기
잘못된 Watchdog Timer 설정은 다음과 같은 문제를 야기할 수 있습니다.
- 시스템의 무한 재부팅
- 하드웨어 리셋에 따른 파일 손상(File corruption)
- 예상치 못한 재부팅
Watchdog Module 설치
Watchdog Module 은 사전에 설정한 시간이 경과하면 시스템을 재부팅시키는 하드웨어입니다.
라즈베리파이에 장착되어 있는 하드웨어 모듈을 활성화합니다.
최신 버전의 라즈비언은 이미 모듈이 설치 및 활성화되어 있으므로, 우선 Watchdog 모듈의 상태를 확인합니다.
$ ls -al /dev/watchdog*
crw------- 1 root root 10, 130 Nov 3 2016 /dev/watchdog
crw------- 1 root root 252, 0 Nov 3 2016 /dev/watchdog0
위와 같이 /dev/watchdog
이 보인다면 라즈베리파이의 Watchdog 모듈이 정상 동작하고 있는 것입니다.
만약 해당 내용이 보이지 않는다면 다음 명령으로 Watchdog 모듈을 로드합니다.
$ sudo modprobe bcm2835_wdt
$ echo "bcm2835_wdt" | sudo tee -a /etc/modules
첫 번째 줄은 현재 세션을 위하여 Watchdog 커널 모듈을 로드하는 것이며, 두 번째 줄은 (다음 재부팅 시) Watchdog 모듈을 자동으로 로드하도록 /etc/modules
파일의 가장 하단에 bcm2835_wdt
항목을 추가하는 것입니다.
다시 ls -al /dev/watchdog*
를 입력하여 상태를 확인합니다.
Watchdog 데몬 설치
Watchdog 데몬은 앞서 활성화한 하드웨어를 주기적으로 Refresh 하는 소프트웨어입니다. 이 소프트웨어에서 Refresh를 하지 않으면 하드웨어가 시스템을 재부팅하게 됩니다.
다음 명령으로 watchdog 데몬을 설치한 후, 재부팅합니다.
$ sudo apt install watchdog
$ sudo update-rc.d watchdog defaults
설치한 데몬의 상태를 확인합니다.
$ systemctl status watchdog
pi@raspberrypi:~ $ systemctl status watchdog
● watchdog.service - watchdog daemon
Loaded: loaded (/lib/systemd/system/watchdog.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2020-01-03 10:55:25 KST; 1min 48s ago
Process: 862 ExecStartPre=/bin/sh -c [ -z "${watchdog_module}" ] || [ "${watchdog_module}" = "none" ] || /sbin/modprobe $watchdog_module (code=exited, status=1/FAILURE)
1월 03 10:55:25 raspberrypi systemd[1]: Starting watchdog daemon...
1월 03 10:55:25 raspberrypi sh[862]: modprobe: FATAL: Module softdog not found in directory /lib/modules/4.19.66-v7+
1월 03 10:55:25 raspberrypi systemd[1]: watchdog.service: Control process exited, code=exited status=1
1월 03 10:55:25 raspberrypi systemd[1]: Failed to start watchdog daemon.
1월 03 10:55:25 raspberrypi systemd[1]: watchdog.service: Unit entered failed state.
1월 03 10:55:25 raspberrypi systemd[1]: watchdog.service: Triggering OnFailure= dependencies.
1월 03 10:55:25 raspberrypi systemd[1]: watchdog.service: Failed with result 'exit-code'.
제 경우 softdog
가 없어 failed
상태가 되었으며 정상 동작을 하지 않는 것으로 보입니다.
※
softdog
는 하드웨어 Watchdog이 없는 경우 사용할 수 있도록 데비안 계열 리눅스에서 제공하는 소프트웨어 Watchdog 모듈입니다. 라즈베리파이는 하드웨어가 있으므로 라즈비언의 경우 이 모듈을 기본으로 제공하지 않습니다. 만약 이를 사용하고자 한다면 커널을 새로 컴파일해야 사용할 수 있습니다.
/etc/default/watchdog
의 내용을 다음과 같이 편집합니다.
watchdog_options="-v -b" # 아래참고의 watchdog_options 링크의 내용
watchdog_module="bcm2835_wdt" # softdog -> bcm2835_wdt
재부팅 후 상태를 다시 확인합니다.
Last login: Fri Jan 3 11:14:26 2020
pi@raspberrypi:~ $ systemctl status watchdog
● watchdog.service - watchdog daemon
Loaded: loaded (/lib/systemd/system/watchdog.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-01-03 11:14:29 KST; 4min 3s ago
Process: 887 ExecStart=/bin/sh -c [ $run_watchdog != 1 ] || exec /usr/sbin/watchdog $watchdog_options (code=exited, status=0/SUCCESS)
Process: 881 ExecStartPre=/bin/sh -c [ -z "${watchdog_module}" ] || [ "${watchdog_module}" = "none" ] || /sbin/modprobe $watchdog_module (code
Main PID: 890 (watchdog)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/watchdog.service
└─890 /usr/sbin/watchdog softboot
1월 03 11:14:29 raspberrypi watchdog[890]: interface: no interface to check
1월 03 11:14:29 raspberrypi watchdog[890]: temperature: no sensors to check
1월 03 11:14:29 raspberrypi watchdog[890]: no test binary files
1월 03 11:14:29 raspberrypi watchdog[890]: no repair binary files
1월 03 11:14:29 raspberrypi watchdog[890]: error retry time-out = 60 seconds
1월 03 11:14:29 raspberrypi watchdog[890]: repair attempts = 1
1월 03 11:14:29 raspberrypi systemd[1]: Started watchdog daemon.
1월 03 11:14:29 raspberrypi watchdog[890]: alive=/dev/watchdog heartbeat=[none] to=root no_act=no force=no
1월 03 11:14:29 raspberrypi watchdog[890]: watchdog now set to 14 seconds
1월 03 11:14:29 raspberrypi watchdog[890]: hardware watchdog identity: Broadcom BCM2835 Watchdog timer
위 값은 기본값으로 설정되어 동작하는 것으로 이대로 사용하더라도 무방하겠지만, 각자 필요에 맞추어 동작을 제어할 수 있습니다.
/etc/watchdog.conf
파일의 값을 수정하여 watchdog의 동작을 조정합니다.
다음과 같이 설정하였습니다.
watchdog-device = /dev/watchdog
max-load-1 = 24
watchdog-timeout = 14
realtime = yes
priority = 1
설정 내용이 반영되도록 watchdog 데몬을 재실행합니다.
$ sudo systemctl restart watchdog
Watchdog 동작 확인
Watchdog의 동작을 확인하는 가장 손쉬운 방법은 forkbomb를 실행하여 운영체제에 부하를 높이는 것입니다.
이를 통해 설치한 Watchdog 이 정상 동작하는지 확인합니다.
$ : (){ :|:& };:
결과적으로 몇 초 뒤 라즈베리파이가 중단되었으며, 리셋이 진행되어, SSH를 통하여 다시 접속할 수 있었습니다.
참고
'라즈베리파이 > 기초' 카테고리의 다른 글
라즈베리파이 WIFI 비활성하기 (0) | 2020.01.03 |
---|---|
키 기반 SSH 연결 (0) | 2019.12.28 |
라즈베리파이 IP 고정하기 (0) | 2019.12.09 |
SSH세션 종료시 실행중인 프로그램 종료 방지 (Screen) (0) | 2019.11.16 |
라즈베리 파이와 블루투스 장치(스피커) 연결하기 (0) | 2019.06.19 |