Raspberry Pi 4 セットアップメモ

ながらく、2012年6月の発売直後に買ったRaspberry Pi Model B Rev 1にADS-B受信やら消費電力測定やら電源周波数観測やら気圧測定をやらせていましたが、Raspberry Pi OSをupgradeするごとにきつくなってきて、遂にはsystemdをdaemon-reloadするとWDTがタイムアウトしてリスタートする限界っぷりに到達したのでリプレースすることに。メモリが足りてないことから、Raspberry Pi 4 8Gモデルを買うことにしました。

しましたと言っても2021~2022年あたりは在庫がない時期が続き、ようやく復活した頃には5k近く値上がりという異常な事態となり「資本が暴れた跡に残るは荒野」という心境。

それはさておき、ようやくRaspberry Pi 4 Model Bを調達したのでセットアップしていく記録をのこしておく。なお入れたOSはRaspibian OS(64bit)で、lsb_release -aすると「Debian GNU/Linux 11.7 (bullseye)」って返事が来ます。

NIC設定

大都会の谷底に設置しててWLANが安定しなかった経緯があり有線LANでネットワークに接続します。WiFiをdisableするdtoverlayを書く。

#/boot/config.txt

dtoverlay=disable-wifi

IPアドレス/etc/dhcpcd.confに書きます。

# /etc/dhcpcd.conf

interface eth0
static ip_address=192.168.50.137/24
static routers=192.168.50.254
static domain_name_servers=192.168.50.254

WDTを設定

最近は何もしなくても、/dev/watchdogおよび/dev/watchdog0が生えてる。

$ ls -l /dev/watchdog*
crw------- 1 root root  10, 130 Jun 18 18:35 /dev/watchdog
crw------- 1 root root 248,   0 Jun 18 18:35 /dev/watchdog0

生えていなければ、dtoverlayでwatchdogデバイスを生やす。

#/boot/config.txt

dtoverlay=watchdog=on

bcm2835_wdtoptionsには設定が2つあります。不要ならmodprobeでのoptionsは不要。

  • heartbeat はWDTが「待て」をするインターバルで1秒~15秒を設定でき、初期値は15秒。
  • nowayout は稼働開始したWDTを止められるかどうかで初期値は0(止められる)。

WDTのfeedingはsystemdがやってくれるのでRuntimeWatchdogSecを設定。何処に書いてもいいけど、/etc/systemd/system.confに記入例があったのでシュッとコメントアウトを外す。

# /etc/systemd/system.conf

RuntimeWatchdogSec=10

どうやら/dev/watchdogopenすることでWDTが開始するらしく、最低限の設定は今やsystemdだけで済むようです。

冷却ファンをつける

公式ケースにつけるファンが売ってます。

www.raspberrypi.com

www.raspberrypi.com

普通に電源を刺すと、蚊が100匹ぐらい飛んでるような音がファンから出てきます。「Fan speed control: Pulse width modulation control via user-selectable GPIO pin」って書いてあるので適当に制御します。gpio-fanというdtoverlayがあって、raspi-configでも設定できますが/boot/config.txtによしなに書くだけなので自分でviってもよい。

dtoverlay -h gpio-fan の結果をざっと書くとこんな感じ。

walkure@falcon:~ $ dtoverlay -h gpio-fan
Name:   gpio-fan

Info:   Configure a GPIO pin to control a cooling fan.

Usage:  dtoverlay=gpio-fan,<param>=<val>

Params: gpiopin                 GPIO used to control the fan (default 12)
        temp                    Temperature at which the fan switches on, in
                                millicelcius (default 55000)
        hyst                    Temperature delta (in millicelcius) below
                                temp at which the fan will drop to minrpm
                                (default 10000)
  • gpiopinでファンをON/OFFするピンで初期値はGPIO12
  • tempはファンを起動する温度を指定するところで初期値は55℃
  • hystはファンを停止する起動温度からの減分値で初期値は10℃つまり45℃でファンが止まる。

GPIOでオンオフできるんならPWM制御もできるはずで、overlay作ってる人はいるっぽい(see. hwmon PWM-fan - non working on 5.15.89 - working in 6.7.1 but error in kernel log - Raspberry Pi Forums )。未検証ですが…。

