Raspberry Pi 3/4 (RaspberryPi OS 64bit) 一括セットアップ手順: node-redでスマートホーム用

# 新規インストールからの一連の設定手順です

いわゆるスマートホーム用Raspberry Piの設定。ディスプレイもキーボードもつなげずに使うこと前提です。

:::note warn
2021/10末リリースのBullsEyeには未対応(未確認)です。
:::

利用目的
- node-redでいろいろ
  - Amazon Echo + eRemote mini (RM Mini3) を使った家電の音声コントロール
  - LINEメッセージをGoogle Homeで読上げ
  - BLE温度・湿度センサーの情報取得
  - ひかり電話で相手側電話番号の情報をLINEに通知と読上げ
- tailscale VPNを使って、外から家にアクセス

# 64bit版RaspberryPi OSのインストール

- Raspberry Pi Imagerをダウンロードし、PCにインストール
https://www.raspberrypi.org/downloads/

- SDカードをPCにさす
自分はSDFormatterでフォーマットしますが、必須ではないです。

- Raspberry Pi Imagerを起動し、SDカードにRaspberry Pi OSを書き込む。
2021/05時点ではRaspberry Pi OS 64bitが選択できないので、[RaspiOS lite arm64のダウンロードページ](https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2021-04-09/)で、GUI無し版のLite ARM64をダウンロード。zipを展開し、2021-03-04-RASPIOS-BUSTER-ARM64-LITE.imgを指定。

## Raspberry Piをモニタ・キーボードなしで設定する場合

- SDカードを抜き差しし、PCに再度認識させる
- bootというボリューム名がSDカード。sshという空ファイルをここに追加する。Macなら以下のコマンドとなります。

```
touch /Volumes/boot/ssh
```

# raspi-config

有線LANをつないで起動。PCからssh pi@raspberrypi.localを実行し(ただしMacOSの場合。Windowsだと名前解決できません)、デフォルトのuser:pi, password:raspberryでログインし、`sudo raspi-config`で以下の設定。

