W tym poście chciałbym opisać sposób poprawnego wyłączania Raspberry Pi oraz w jaki sposób uruchomić watchdoga w Raspberry pi.
Poprawne wyłączenie
W tej części chciałby zaprezentować w jaki sposób wykonać poprawne wyłączenie oraz poprawne ponowne uruchomienie płytki.
Najlepiej do tego celu wykorzystać komendy konsoli, można też podobnie jak w systemie windows przez kliknięcie oraz zamknięcie. Minusem drugiej opcji jest to, że nie zawsze, i nie na każdym systemie jest ona dostępna, dlatego lepiej zapoznać się z metodami obsługi systemu poprzez konsole.
Wyłączenie dokonuje się poprzez komendę:
- sudo halt
Jest to skrócona wersja komendy:
- sudo shutdown -h now
W nie jako parametr podawany jest znak -h który powoduje, że po wyłączeniu system ponownie się nie uruchamia. Kolejny parametr czyli now określa kiedy ma nastąpić wyłączenie. Ostatni parametr jest podawany w sekundach, lub przekazywana jest informacja z godziną wyłączenia (np. 16:00). Można także podawać parametr w minutach.( np. +30, powoduje wyłączenie za 30 minut).
Ponowne uruchomienie systemu można wykonać komendą:
- sudo reboot
Co jest wersją skróconą dla komendy:
- sudo shutdown -r now
Parametr -r informuje system o tym, że nastąpi reset systemu.
Inną opcją, która służy do natychmiastowego wyłączenia jest:
- sudo shutdown -P now
Watchdog
Raspberry pi posiada jednego watchdoga sprzętowego.
Aby go uruchomić należy wprowadzić komendę:
- sudo modprobe bcm3510
Następnie należy dodać układ w pliku modules:
- sudo nano /etc/modules
W nim należy wpisać wykorzystywany układ czyli bcm3510.
Dalej następuje instalacja watchdoga, jego włączenie oraz wystartowanie:
- sudo apt-get install watchdog chkconfig
- sudo chkconfig watchdog on
- sudo /etc/init.d/watchdog start
Następnym elementem jest uaktualnienie:
- sudo update-rc.d watchdog defaults
Kolejnym krokiem jest edycja pliku, do którego przypisany zostaje układ:
- sudo nano /etc/default/watchdog
W nim należy wprowadzić układ przez jego dodanie gdzie linia watchdog_module="none" zostaje zamieniona na watchdog_module="bcm3510".
Kolejny etap dotyczy pliku konfiguracyjnego samego watchdoga:
- sudo nano /etc/watchdog.conf
Tym razem należy od komentować linie #max-load-1 = 24, która powoduje, że przy normalnym użytkowaniu Raspberry nie zostanie zresetowane, nastąpi to tylko w przypadku wystąpienia błędów. Następnie należy odkomentować linie #watchdog-device = /dev/watchdog oraz dodać po niej watchdog-timeout=15. Jest to maksymalna wartość jaka może stać wprowadzona do układu watchdoga. Określa ona czas potrzebny do przeładowania licznika. Dodatkowo można się zabezpieczyć przed przegrzaniem określająć maksymalną temperaturę dla układu. W tym celu zamienić linie poniżej deklaracji watchdoga na:
- temperature-device = /sys/class/thermal/thermal_zone0/temp
- temperature-sensor = /sys/class/thermal/thermal_zone0/temp
- max-temperature = 90
Maksymalną temperaturę określiłem na 90 st. C.
Po restarcie Raspberry Pi watchdog jest domyślnie wyłączony. Jego status można sprawdzić poleceniem:
- sudo /etc/init.d/watchdog status
Aby go ponownie uruchomić należy wpisać:
- sudo /etc/init.d/watchdog start
Po uruchomieniu zostanie wyświetlone następujące informacje:
- ● watchdog.service - watchdog daemon
- Loaded: loaded (/lib/systemd/system/watchdog.service; static)
- Active: active (running) since Mon 2017-05-15 08:46:31 CEST; 2min 30s ago
- Process: 1694 ExecStart=/bin/sh -c [ $run_watchdog != 1 ] || exec /usr/sbin/watchdog $watchdog_options (code=exited, status=0/SUCCESS)
- Process: 1690 ExecStartPre=/bin/sh -c [ -z "${watchdog_module}" ] || [ "${watchdog_module}" = "none" ] || /sbin/modprobe $watchdog_module(code=exited, status=0/SUCCESS)
- Main PID: 1696 (watchdog)
- CGroup: /system.slice/watchdog.service
- └─1696 /usr/sbin/watchdog
- May 15 08:46:31 raspberrypi sh[1694]: Ignoring invalid line in config file:
- May 15 08:46:31 raspberrypi sh[1694]: temperature-sensor = /sys/class/therm...mp
- May 15 08:46:31 raspberrypi watchdog[1696]: starting daemon (5.14):
- May 15 08:46:31 raspberrypi watchdog[1696]: int=1s realtime=yes sync=no soft...0
- May 15 08:46:31 raspberrypi watchdog[1696]: ping: no machine to check
- May 15 08:46:31 raspberrypi watchdog[1696]: file: no file to check
- May 15 08:46:31 raspberrypi watchdog[1696]: pidfile: no server process to check
- May 15 08:46:31 raspberrypi watchdog[1696]: interface: no interface to check
- May 15 08:46:31 raspberrypi watchdog[1696]: temperature: maximum = 90
- May 15 08:46:31 raspberrypi watchdog[1696]: temperature: /sys/class/thermal/...p
- May 15 08:46:31 raspberrypi watchdog[1696]: test=none(0) repair=none(0) aliv...o
- May 15 08:46:31 raspberrypi watchdog[1696]: watchdog now set to 15 seconds
- May 15 08:46:31 raspberrypi watchdog[1696]: hardware watchdog identity: Broa...r
- May 15 08:46:31 raspberrypi systemd[1]: Started watchdog daemon.
- Hint: Some lines were ellipsized, use -l to show in full.
Test watchdoga można wykonać poprzez wykorzystanie tzw. fork bomby. Jej implementacja jako plik skryptowy wygląda następująco:
- #!/bin/bash
- echo "Starting shell fork bomb"
- # prevent swapping to the SD card!
- sudo systemctl stop dphys-swapfile.service
- # start the bomb
- : (){ :|:& };:
Po jego zapisaniu, w moim przypadku nazwa fork.sh, jego odpalenie wykonuje się następująco:
- sudo chmod +x fork.sh
- ./fork.sh
Jeśli wszystko przebiegło poprawnie bo jej odpaleniu raspberry się zawiesi a watchdog spowoduje ponowne odpalenie systemu.
Aby uruchomić go automatycznie po starcie systemu należy zmodyfikować jeden plik:
- sudo nano /lib/systemd/system/watchdog.service
Tam w sekcji [Install] należy wprowadzić:
WantedBy=multi-user.target
Po wyjściu i zapisaniu ustawień należy wpisać komendę uruchamiającą usługę:
- sudo systemctl enable watchdog.service
Watchdoga można też rozwiązać sprzętowo np. na układu NE555, bądź dedykowanym zewnętrznym dedykowanym układzie. Z jednego pinu generowany jest cykliczny sygnał PWM, który w przypadku zawieszenia spowoduje wygenerowanie z innego pinu sygnału resetu na płytkę.
Sprawdzenie temperatury:
Poniżej przedstawię w jaki sposób można sprawdzić temperaturę GPU jak i rdzenia ARM.
Sprawdzenie temperatury GPU:
- vcgencmd measure_temp
https://www.cyberciti.biz/faq/linux-find-out-raspberry-pi-gpu-and-arm-cpu-temperature-command/
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=147501
http://malinowepi.pl/post/142069525633/watchdog-i-raspberry-pi-czyli-automatyczny