ピンはGPIO17にして、起動温度は65℃にしました。

# /boot/config.txt
dtoverlay=gpio-fan,gpiopin=17,temp=65000

UARTを動かす

電源周波数観測してるAVRから観測データがUARTで流し込まれるので設定します。

RasPi4はPL011 compatible UARTを5つ積んでいます。ひとつはBluetooth通信用に使われていて、残り4つはdtoverlayで必要に応じactivateして使うことになります。公式ファンをつけると、40ピンあるGPIOヘッダのうち1/3ぐらいが干渉1してQIコネクタが刺せなくなるので、コネクタさせるpinに出ているUARTをさがす。

pinout.xyz

pinoutのUARTではどのUARTが出てるのかわかんなかったので、dtoverlay -h uart[2-5]の結果と、書いてあるGPIOピン番をraspi-gpio func 0-3みたいに放り込んで結果を見て書き足すとこんな感じ。ついでにファン固定部とコネクタが干渉してどうしようもなさそうなとこに色塗り。

gyazo.com

ssh reverse tunnel

これはzennに書いたことをやっただけ。

zenn.dev

/var/logと/var/tmpをtmpfsに置く

microSDフラッシュメモリを延命させるためにログをtmpfsに置く。なにかトラブってWDT食らって再起動するとログが消えてしまうことに留意。

/var/logは空っぽにしたけど、/var/tmpはsystemdのPrivateTmpがいたので特に消さず。/etc/fstabにこんな感じで追記してリブート。

# /etc/fstab
tmpfs  /var/tmp       tmpfs defaults,size=16m,noatime,mode=1777 0 0
tmpfs  /var/log       tmpfs defaults,size=16m,noatime,mode=0755 0 0

systemd-tmpfilesってやつを使えば起動時tmpfsにディレクトリを作ってくれたりする2けど、現状はやらなくてもよさそう。

ADS-B

元々動いてるRasPiの設定を基本的に引き継ぐので、device claimなどは端折り、ログ黙らせるのを中心に。

piawareとdump1090-fa

piawareとdump1090-faはarm64の野良packageもある3けど、自力buildしてもそんなに時間がかからないので自前でやる。

intaa.net

ここを参考にdump1090-faとpiawareのdebを生成して入れる。今はdump1090-fa/piawareともにv8.2だけど、ビルド過程に大した変化はなかった(はず)。

dump1090-fa

$ cd ~
$ sudo apt install git lighttpd debhelper librtlsdr-dev pkg-config libncurses5-dev libbladerf-dev libusb-dev devscripts
$ git clone --depth 1 https://github.com/flightaware/dump1090 dump1090-fa
$ cd dump1090-fa
$ dpkg-buildpackage -b --no-sign --build-profiles=custom,rtlsdr
$ sudo dpkg -i ~/dump1090-fa_8.2_armhf.deb

インストールした後、前出blogでは/run/dump1090-faへ吐かないよう設定しているが、現在のRaspbianだと/runはtmpfsなので省略。

piaware

まずtcl-tlsを入れる。

$ cd ~
$ sudo apt install tcl-dev chrpath libssl-dev
$ git clone --depth 1 https://github.com/flightaware/tcltls-rebuild.git
$ cd tcltls-rebuild
$ ./prepare-build.sh bullseye
$ cd package-bullseye
$ dpkg-buildpackage -b --no-sign
$ sudo dpkg -i ../tcl-tls_1.7.22-2+fa1_armhf.deb

次いでpiawareを入れる。

$ cd ~
$ sudo apt install devscripts python3-dev python3-venv libboost-system-dev libboost-program-options-dev libboost-regex-dev libboost-filesystem-dev patchelf python3-setuptools tclx8.4 tcllib tcllib itcl3
$ git clone --depth 1 https://github.com/flightaware/piaware_builder.git
$ cd ~/piaware_builder
$ ./sensible-build.sh bullseye
$ cd ~/piaware_builder/package-bullseye
$ dpkg-buildpackage -b --no-sign
$ sudo dpkg -i ../piaware_8.2_armhf.deb

入れるとsyslogを/var/log/piaware.logへ吐く設定4が入るので、/etc/rsyslog.d/piaware.confを消す。

radarbox24

