Molybdenum

あれこれ記録がてらに書いていきます。

【備忘録】 Raspberry Piでの設定あれこれ

はじめに

大学院修了時に友人から初代Raspberry Piを戴いたので色々遊んでいました。
初代のRaspberry Piはスペックが大したものではないですが、bot作ったりして遊ぶ分には便利です。
大したことはしてないのですが、備忘代わりのTips集を書きます。
Raspberry Piをいじっていると、Linux環境での各種セットアップ方法とかサーバ構築技術が身についたりするので個人的にはオススメです。

Tips集

見当たらないとき向けにarpで探す

Raspberry Piを探すのはめんどくさいので、ethernetでつながった状態でIPアドレスを探します。

kmori@edelweiss ~/Desktop $ arp -a

これをラズパイを繋ぐ前と後で差分を取ればIPアドレスがわかります。

IPアドレスを固定化

pi@raspberrypi:~ $ sudo vim /etc/dhcpcd.conf

一番下に挿入(下記は無線LANを使う前提)

interface wlan0
static ip_address=192.168.0.xxx/24
static routers=192.168.0.xxx
static domain_name_servers=192.168.0.xxx

static ip_addressに固定化したIPアドレスを設定します。
static routersとstatic domain_name_serversはルータのIPアドレスを設定(ブリッジしてる場合はそっちのIPアドレスを設定)します。

Watchdogの導入

エラー時にリブートしてくれる番犬こと、Watchdogを設定します。

 私の環境だとうまくいかなったパターン

pi@raspberrypi:~ $ sudo apt install watchdog
pi@raspberrypi:~ $ sudo vim /lib/systemd/system/watchdog.service

最下部のinstallの設定を変えます。
この変更では、複数ユーザ環境がベースとなるターゲットへ指定しており、多くのサービスのターゲットがこのターゲットに紐付いています。

[Install]
#WantedBy=default.target
WantedBy=multi-user.target

Watchdogの自動起動を設定します。

pi@raspberrypi:~ $ sudo update-rc.d watchdog enable

モジュールをロードの上、設定変更を実施します。

pi@raspberrypi:~ $ sudo modprobe bcm2835_wdt
pi@raspberrypi:~ $ sudo vim /etc/watchdog.conf

下記のように一部コメントアウトを外した上、タイムアウトを設定して有効化します。

#max-load-1 = 24
max-load-1 = 24
(中略)
#watchdog-device = /dev/watchdog
watchdog-device = /dev/watchdog

リブートします。

pi@raspberrypi:~ $ sudo reboot

最後にfork bombで動作確認をします。

pi@raspberrypi:~ $ :(){ :|:& };:

ってやってもうまくいかなかった・・・。

リトライ

調べたところ、標準の機能でいけるみたいなので、更にいじります。

pi@raspberrypi:~ $ sudo vim /boot/config.txt

で一番下に

dtparam=watchdog=on

を追記します。更に、

pi@raspberrypi:~ $ sudo vim /etc/modprobe.d/bcm2835-wdt.conf

で作成を行い、この1行を挿入します。

options bcm2835_wdt heartbeat=15 nowayout=0

これで15秒間隔でwatchdogがheartbeatを期待する設定になりました。

さらにシステム側で heartbeat信号を出力する設定をします。

pi@raspberrypi:~ $ sudo vim /etc/systemd/system.conf

で開いて、

#RuntimeWatchdogSec=0
RuntimeWatchdogSec=10

とします。これで10秒以内の間隔でheartbeatが行われます。この状態で再起動。

pi@raspberrypi:~ $ dmesg | grep bcm2835-wdt
[    0.764255] bcm2835-wdt 20100000.watchdog: Broadcom BCM2835 watchdog timer

無事に起動を確認。 最後のfork bombを打ち込んで無事に動くことを確認します。なんだかんだで長い道のりです。

自動再起動

当然ながらRaspberry PiもPCなので、稼働し続けていると調子が悪くなります。
例えば、走らせているスクリプトが落ちる上、SSHしても繋がらなかったり・・・。
ということで、再起動する設定をします。おなじみにcronでやります。

pi@raspberrypi:~ $ sudo crontab -e

で設定可能ですが、何も設定していない状態だと下記のようにでます。

pi@raspberrypi:~ $ sudo crontab -e
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny

なので、下記の指定をしてcrontabをインストールしてあげましょう。

Choose 1-4 [2]: 3
crontab: installing new crontab

Vimが出てきたら、一番下にこれを挿入してあげましょう。

00 3 * * * /sbin/reboot

cronの設定方法は説明書きに以下のように書いています。

# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

つまり、 "分 時 日 月 曜日 コマンド" で可能です。
設定が完了したら、crontabを確認しましょう。

pi@raspberrypi:~ $ sudo crontab -l

作成したscriptをservice化

service化して起動時から動かします。

$ sudo vim /etc/systemd/system/runMybots.service
[Unit]
#Description
Description = Running My bots

[Service]
# Path
ExecStart =  /home/pi/program/start.sh
#Restart setting
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

start.shの中身は以下に設定。

#!/bin/bash
python3 /home/pi/program/reboot.py
python3 /home/pi/program/runbot01.py

reboot.pyでリブートした旨をSlackに通知しています。

先程追加したrumMybotsがリストにいるか確認。

$ sudo systemctl list-unit-files --type=service | grep runMybots

いることをみつけたら、自動起動にします。

$ sudo systemctl enable runMybots.service

最後に起動します。

$ sudo systemctl start runMybots.service

これで途中で落ちても大丈夫です。

おまけRaspberry Piで走らせている/いたScript

温度&湿度自動投稿

学生時代に住んでいた部屋はユニットバスだったためか、湿度が異様に高く、窓にカビがすぐはえてしまっていたので、湿度への警戒心が高くなりました。
そのため、部屋の温度と湿度のセンサをSlackへ投稿するbotを作っていました。
なお、このbotはセンサが壊れたため現在は動いていません。

人感センサ

赤外線センサによる、人感センサのbotを動かしていました。
大した金品はないのですが、警備会社の装置みたいなものを作られるのでは・・・?と考えたのがきっかけです。

電車運行情報

Webページを定期的にクローリングして、遅れていたらSlackに投稿するbotです。
私が普段利用している、東京メトロ東西線は混雑で遅れることが多いため便利でした。
現在は、Alexaのレシピが優秀で勝手に教えてくれるのでやめました。

各Scriptについては需要があれば書きます。

参照したサイト

Raspberry Pi 3B+を定期的に再起動する方法(cron) | あとをしNOTE Raspberry PiにハードウェアWatchdogを設定してみましょう | CANDY LINE Blog Raspberry piでslackbotを動かす - Qiita