- 1.System Options
    - S3.Password
    - S4.Hostname (複数のRaspiがある場合変更を推奨）
    - S1.Wireless LAN
- 3.Interfaceing Options - SSH - Enable
- 4.Performance Options  - GPU Memory - 16 (画面表示はしないのでGPUメモリを最小限に)
- 5.Localisation Options - Timezone
- 6.Advanced Options - Bootloader Version - Latest

# SDカード延命措置

参考：[Raspberry PiのSDカードが壊れた！寿命を延ばす方法 5+1選!](https://iot-plus.net/make/raspi/extend-sdcard-lifetime-5plus1/)

## swap無効化

```
sudo dphys-swapfile swapoff
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
```

## /tmp, /var/tmp, /var/logのtmpfs化

/etc/fstabに以下を追加。再起動するとログは消えるので注意。
`pip3 install broadlink`でビルド時に/tmp容量が必要なので256mにしてますが、broadlinkが必要ない場合は32mでも問題を感じたことはないです。

```
tmpfs           /tmp            tmpfs   defaults,size=256m,noatime,mode=1777  0       0
tmpfs           /var/tmp        tmpfs   defaults,size=16m,noatime,mode=1777  0       0
tmpfs           /var/log        tmpfs   defaults,size=32m,noatime,mode=0755  0       0
```

ローテートされたログの保存数を減らす: /etc/logrotate.conf 中のrotateを修正(4 → 1)

```
# keep 4 weeks worth of backlogs
#rotate 4
rotate 1
```

なお、/var/log/ 以下にディレクトリが存在するのが前提のソフトウェアがあると問題が起きます。典型的な例がnginxです(apacheも)。その場合以下のような設定が必要になります。

```/etc/tmpfiles.d/50_nginx.conf
d /var/log/nginx 0755 root adm - none
f /var/log/nginx/access.log 0640 www-data adm - none
f /var/log/nginx/error.log 0640 www-data adm - none
```

OpenMediaVaultをインストールする場合、以下も必要。

```/etc/tmpfiles.d/50_cron-apt.conf
d /var/log/cron-apt 0755 root adm - none
```

Samba

```/etc/tmpfiles.d/50_samba.conf
d /var/log/samba 0755 root adm - none
```


参考: [TOSHIBA:DebianにおけるSDカードへの書込み回数の低減方法](https://elinux.org/images/6/61/Debian%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BSD%E3%82%AB%E3%83%BC%E3%83%89%E3%81%B8%E3%81%AE%E6%9B%B8%E8%BE%BC%E3%81%BF%E5%9B%9E%E6%95%B0%E3%81%AE%E4%BD%8E%E6%B8%9B%E6%96%B9%E6%B3%95.pdf)

## SDカードへの書き出しの頻度を下げる

/etc/fstabで/(root)ファイルシステムのオプションにcommit=240を追加。※4分経たないとSDカードに書き込まれないので注意。

```
/dev/mmcblk0p2 / ext4 defaults,noatime,commit=240  0 1
```

# /boot/configの設定

## OS起動中はパワーLED点滅、WiFiのOFF

/boot/overlays/READMEを見て、以下の設定が有効か確認してから設定することをお勧めします。
```
dtparam=pwr_led_trigger=heartbeat
dtparam=pwr_led_activelow=off
dtoverlay=disable-wifi
```

Raspberry Pi Zeroの場合は、pwr_ledではなくact_led
```
dtparam=act_led_trigger=heartbeat
dtparam=act_led_activelow=off
```

## 新しいRaspberry Pi4でboost clockを1.8GHzに

比較的新しいRaspberry Pi4だと、boost clockの値が1.5GHzから1.8GHzになっています。

https://raspida.com/overclock-rpi4-bullseye

```
arm_boost=1
```

# 省電力設定

あまりおすすめしません。省電力設定が重要な場合に限る。

## CPUのコア数を制限（おすすめしません）
```/boot/cmdline.txt
maxcpus=2
```

## HDMIをオフにする。10mA程度の節約 (おすすめしません)
```
sudo /opt/vc/bin/tvservice --off   (-pでon)
```

## USBをオフにする。100mAの節約 (おすすめしません)
有線LANが無効になる。上のdisable-wifiと同時に設定してはいけない。
Raspberry Pi 3においては、WiFiをオフにするより有線LAN(USB)をオフにしたほうが効果が大きい。

```
echo 0 | sudo tee /sys/devices/platform/soc/*.usb/buspower
```

# 必要なアプリケーションのインストール

## まずは最新に更新

```
sudo apt-get update
sudo apt-get -y upgrade
```

## apt-getで一括インストール

```
sudo apt-get -y install emacs-nox whois git bc mosh parallel iotop glances
sudo apt-get -y install arp-scan iftop tcpdump iperf iptraf-ng
```

gitの初期設定

```
git config --global user.name "My Name"
git config --global user.email "email address"
```

## node-red

参考: [Amazon Echoとラズパイで、音声で照明をon/offする](https://qiita.com/kikuzo/items/753b5065dde9633bda18#1-ラズパイとnode-red環境のセットアップ)
なお、curlで取得するURLは現在上記ページとは異なっているので下記内容を使用してください。

```
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
sudo systemctl start nodered.service
sudo systemctl enable nodered.service
```

あと、[Editor & Admin API security](https://nodered.org/docs/user-guide/runtime/securing-node-red#editor--admin-api-security)を参考に、ユーザ認証を追加しておくのもお勧め。

## BlackBeam社のスマートリモコン関連

参考: [素人でもスマートスピーカーから家電を操作できた](https://qiita.com/GITC_DM/items/0b17a6c1afd3893e7935#2python-broadlink)

```
sudo apt-get -y install python3-dev python3-pip libffi-dev libssl-dev rustc cargo
sudo pip3 install broadlink
```
```
mkdir ~/git
cd ~/git
git clone https://github.com/mjg59/python-broadlink.git
```

## Bluetooth (noble)

```
sudo apt-get -y install bluetooth libbluetooth-dev libudev-dev
```


## avahi (Google Homeを喋らせるのに必要)

```
sudo apt-get -y install avahi-daemon avahi-utils libnss-mdns libavahi-compat-libdnssd-dev
```

## catt (Google Nest HubでWebページ表示)

```
sudo apt-get -y install python3-pip
sudo pip3 install catt 
```

### sshサービスを公開する

参考: [avahi-daemonを設定してDNSサーバ運用をやめた](https://qiita.com/ymotongpoo/items/700884e64832f812b9db)

/etc/avahi/services/ssh.service

```xml
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_ssh._tcp</type>
    <port>22</port>
  </service>
</service-group>
```

```
sudo systemctl restart avahi-daemon.service
```

これで、ssh pi@raspberrypi.local でsshログインできるようになる（ただし、Windowsからは不可)。

## Mackerelでの監視設定

Mackerelとは、はてなが提供しているサーバー監視サービスで、無料プランでも5台まで監視できるのでRaspberry Piの監視にちょうどいいです。問題発生時にメールだけでなくLINEに通知するようにもできます。

基本的な設定はこちらを参考: [Raspberry Pi を Mackerel で監視する](https://qiita.com/ww24/items/5409aefd87f14beff504)

ただし、ダウンロードするファイルは以下のようにmackerel-agent_linux_arm.tar.gzではなくmackerel-agent_linux_arm64.tar.gzです。

```
curl -sL https://github.com/mackerelio/mackerel-agent/releases/latest/download/mackerel-agent_linux_arm64.tar.gz | tar xz
sudo mkdir -p /usr/local/bin /etc/mackerel-agent
sudo cp mackerel-agent_linux_arm64/mackerel-agent /usr/local/bin
sudo cp mackerel-agent_linux_arm64/mackerel-agent.conf /etc/mackerel-agent
```

上記設定後にこれ

- [自宅のグローバルIPアドレスの変更をMackerelで通知する](https://qiita.com/tinoue@github/items/303cd3e3d030f4e89c59)
- [MackerelでRaspberry Piの電源不足とオーバーヒートを監視する](https://qiita.com/tinoue@github/items/868b848999c3571ccf9f)
- NASの死活監視
 
```/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.nas]
command = "ping -c 3 192.168.2.xxx"
max_check_attempts = 1
check_interval = 11
memo = "Health check of ReadyNAS."
```

## baresip (ひかり電話の相手番号取得)

参考: [Linux でひかり電話にかかってきた電話番号を取得する](https://s.webry.info/sp/vogel.at.webry.info/201711/article_3.html)

```
sudo apt-get -y install baresip-core
```

インストール後、一度baresipを起動しCtrl+Cで終了
~/.baresip/configを編集。stdio.so, alsa.soをコメントアウト誌、cons.soを追加

```
#module                  stdio.so
#module                  alsa.so
module                   cons.so
```

~/.baresip/accounts に以下を追加

```
<sip:{内線番号}:{password}@{電話ルータのIPアドレス}>;auth_user={userId}
```

## VPN (tailscale)

面倒な設定がいらないtailscaleを使う

参考:[Setting up Tailscale on Raspbian Buster](https://tailscale.com/kb/1043/install-raspbian-buster/)

```
sudo apt-get -y install apt-transport-https
curl -fsSL https://pkgs.tailscale.com/stable/raspbian/buster.gpg | sudo apt-key add -
curl -fsSL https://pkgs.tailscale.com/stable/raspbian/buster.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt-get update
sudo apt-get -y install tailscale
```

遠隔設置のRaspberryPiの場合、tailscaleの管理画面で該当デバイスの再認証を不要にしておく。[Key Expiry](https://tailscale.com/kb/1028/key-expiry/)

## ネットワークパラメータのチューニング

https://qiita.com/tinoue@github/items/3de11e8faaa96fe568ad#%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0

```/etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
```

## USB接続HDDのiowait低減

https://serverfault.com/questions/8249/resolving-high-iowait-on-samba-server

OpenMediaVaultをインストールして、USB接続HDDをtimemachine backup先とした場合、CPUのiowaitがかなり高くなるので先読みを128KB→32KBに設定。ただし気休め程度です。

```/etc/rc.local
echo 32 > /sys/block/sda/queue/read_ahead_kb 
```

# SDカード関連

## 再起動時にfsckをする

```
shutdown -rF now
```

## SDイメージのバックアップをサイズが違う別のSDにレストアする場合

[RPiのSDをバックアップして別のSDに書き込む](https://sonouchimaint.blogspot.com/2016/07/rpisdsd.html) : サイズが違う場合のパーティション操作