Raspberry Pi + GPS + NTP

使い古されたネタだとは思うが、意外と情報は少なく躓いたところも多かったので記録に残しておきます。

GPS受信機

秋月電気で売っているGPS受信機キット 1PPS出力付き 「みちびき」3機受信対応を使いました。GPSモジュールに太陽誘電のGYSFDMAXBを使い、受信機にはMedia Tek のMT3339が使われているようです。この受信機でGPSのL1電波を受信して、NMEAのフォーマットでシリアル信号にして出してくれます。

電池ホルダーとピンヘッダだけはんだ付けしました。ピンヘッダーは5V,GND,RXD,TXD,1PPSの順に並んでいます。RXD,TXDをシリアルに、1PPSは3次元測位をすると1秒毎にパルスが発信されるので、Rasberry Piの適当なGPIOにつなぎます。

電池はGPSをコールドスタートさせると時間がかかるので、衛星のデータ(アルマナックとエフェメリス)を保持しておくためのものです。なくても動きます。

Raspberry Piとの接続

Raspberry Pi のGPIOは2,4,6,8,10番ピンがうまい具合に、5V,GND,UART_TXD0,UART_RXD0,GPIO18と並んでいます。今回のGPSモジュールを順番につなげて、GPIO18を1PPSの入力に使えば、なんの工夫もなくフラットケーブルでちょうど繋げれます。

Raspberry Pi の準備

Raspberry Piのシリアルポート

Raspberry Pi (3とzero WなどのBluetoothがあるRasPi)のシリアルポート用に使う半導体は、PL011とmini UARTという回路で実装されています。Raspbian OSでは、シリアルポート(ttyS0)はデフォルトでオフになっていて使えないが内部的にはminiUARTにつながっています。一方PL011はBluetooth用に使っています。

/dev/serial0 (primary UART) -> /dev/ttyS0 -> mini UART (通常は有効化されていない)
/dev/serial1 (secondary UART) -> /dev/ttyAMA0 -> PL011 -> bluetooth

ちなみにAMAとはarmのAMBAというアーキテクチャの略でAdvanced Microcontroller Bus Architectureのことらしい。この実装がPL011ということ。

mini UARTはGPUとコアクロックを共有しています。GPUのクロックは動的に変化するため、mini UARTをシリアルポートに使うとボーレートが変化してしまい、これでは外のデバイスからデータを取得するには不都合があります。一方PL011はGPUのクロックの影響を受けません。前述のとおり、PL011はBluetoothで使用中のため、次の3つのいずれかの方法を取る必要があります。
a) Bluetoothの運用を止めPL011をシリアルポート用に使う。
b) Bluetoothはmini UARTを使い、PL011をシリアルポート用に使う。
c) Bluetoothはそのままにして、mini UARTのクロックを固定して使う。
最後のc)の方法はmini UARTをシリアルポートとして使うには制限が多いので今後の事を考えて使わないことにします。取れる方法はa)かb)の二択になります。

Raspbianでは/dev/serial0はLinuxのコンソールに割り当てらていて、これを別の目的で使うには/dev/serial0とコンソールを切り離さなければなりません。

Rassoberry Pi の設定

コンソールとシリアルの切断

Linuxのコンソールがシリアルに割り当てられているので、これを切り離します。(実際にはttyサービスが動いていないので、シリアル経由でログインはできない設定になっている。)切り離す方法として、1)raspi-configコマンドでやる方法と、2)マニュアルで/boot/cmdline.txtを編集する方法法があります。これをやることによって、シリアルでのコンソール接続が不能になりますが、通常はsshなどでログインしていると思うのでなんの問題もないと思います。

1)raspi-configコマンドを管理者権限で立ち上げて、Interfacing Options、Serialと進みNoを選択する。

2)/boot/cmdline.txtを編集する場合は適当なエディタで開いて、console=serial0,115200を探し出してこれを削除する。他の記述はそのまま残しておく。

どちらの方法でも有効化するには再起動が必要となります。次に先に述べたGPSをシリアルにつなぐいずれかの方法を実行します。今回はb)を選びました。

a) Bluetoothを停止する方法