Raspberry Pi RBFeeder Guide - AirNav RadarBox - Global Flight Tracking Intelligence | Live Flight Tracker and Airport Statusを参考に入れます。Release見ればわかるようにarmhfだけでなくarm64も用意されているのでシュッと。

/etc/rbfeeder.inilog_file=/dev/nullにするとログファイルを吐かなくなる。/lib/systemd/system/rbfeeder.service/var/log/rbfeeder.log作ってる部分を消すとスッキリ。

一方で、STDOUTへStatisticsを毎分吐き続けるのでsudo systemctl edit rbfeederでSTDOUTを/dev/nullに飛ばすようunitをdropinで置換。

# /etc/systemd/system/rbfeeder.service.d/override.conf
[Service]
StandardOutput=null

flightradar24

intaa.net

Release5見てもわかるように、armhfのbinaryしか提供されてない。Raspbianでは動いたけど、他のdistでは動かない6こともあるみたい。

fr24feed manual(PDF)見ると、/etc/fr24feed.inilog-mode="0"にするとログを吐かなくなるというので設定を入れた。あと、fr24feedのsystemd unit7ExecStartPreでdump1090-mutabilityを入れようとしたりディレクトリを作ったりしようとするので全部コメントアウト

planefinder

https://planefinder.net/coverage/clientdebがあるので落として入れる。こいつもarmhfしかない。

feederが自前でlog吐いてrotateするのでシュッとログを黙らせられない上にフォーラムでの返事もアレ8なので設定では出来ないと判断し、/var/log/pfclientsize=1でサイズを最小限9にしたtmpfsにする10ことで制限をかける。

速攻disk fullでログ吐けなくなってますが、planefinder側のstatus見る限りfeedは出来てるので良いことにする。

# /etc/fstab
tmpfs  /var/log/pfclient tmpfs defaults,size=1,noatime,mode=0755 0 0

fstabは上から順に読まれていくようで、/var/logのtmpfs mountより後に書かないとだめ11

ちなみにlogにはfeederがplanefinderのvendor ntpサーバを裏で叩いてるログが出てるんだけど、ntpサーバの設定も/etc/hostsで無理やり曲げるしかなさそう。

adsbexchange

intaa.net

github.com

この辺を参考にして入れる。インストール時に/usr/local/share/adsbexchangeADSBexchange/readsbADSBexchange/mlat-clientをcloneしてビルドするので色々入る。

特にログファイルを吐いてる雰囲気はなさそうなので、このまま。

PushProx

NATを超えるために使ってる。オリジナルのやつをちょっといじったやつをGitHub Actionでビルドできるようにしていて、こいつもarm64に対応させる。

github.com

matrixでwindows/arm(64)?をbuildしないようにするexcludeを使ってみた。説明のpartial matchってのを見て早とちりしましたが文字列は完全一致なのでarmarm64を書き並べる必要がある。


  1. コネクタハウジングを切り詰めると、もう少し頑張れる。
  2. systemdでtmp file/directoryの作成 - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
  3. abcd567a/piaware-ubuntu-debian-amd64
  4. Disable piaware logging - FlightAware / ADS-B Flight Tracking - FlightAware Discussions
  5. このファイルはContent-Type: binary/octet-streamになっているので、保存ダイアログが出る。
  6. ADS-B Exchangeにフィードする - がとらぼ
  7. systemctl cat fr24feedで確認できますが、こいつは/etc/systemd/system/fr24feed.serviceに置かれています。
  8. More options than are in the pfclient-config.json file? | Plane Finder Forumで「My goal is to either disable all logging, or change the log location to a USB stick to save wear on the SD. 」って書いた人に「I think you might be over optimising the SD card as these days they last a long long time.」とか返していてお前が気にするかなんて聞いてねぇんだわ。
  9. 実際はページサイズ単位に丸められるので1byte指定しても4096bytesぐらいで確保される。
  10. tmpfsではなく/dev/nullっぽいfsを探すと、abbbi/nullfsvfs: a virtual black hole file system that behaves like /dev/nullってのを見つけたけどkoをbuildせんならんので未検証。
  11. 実際にやってみると、/var/log/pfclientが出来た後に/var/logが出来るようで/var/log/pfclientが消える。