poniedziałek, 15 maja 2017

Raspberry Pi - Poprawne wyłączanie, watchdog oraz sprawdzanie temperatury

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ę:

  1. sudo halt

Jest to skrócona wersja komendy:

  1. 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ą:

  1. sudo reboot

Co jest wersją skróconą dla komendy:

  1. 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:

  1. sudo shutdown -P now

Watchdog


Raspberry pi posiada jednego watchdoga sprzętowego.

Aby go uruchomić należy wprowadzić komendę:

  1. sudo modprobe bcm3510

Następnie należy dodać układ w pliku modules:

  1. sudo nano /etc/modules

W nim należy wpisać wykorzystywany układ czyli bcm3510.

Dalej następuje instalacja watchdoga, jego włączenie oraz wystartowanie:

  1. sudo apt-get install watchdog chkconfig
  2. sudo chkconfig watchdog on
  3. sudo /etc/init.d/watchdog start

Następnym elementem jest uaktualnienie:

  1. sudo update-rc.d watchdog defaults

Kolejnym krokiem jest edycja pliku, do którego przypisany zostaje układ:

  1. 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:

  1. 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:

  1. temperature-device = /sys/class/thermal/thermal_zone0/temp
  2. temperature-sensor = /sys/class/thermal/thermal_zone0/temp
  3. 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:

  1. sudo /etc/init.d/watchdog status

Aby go ponownie uruchomić należy wpisać:

  1. sudo /etc/init.d/watchdog start

Po uruchomieniu zostanie wyświetlone następujące informacje:

  1. ● watchdog.service - watchdog daemon
  2.    Loaded: loaded (/lib/systemd/system/watchdog.service; static)
  3.    Active: active (running) since Mon 2017-05-15 08:46:31 CEST; 2min 30s ago
  4.   Process: 1694 ExecStart=/bin/sh -c [ $run_watchdog !1 ] || exec /usr/sbin/watchdog $watchdog_options (code=exited, status=0/SUCCESS)
  5.   Process: 1690 ExecStartPre=/bin/sh -c [ -z "${watchdog_module}" ] || [ "${watchdog_module}" = "none" ] || /sbin/modprobe $watchdog_module(code=exited, status=0/SUCCESS)
  6.  Main PID: 1696 (watchdog)
  7.    CGroup: /system.slice/watchdog.service
  8.            └─1696 /usr/sbin/watchdog
  9.  
  10. May 15 08:46:31 raspberrypi sh[1694]: Ignoring invalid line in config file:
  11. May 15 08:46:31 raspberrypi sh[1694]: temperature-sensor = /sys/class/therm...mp
  12. May 15 08:46:31 raspberrypi watchdog[1696]: starting daemon (5.14):
  13. May 15 08:46:31 raspberrypi watchdog[1696]int=1s realtime=yes sync=no soft...0
  14. May 15 08:46:31 raspberrypi watchdog[1696]: ping: no machine to check
  15. May 15 08:46:31 raspberrypi watchdog[1696]: file: no file to check
  16. May 15 08:46:31 raspberrypi watchdog[1696]: pidfile: no server process to check
  17. May 15 08:46:31 raspberrypi watchdog[1696]: interface: no interface to check
  18. May 15 08:46:31 raspberrypi watchdog[1696]: temperature: maximum = 90
  19. May 15 08:46:31 raspberrypi watchdog[1696]: temperature: /sys/class/thermal/...p
  20. May 15 08:46:31 raspberrypi watchdog[1696]test=none(0) repair=none(0) aliv...o
  21. May 15 08:46:31 raspberrypi watchdog[1696]: watchdog now set to 15 seconds
  22. May 15 08:46:31 raspberrypi watchdog[1696]: hardware watchdog identity: Broa...r
  23. May 15 08:46:31 raspberrypi systemd[1]: Started watchdog daemon.
  24. 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:

  1. #!/bin/bash
  2. echo "Starting shell fork bomb"
  3. # prevent swapping to the SD card!
  4. sudo systemctl stop dphys-swapfile.service
  5. # start the bomb
  6. (){ :|:& };:

Po jego zapisaniu, w moim przypadku nazwa fork.sh, jego odpalenie wykonuje się następująco:

  1. sudo chmod +x fork.sh
  2. ./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:

  1. 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ę:

  1. 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:

  1. 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