/boot/configを変更する必要があります。dtoverlay=pi3-disable-btを追加します。
再起動後これによりBluetoothが停止されます。一方、GPIOの6,8番ピンが自動的に/dev/serial0 -> /dev/ttyAMA0 として再割り当てされます。その後にモデムの初期化とUARTとの通信の無効化のためにsudo systemctl disable hciuartをします。

b) Bluetoothをmini UARTで使う方法

もう一つの方法が、mini UARTを使ってBluetoothを動かす方法です。これも/boot/config.txtを編集して、dtoverlay=pi3-miniuart-btを追加します。更にクロックを固定するためにcore_freq=250の記述も追加しておきます。
再起動後miniUARTとPL011が入れ替わり、GPIOの6,8番ピンが/dev/serial0 -> /dev/ttyAMA0として再割り当てされます。
余談ですがc)のmini UARTをserial0として使うときは、GPIOのUARTを有効化(enable_uart=1)することでmini UARTのクロックは自動的に固定化されるため、core_freq=250の記述は必要ありません。

b)の操作によってシリアルとBluetoothの関係は以下のようになります。今回のGPSモジュールは上段のserial0につながることになります。

/dev/serial0 (primary UART) -> /dev/ttyAMA0 -> PL011 (GPIOのUART)
/dev/serial1 (secondary UART) -> /dev/ttyS0 -> mini UART -> bluetooth

PPS信号の受信

PPS信号の受信は前述したとおりGPIO18(ピン番号12)で入力する。後でわかったことですが、PPSのありなしで、NTPの安定度(offsetやJitter)にほとんど影響はありませんでした。

