ながらく、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近く値上がりという異常な事態となり「資本が暴れた跡に残るは荒野」という心境。
半導体不足の流れで雑にRasPi買えなくなってしまったの、アメリカ国立公文書館で機密解除されてるうちに文献入手していれば一次資料で論文書けるのに政権交代して再び機密指定された後からその道に入ると当該の一次資料得られなくて辛いって話を思い出す。
— "にょる。" (@W53SA) 2022年5月7日
それはさておき、ようやく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_wdtのoptionsには設定が2つあります。不要ならmodprobeでのoptionsは不要。
WDTのfeedingはsystemdがやってくれるのでRuntimeWatchdogSecを設定。何処に書いてもいいけど、/etc/systemd/system.conf
に記入例があったのでシュッとコメントアウトを外す。
# /etc/systemd/system.conf RuntimeWatchdogSec=10
どうやら/dev/watchdog
をopenすることでWDTが開始するらしく、最低限の設定は今やsystemdだけで済むようです。
冷却ファンをつける
公式ケースにつけるファンが売ってます。
普通に電源を刺すと、蚊が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するピンで初期値はGPIO12temp
はファンを起動する温度を指定するところで初期値は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のUARTではどのUARTが出てるのかわかんなかったので、dtoverlay -h uart[2-5]
の結果と、書いてあるGPIOピン番をraspi-gpio func 0-3
みたいに放り込んで結果を見て書き足すとこんな感じ。ついでにファン固定部とコネクタが干渉してどうしようもなさそうなとこに色塗り。
ssh reverse tunnel
これはzennに書いたことをやっただけ。
/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してもそんなに時間がかからないので自前でやる。
ここを参考に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.ini
でlog_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
Release5見てもわかるように、armhfのbinaryしか提供されてない。Raspbianでは動いたけど、他のdistでは動かない6こともあるみたい。
fr24feed manual(PDF)見ると、/etc/fr24feed.ini
でlog-mode="0"
にするとログを吐かなくなるというので設定を入れた。あと、fr24feedのsystemd unit7はExecStartPreでdump1090-mutabilityを入れようとしたりディレクトリを作ったりしようとするので全部コメントアウト。
planefinder
https://planefinder.net/coverage/clientにdebがあるので落として入れる。こいつもarmhfしかない。
feederが自前でlog吐いてrotateするのでシュッとログを黙らせられない上にフォーラムでの返事もアレ8なので設定では出来ないと判断し、/var/log/pfclient
をsize=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
この辺を参考にして入れる。インストール時に/usr/local/share/adsbexchange
へADSBexchange/readsbとADSBexchange/mlat-clientをcloneしてビルドするので色々入る。
特にログファイルを吐いてる雰囲気はなさそうなので、このまま。
PushProx
NATを超えるために使ってる。オリジナルのやつをちょっといじったやつをGitHub Actionでビルドできるようにしていて、こいつもarm64に対応させる。
matrixでwindows/arm(64)?
をbuildしないようにするexcludeを使ってみた。説明のpartial match
ってのを見て早とちりしましたが文字列は完全一致なのでarm
とarm64
を書き並べる必要がある。
- コネクタハウジングを切り詰めると、もう少し頑張れる。↩
- systemdでtmp file/directoryの作成 - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ↩
- abcd567a/piaware-ubuntu-debian-amd64↩
- Disable piaware logging - FlightAware / ADS-B Flight Tracking - FlightAware Discussions↩
-
このファイルは
Content-Type: binary/octet-stream
になっているので、保存ダイアログが出る。↩ - ADS-B Exchangeにフィードする - がとらぼ↩
-
systemctl cat fr24feed
で確認できますが、こいつは/etc/systemd/system/fr24feed.service
に置かれています。↩ - 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.」とか返していてお前が気にするかなんて聞いてねぇんだわ。↩
- 実際はページサイズ単位に丸められるので1byte指定しても4096bytesぐらいで確保される。↩
-
tmpfsではなく
/dev/null
っぽいfsを探すと、abbbi/nullfsvfs: a virtual black hole file system that behaves like /dev/nullってのを見つけたけどkoをbuildせんならんので未検証。↩ -
実際にやってみると、
/var/log/pfclient
が出来た後に/var/log
が出来るようで/var/log/pfclient
が消える。↩