アップグレードのきっかけ
Raspberry Pi 3 Model B+ を何年か前に購入して以来、小規模な WEB サーバとして運用しているのだが、先日 Node.js 18 をインストールしようとしたところ GLIBC のバージョンが古くてコケた。
(以下のブログと同じ状況だった。)
nodeのv18を使ったらエラーになった(CentOS7)
そこで apt upgrade
を試してみようと思ったのだが、こっちもエラーになった。
E: リポジトリ http://raspbian.raspberrypi.org/raspbian stretch Release には Release ファイルがなくなっています。
Debian 9 (stretch) は 2022-07-01 に LTS も EOL を迎えていて、 Raspbian も stretch のレポジトリをいつの間にか他所に移していたらしい。
legacy materials moving from archive.raspbian.org to legacy.raspbian.org を読むに、 legacy.raspbian.org を参照すれば引き続き apt
は使えるようなのだが、いつまでも古い OS を使い続けられないので、 Debian 10 (buster) にアップグレードすることにした。
アップグレード
一応実機の型番を確認。
$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.3
OS アップグレードはこのあたりを参考にした。
/etc/apt/sources.list
と /etc/apt/sources.list.d/*
を手動で変更して
sudo apt update
sudo apt upgrade
する感じ。
時間がかなりかかりながらも、順調に進んでいるかに見えたのだが、、、
エラー発生
python3-sense-hat (2.4.0-1~bpo10+1) を設定しています ...
File "/usr/lib/python3/dist-packages/sense_hat/colour.py", line 185
explanation = f" (different device id detected: {id})"
^
SyntaxError: invalid syntax
dpkg: パッケージ python3-sense-hat の処理中にエラーが発生しました (--configure):
installed python3-sense-hat package post-installation script subprocess returned error exit status 1
処理中にエラーが発生しました:
python3-sense-hat
E: Sub-process /usr/bin/dpkg returned an error code (1)
invalid syntax と来た。 Python はある程度わかるのだが、ここに文法のエラーがあるとは全く思えなかった。そもそも文法エラーがあるようなライブラリを提供するわけないし。。。
GitHub のソースを見ると、 v2.4.0 ではたしかにそのようなコードになっているが、 v2.6.0 ではだいぶ変わっている。
しばらくいろいろ調べたのだが、深夜だったこともあり、頭が回っていなかったので諦めた。
そして翌日、目覚めた瞬間に思いつく。
「システムの Python が f-strings に対応していないバージョンなのでは?」
案の定、 f-strings は 3.6 で導入されたが、システムの Python は 3.5 だった。
apt
のアップグレード対象には Python が入っていなかったので、エラーになっている箇所にパッチを当ててみることにした。
--- colour.py 2023-11-09 09:27:16.529087729 +0900
+++ colour_patched.py 2023-11-09 09:32:32.205314267 +0900
@@ -182,7 +182,7 @@ class I2C(HardwareInterface):
explanation = "(sensor not present)"
raise ColourSensorInitialisationError(explanation=explanation) from e
if id != 0x44:
- explanation = f" (different device id detected: {id})"
+ explanation = " (different device id detected: {0})".format(id)
raise ColourSensorInitialisationError(explanation=explanation) from e
@staticmethod
def i2c_enabled():
sudo patch -p0 < colour.patch
の要領でパッチを適用して、再度 sudo apt upgrade
を実行し、無事終了した。
余談
その後、 sudo apt full-upgrade
を実施したところ、 Python 3.7 がインストールされた。
なので upgrade
を飛ばして、いきなり full-upgrade
を実施すれば回避できた問題だった模様。。。