設定は/boot/configにdtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=trueを追加するのと、/etc/modulesにpps-gpioを追加してppsのカーネルモジュールを読み込んでおきます。
assert_falling_edge=trueはアクティブLowで、つまりパルスは立ち下がりのときに発信されるので、その設定です。(参考

NTPの設定

関連ツールのインストール

シリアル経由でGPSのNMEAフォーマットもPPSの信号も取り出せるようになったので、このままNTPのソースに使ってもいいのですが、NTP以外でも使えるようにしたり(直接シリアルから読んでしまうとNTPがシリアルを専有してしまい、時刻以外の位置情報などが全く取れなくなってしまう。)、NMEAのフォーマットを読みやすい形に変換してもらうために、gpsd,gpsd-clientsのインストールを行います。

gpsdはシリアルに吐き出されるGPSからの信号をtcpの2947番ポートを通して使えるようにしてくれ、また、NTPにおいては127.127.28.uのシェアードメモリ経由で時刻の情報を提供してもらえるようになります。

gps-clientsはgpsdで配信してくれる情報をモニターしてくれるgpsmonコマンドなどが提供されます。

gpsdは/etc/default/gpsdに設定ファイルがあり、今回はGPSデータのソースとしてDEVICES="/dev/serial0 /dev/pps0"の設定を追加しました。また、GPSD_OPTIONS="-n"としてシェアードメモリを介してNTPを同期させるための設定を入れておきます(参考)。

gpsdはインストールしただけでは自動起動してくれないようなので、sudo systemctl enable gpsdなどで自動起動の設定をしておきます。ちなみにこれを忘れるとntpq -pなどで見てもいつまで経ってもGPSがdelay,offset,jitterが0.000のままで同期しません。gpsmonなどで確認するとgpsdが動いてしまうので、問題ないように見えてしまう。しばらくこれで悩みました。

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 SHM(2)          .GPS.            0 l    -   16    0    0.000    0.000   0.000
xPPS(0)          .PPS.            0 l   14   16  377    0.000   -2.582   0.459
 ntp.nict.jp     .POOL.          16 p    -   64    0    0.000    0.000   0.002
-ntp-a2.nict.go. .NICT.           1 u    9   64    3    9.904    0.021   1.391

シェアードメモリの様子はipcs -mコマンドで見ることができます。

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x4e545030 0          root       600        80         1                       
0x4e545031 32769      root       600        80         1                       
0x4e545032 65538      root       666        80         1                       
0x4e545033 98307      root       666        80         1                       
0x4e545034 131076     root       666        80         1                       
0x4e545035 163845     root       666        80         1                       
0x4e545036 196614     root       666        80         1                       
0x4e545037 229383     root       666        80         1 

0x4e545030から始まるメモリーがgpsdのシェアードメモリで、最後の一桁がユニット番号(u)で、ここでは7まで見えています。0,1はownerがrootでpermsが600なので、root権限がないと読めません。今回はユニット2が使えそうなのでこれを使うことになります。

NTPの設定とインストール

パッケージのNTPをインストールします。今回のバージョンはntpd 4.2.8p12@1.3728-o (1)です。

設定は/etc/ntp.confですが、追加で記述したのは以下になります。

server 127.127.28.2 minpoll 4 maxpoll 4  prefer
fudge 127.127.28.2 time1 0.000 refid GPS
server 127.127.22.0 minpoll 4 maxpoll 4
fudge 127.127.22.0 refid PPS

1行目と2行目がGPSの設定です。gpsdのシェアードメモリから読む設定で、ユニット番号は2です。このとき参照するアドレスが127.127.28.2になります。ntpのドキュメントが参考になります。gpsdは127.127.46.0でも時刻情報を出しているようですが、こちらは試していません。
minpollとmaxpollの値はgpsdの推奨のままです。この値だと2^4で16秒間隔で読みに行きます。
preferは必須のようです。
fudgeのtime1は手動でoffsetを設定するときの設定ですが、今回は0です。

3行目と4行目がPPSの設定です。/dev/pps0で読めるデータですが、ntpでは127.127.22.0がそれに当たるようです。gpsdでもserverのモードを指定すれば読めるようですが、今回は直接127.127.22.0で読みました。

あと、他のNTPの設定でもやるアクセスコントロールやインターネットのサーバ指定などはお好きにどうぞです。

結果確認

起動させたあとしばらくするとGPSが衛星を補足して、reachが377になる頃(3分ほど)経つと、GPSで時刻同期が実現します。ntpq -pコマンド確認します。

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*SHM(2)          .GPS.            0 l    -   16  377    0.000    0.004   0.002
oPPS(0)          .PPS.            0 l   13   16  377    0.000    0.002   0.002
 ntp.nict.jp     .POOL.          16 p    -   64    0    0.000    0.000   0.002
+ntp-a2.nict.go. .NICT.           1 u   28   64  377    6.401    0.987   2.171
+ntp-a3.nict.go. .NICT.           1 u   27   64  377    8.572    1.191   1.557
-ntp-b2.nict.go. .NICT.           1 u   29   64  377   10.725    2.783   1.308
-ntp-b3.nict.go. .NICT.           1 u   18   64  377   10.519    2.685   1.352
-ntp-a2.nict.go. .NICT.           1 u   22   64  377    8.623    2.046   1.910
-ntp-a3.nict.go. .NICT.           1 u   18   64  377   11.298    2.499   2.275

1行目のSHMがGPSの状態です。先頭に*がついているので、同期サーバになっています。2行目のPPSの先頭にoがついているので、参照されていることがわかります。

また、ntpq -c rvコマンドでも状態がわかります。

associd=0 status=0118 leap_none, sync_pps, 1 event, no_sys_peer,
version="ntpd 4.2.8p12@1.3728-o (1)", processor="armv6l",
system="Linux/4.19.57+", leap=00, stratum=1, precision=-19,
rootdelay=0.000, rootdisp=1.180, refid=PPS,
reftime=e0dfee76.435da06f  Mon, Jul ** 2019 17:12:38.263,
clock=e0dfee82.d4c99980  Mon, Jul ** 2019 17:12:50.831, peer=5249, tc=4,
mintc=3, offset=0.002763, frequency=-7.570, sys_jitter=0.001907,
clk_jitter=0.002, clk_wander=0.001, tai=37, leapsec=201701010000,
expire=201912280000

1行目でsync_ppsとなっているので、PPSで同期していることがわかります。インターネット経由のNTPだとここがsync_ntpとなります。

offsetもjitterもmsec表示なので一桁usec(micro second)の精度が出えているようです。インターネット経由はNICTのサーバを使用していますが、だいたい3桁のオーダで正確なようです。

真ん中のギザギザしているのがインターネットのNTP(ntp.mict.jp) を参照してきたときの、DelayとOffsetとJitterのグラフ。おおよそ数msecの値です。前後は、0のように見えますが、GPSを参照していたときのグラフで、数μsecです。ほとんど0に見えます。

Raspberry Pi B で監視カメラ

古いラズパイの有効活用

気がついたら家にラズパイがゴロゴロ転がっていたので、一番古いRaspberry Pi model Bを使って、ペット用の監視カメラを作ることにした。ラズパイのバージョン1で、CPUは遅いしメモリも512MBしかないので、実用になるかどうかが心配。

# cat /proc/cpuinfo
processor : 0
model name : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 697.95
Features : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7
Hardware : BCM2835
Revision : 000d
Serial : 0000000039ab319d

カメラはラズパイの基盤に直接取り付ける純正のカメラ

OSのインストールと設定

OSは2019-06-19に出たばかりのRaspbianのbuster。ダウンロードして、SDカードに書き込んで、基本的な設定を終了させる。最近は最低限の設定はansibleでノンストップで進めている。基本的な設定以外に必要な設定は、カメラの認識ぐらい。

$ sudo raspi-config

mjpg-streamerの設定

ラズパイの監視カメラとして定番っぽいmjpg-streamerを導入。

$ sudo aptitude install git cmake libjpeg8-dev gcc g++
$ git clone https://github.com/jacksonliam/mjpg-streamer
$ cd mjpg-streamer/mjpg-streamer-experimental/
$ make
$ sudo make install

起動用のシェルスクリプトをroot権限で動かすように作る。一般ユーザーだとカメラデバイスへの読み書きの権限を着ける必要がある。このラズパイは監視カメラ専用にするので、rootで起動させる。以下のスクリプトを用意。

!/bin/bash
LIB=/usr/local/lib/mjpg-streamer
WWW=/usr/local/share/mjpg-streamer/www

AUTH_USER=user
AUTH_PASS=password

/usr/local/bin/mjpg_streamer -o "$LIB/output_http.so -c $AUTH_USER:$AUTH_PASS -w $WWW/" -i "$LIB/input_raspicam.so -x 640 -y 480 -rot 180 -fps 15 -q 10 -ex verylong -ev 10"

/root/run.sh

mjpg-streamerはwebサーバも内蔵しているので、そのままそれを利用。設置位置の関係から-rotで画像を180度回転させている。-ftpでフレームレートを指定している。結果的にはこのレートでも問題なく稼働できた。

起動時に自動実行するために以下のファイルを用意。

[Unit]
Description=mjpg-streamer

[Install]
WantedBy=multi-user.target

[Service]
User=root
Group=root
ExecStart=/root/run.sh

/etc/systemd/system/mjpg-streamer.service

以下のコマンドで自動起動するようにしておく

$ sudo systemctl enable mjpg-streamer

webサーバはport 8080 で起動しているので、http://hogehoge:8080で見られる。
外から見られるように、他のサーバからリバースプロキシを通しておく。

Mac OSX のインターフェースに複数のアドレスを割り当てる方法

OSXで複数のIPv6アドレスを割り当てたい

自宅のネットワークがIPoEによりIPv6ネイティブ接続になったので、クライアントであるMacにIPv6のアドレスを割り当てようとしました。今回割り当てようとしているIPv6アドレスは、機器に勝手に割り当てられるリンクローカルアドレス(fe80::/64)と、IPoEのRAでふってくるGUA(Global Unicast Address:今回は2409:252::/64)と、いわゆるプライベートアドレス的なULA(Unique Local Address:fd00::/48)の3つです。

リンクローカルアドレスは問答無用で割り当てられるので無視ですが、残りの2つは設定のネットワークを見てもどちらか一方しか割り当てられないように見えます。TCP/IPの設定のIPv6の設定は自動化か、手入力か、リンクローカルのみの三択です。自動はGUAの割当のことです。

さらにULAを割り当てたい場合は、左のペインで「+」を押して、インターフェースを増やします。今回の場合はWi-Fi 2という名前です。

この新しくできたインターフェースのTCP/IPの設定でIPv6の手入力を選択し、ULAを入力します。IPv4の設定や、DNSの設定は全て空白のままでいいです。

/sbin/ifconfigで見ると、IPv6のアドレスが追加されていました。

Netatmoで屋内のCO2を監視する

Netatmoはフランス生まれの気象観測ガジェット。日本でも販売しており、手軽に温度、湿度、気圧、二酸化炭素濃度などが測れます。

二酸化炭素濃度は室内を測っているのだけれど、生活の中ですごく変化する様子が面白い。屋外の濃度はおおよそ400ppmなのだが、室内で窓を閉め切ると人間の呼吸だけであっという間に600〜800ppmほどになります。さらに、調理などでガスコンロを使うとあっという間に1000ppmを超え、冬場の石油ストーブなどは締めきった部屋で使うとみるみる2000,3000ppmと上がっていき見ているだけで息苦しくなる気がします。

通常、1000ppm以下が快適とされている二酸化炭素濃度ですが、Netatmoで計測できても気軽に知る方法がありません。スマホアプリがあるので、スマホのウィジェットやタブレットなどに表示させておけるのですが、それでも見にくい。というわけで、7セグメントLEDとraspberry piを使い常時表示させるガジェットを作りました。

続きを読む

Raspberry pi zero w のネットワーク設定

無線の設定

Raspberry pi zero w は無線のインターフェースしかないので、最初のセットアップはモニターとキーボドを繋いでやるのが無難。起動したらまずは無線の設定から始める。

raspi-configで無線のSSIDとPASSWORDは設定できるので、/etc/wpa_supplicant/wpa_supplicant.conを確認しておく。もし、うまく設定できなかったら手動で以下のコマンドでもできる。

sudo wpa_passphrase SSID PASSPHRASE | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

問題はパスフレーズ。’!’などの文字が入っているとコマンドが正常に認識されないので、SSIDやパスフレーズなどは’で囲っておく。

ファイルのパーミッションは念のために600にしておくのが良いだろう。(上のコマンドのままだとPSKの平文が残る。念のためにhistoryも消しておくのが良かろう)

固定アドレス

固定アドレスはかつては/etc/network/interfacesで設定していたが、最近は/etc/dhcpcd.confでやるのが推奨されているらしい。以下を追加しておく

interface wlan0
statuc ip_address=192.168.0.79/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.75

無線はwlan0のインターフェース。

 

SlackのログをEvernoteに定期的にクリップ

Slackのログはライフログ

家庭内Slackを使い始めて2年ぐらいたつんですけど、無償版のSlackは発言が1万しか保存されません。一日30発言で1年ぐらいしか持たないので、結構少ないです。あとから、見返したいときにもうなくなっています。こいつはもったいないので、Evernoteに保存したいと思います。

SlackからEvernoteへの連携

SlackとEvernoteの連携はiftttとか使わなくても公式で連携があります。今回はこれを使います。連携を済ませると新たなスラッシュコマンドが追加されて、コマンドでSlackの発言をEvernoteに保存できます。/clip yesterday とやると昨日の分のチャネルの発言がEvernoteに保存されます。残念ながらノートブックは選べません。ライフログ用のノートブックを既定のノートブックにしました。

Cronで実行

このコマンドを手で入力ではなく、深夜0時を回った時に自動で実行します。Slack API のchat.postMessageでは発言はできますが、コマンドは実行してくれません。「/clip yesterday」という発言をするだけです。かわりに chat.command を使います。

1 0 * * * /usr/bin/curl -X POST "https://{domain}.slack.com/api/chat.command?token={token}&channel={channel_id}&command=/clip&text=yesterday"

channel_idの取得は https://qiita.com/Yinaura/items/bd28c7b9ef614696fb7e ここを参考にさせていただきました。

Mac OSX High Sierra にすると謎のパージ可能領域が消せない件

重い腰を上げてHigh Sierraにアップデート

Mac OSX のメジャーバージョンアップはいつも少し憂鬱。バージョンアップで動かなくなるソフトが出るのは承知のとおりだが、私の使っている大半のソフトはリリースまでに対応済みのことが多い。

問題は仮想化のVMware Fusionである。OSのバージョンアップのたびにVMwareのバージョンも上がり、毎回安くはないアップデート費用を取られる。それほど頻繁にVMwareを使うわけではないので、バージョンアップには乗り気になれない。そんなわけでVMware FusionからVirtualBoxに乗り換えたのだが、それはまた別の話。

ハードディスクのパージ可能領域

High Sierraにアップデートをした直後からハードディスクがみるみる減っていく。不要ファイルを消したり再起動しても一向に空き領域は増えず、むしろ時間とともに減っていく。いくらなんでもおかしいと思い調べたところ、パージ可能領域というのが圧迫しており、これがTime Machineと関係していることが判明した。このパージ可能領域を簡単に削除する方法が簡単ではなかった。

Time MachineはMacのバックアップソリューションだが、ノートパソコンなどではたまに外付けハードディスクをつけてバックアップすることが多いと思う。そんな運用が多いのはお見通しなのか、High Sierraからは外付けハードディスクがない間は内蔵ディスクにローカルスナップショットを保存取得しておく設定がデフォルトになった。これがパージ可能領域の正体だった。

ローカルスナップショットの確認と削除方法

まずはローカルスナップショットの確認

$ tmutil listlocalsnapshots /
com.apple.TimeMachine.2017-11-18-104524
com.apple.TimeMachine.2017-11-18-123140
com.apple.TimeMachine.2017-11-18-183524

ここでは3つのスナップショットが見つかった。削除方法は以下の通り。

$ tmutil deletelocalsnapshots 2017-11-18-104524
Deleted local snapshot '2017-11-18-104524'

これでパージ領域がなくなったはずだ。

ローカルスナップショットの停止方法

残念ながら、停止方法はわからなかった。Time Machineそのものを止めてしまえば、これ以上スナップショットが増えない。もしくは空き領域が極端に少なくなると自動的に削除されるそうだが、こちらは検証していない。

Raspberry piにmirakurunとchinachuをインストール

ハード

  • raspberry pi
  • PX-S1UD V2.0
  • ACR39-NTTCom(USBカードリーダー)

チューナーの設定

http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zipをダウンロードして、ファームウェアをコピーする
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware
続きを読む

Raspberry pi インストールメモ

ハード

  • Raspberry pi 2 B+
  • micro SD 8GB
  • 無線LANアダプター(WDC-150SU2MBK)
  • Macbook (SDカード書き込み用)

Raspbianの書き込み

https://www.raspberrypi.org/downloads/raspbian/ からRASPBIAN STRETCH WITH DESKTOPをダウンロード。今回のダウンロードは2017-09-07-raspbian-stretch.zipというファイル。念のためにチェックサムを確認。

$ shasum -a 256 tmp/2017-09-07-raspbian-stretch.zip 
a64d742bc525b548f0435581fac5876b50a4e9ba1d1cd6433358b4ab6c7a770b tmp/2017-09-07-raspbian-stretch.zip
続きを読む

ssh-agentとpkcs11をmacOSXで使う

すごくわかりにくいタイトル

YubikeyにSSHの秘密鍵を入れて、ローカルのハードディスクに鍵は置かないといころまではうまく行った。つぎにあちこちのPCやらサーバから鍵を消しまくりたいのだが、接続した先のサーバから別のサーバに接続なんてケースはママある。ということでssh-agentの登場となるわけですが、ssh-agentにファイルとして存在していない鍵(Yubikeyのようなスマートカード)をどう追加するかという話。

ssh-add -s /usr/local/lib/opensc-pkcs11.so

これで行けることはわかっているんですが、Macだとどうしても動いてくれない。どうやらssh-agentのマニュアルを読むと-Pオプションで、信頼できるpkcsライブラリで指定するらしい。これがデフォルトだと/usr/lib*/*と、/usr/local/lib*/*になっているようで、上のopensc-pkcs11.soも問題ないじゃないかと思っていのだが、MacOSXの場合はHomebrewでopenscをインストールしており、上記のパッケージもシンボリックリンクでおいてあった。

-Pオプションにオリジナルの場所を追加しようとしたのだが、どうもうまく行かず、非常に安直なworkaroundだが、オリジナルをコピーして/usr/local/libにおいたらうまく動いた。

アップデートしたら動かなくなるかもしれないし、脆弱性があっても放置される可能性があるので、おすすめはできない。-Pオプションで解決したい。