先日Raspberry Pi OSの新版bookwormがリリースされました。公式には、RPI OSはクリーンインストールだけがサポートされていて、アップグレード方法については公開・検証されていません。ただ、RPI OSはベースがdebian linuxであるため、これまではdebianと同じ方法でおおむね問題なくアップグレードできていました。
ただ、今回のbookwormについては少し状況が異なるかもしれません。先日のリリースノートの日本語訳を見てみましょう。
ポイントはこちらです。
- raspberrypi-kernelからDebianベースのカーネルパッケージ(linux-image-rpi-*)に切り替えられました
- raspberrypi-bootloaderからDebianベースのファームウェアパッケージ(raspi-firmware)に切り替えられました
- /bootマウントポイントが/boot/firmwareに移動しました
最後のマウントポイントが変わった部分がなかなかの曲者です。今回のアップグレードでは、これを踏まえた方法が必要になります。
今回のアップグレードは主にこちらを参考にしました。ただ、これをそのまま当てはめるとパッケージが多量にアンインストールされてしまう(その後、改良されたみたいです)ので、独自にアレンジしたものを紹介します。
警告
アップグレードの概要
全体の概要は以下になります。なお検証は、RPI 4Bにbullseyeをクリーンインストールして行いました。32bitの場合と64bitの場合とで手続きが違う部分があるので注意してください。
# bullseyeをアップデート
sudo apt-get update && sudo apt-get dist-upgrade
# raspberrypi-kernel, raspberrypi-bootloaderをアンインストール
/var/lib/dpkg/statusを編集(下記参照)
sudo apt remove raspberrypi-kernel raspberrypi-bootloader
# マウントポイントを変更 /boot => /boot/firmware/
sudo umount /boot
sudo cp -p /etc/fstab /etc/fstab.bullseye # バックアップ
/etc/fstabを編集(下記参照)
sudo systemctl daemon-reload
sudo mkdir /boot/firmware
sudo mount /boot/firmware
# リポジトリをbullseyeからbookwormに書き換える
sudo cp -pr /etc/apt /etc/apt.bullseye # バックアップ
sudo sed -i -e 's/bullseye/bookworm/g' /etc/apt/sources.list
sudo sed -i -e 's/bullseye/bookworm/g' /etc/apt/sources.list.d/raspi.list
(64bitの場合だけ) sudo nano /etc/apt/sources.list で各行のnon-freeの後にnon-free-firmwareをつけ加える.
grep bullseye $(find /etc/apt -type f)
このgrepでbullseyeな部分が残っていないか確かめる。
もし残っていれば手動でbookwormに書き換える。
# raspi-firmware, linux-image-rpiをインストール
sudo apt update
sudo apt install raspi-firmware linux-image-rpi-v7l
(64bit版では linux-image-rpi-v8 ARMv6への対応が必要な場合はlinux-image-rpi-v6)
# 2024/6/25 追記
apt install dpkg
# 追記終わり
# すべてのパッケージをアップグレード
sudo apt -y full-upgrade && sudo apt -y autoremove && sudo apt -y clean
注)
- 途中でファイルの上書きについての質問が出るが、
判断がつかない場合はYで上書きした(<= デフォルトでリターンではない)
- 特にlightdm.confについての質問は、上書きしないと正常に起動しないので注意。
# /boot/firmware/config.txtを修正
sudo cp /boot/firmware/config.txt /boot/firmware/config.txt.orig # バックアップ
sudo nano /boot/firmware/config.txt
config.txtの最後の方の[all]の下に、以下を追加
auto_initramfs=1
# お疲れ様でした
sudo reboot
前半のマウントポイントの変更などがbookworm特有の処理になります。
/var/lib/dpkg/statusの編集について
この編集はその後に行う2つのパッケージ(raspberrypi-kernel, raspberrypi-bootloader)のアンインストールの前準備になります。編集なしでアンインストールすると、パッケージの依存性の関係で2つのパッケージ以外のパッケージが多量にアンインストールされてしまいます。それを防ぐために、/var/lib/dpkg/statusに記述されている依存性を一時的に書き換えます。
grep -n '^Depends: ' /var/lib/dpkg/status | grep raspberrypi-kernel
grep -n '^Depends: ' /var/lib/dpkg/status | grep raspberrypi-bootloader
を実行すれば、/var/lib/dpkg/statusのどこに、2つのパッケージの依存性が記述されているか分かります。以下はこのgrepの結果の例です。
8771:Depends: libc6 (>= 2.30), libdw1 (>= 0.158), libgcc-s1 (>= 4.2), libglib2.0-0 (>= 2.37.3), libgnutls30 (>= 3.7.0), libgstreamer-plugins-base1.0-0 (>= 1.14.0), libgstreamer1.0-0 (>= 1.18.0), libstdc++6 (>= 6), libudev1 (>= 183), libunwind8, libyaml-0-2, raspberrypi-kernel (>= 1:1.20211201~)
18124:Depends: raspberrypi-bootloader, libc6 (>= 2.17)
30451:Depends: libraspberrypi-bin, python3, binutils, raspberrypi-bootloader (>= 1.20190819), pciutils
30731:Depends: raspberrypi-bootloader, librtimulib-dev, python3-sense-hat
これらの依存性の記述をすべて修正します。
sudo nano /var/lib/dpkg/status
で編集。
Depends: raspberrypi-bootloader, libc6 (>= 2.17)
のような行を
Depends: libc6 (>= 2.17)
のように修正。
編集が終了したら、またgrepをかけて、正しく修正できているか確認してください。
手動で編集するのが嫌な人のために、スクリプトを用意しました。自己責任でお使いください(一応、一度はテストしました。ちなみに筆者はsedがあまり得意ではありません…)うまくいかない場合は、sudo cp -p /var/lib/dpkg/status.bullseye /var/lib/dpkg/status などして、手動でやり直してください。
#!/bin/bash
cd /var/lib/dpkg
test ! -f status.bullseye && sudo cp -p status status.bullseye
sudo sed -i -e 's/^\(Depends: .*\), \(raspberrypi-kernel\|raspberrypi-bootloader\) ([^)]*), \(.*\)$/\1, \3/' status
sudo sed -i -e 's/^\(Depends: .*\)\(raspberrypi-kernel\|raspberrypi-bootloader\) ([^)]*), \(.*\)$/\1\3/' status
sudo sed -i -e 's/^\(Depends: .*\), \(raspberrypi-kernel\|raspberrypi-bootloader\) ([^)]*)\(.*\)$/\1\3/' status
sudo sed -i -e 's/^\(Depends: .*\)\(raspberrypi-kernel\|raspberrypi-bootloader\) ([^)]*)\(.*\)$/\1\3/' status
sudo sed -i -e 's/^\(Depends: .*\), \(raspberrypi-kernel\|raspberrypi-bootloader\), \(.*\)$/\1, \3/' status
sudo sed -i -e 's/^\(Depends: .*\)\(raspberrypi-kernel\|raspberrypi-bootloader\), \(.*\)$/\1\3/' status
sudo sed -i -e 's/^\(Depends: .*\), \(raspberrypi-kernel\|raspberrypi-bootloader\)\(.*\)$/\1\3/' status
sudo sed -i -e 's/^\(Depends: .*\)\(raspberrypi-kernel\|raspberrypi-bootloader\)\(.*\)$/\1\3/' status
diff status.bullseye status
/etc/fstabの編集
これは簡単です。
sudo nano /etc/fstab
で
/boot => /boot/firmware
に書き換え。
いつも通りのアップデートでは、なぜまずいのか?
ここは興味がない方は読み飛ばして結構です。
bullseyeまでのアップデートは、リポジトリを書き換えてapt full-upgradeすればだいたいうまく行きました。Bookwormへのアップデートに関してもfull-upgradeするだけと紹介するページがたくさんあるので、それだけでも動くことは動くのではないかと思います。
ただ、この方法ではリリースノートに書かれたカーネルパッケージの変更や、マウントポイントの変更には対応できません。特にマウントポイントなどのディレクトリ構造の違いは致命的に思えます。今後のアップデートで新たなカーネルパッケージのインストールが必要になったとき、どのようなことが起こるのか予想がつきません。
ちなみにかなり強引に思える/var/lib/dpkg/statusの書き換えですが、その後のapt updateで、依存性は再計算されるのですぐに修正されてしまいます。アップグレード後に影響が残ることはないと思われます(この方法はこちらを参考にしました)。
Reboot後の調整
リブート後、問題がなければlightdmのログイン画面が表示され、ログインできるはずです。
ログイン後は、次のような調整を行いました。
sudo apt install at-spi2-core
xcompmgrを無効にする(必須ではありませんが、強くお勧めします)
rm -f /etc/xdg/autostart/xcompmgr.desktop
32bit環境では以下を実行してください。
cd /lib/arm-linux-gnueabihf; sudo ln -s ld-linux-armhf.so.3 ld-linux.so.3
chromiumでnetflix, amazon prime, spotifyなどの動画・音声が再生できないとき。
widevine(デジタル著作権管理)のライブラリがうまくアップデートされてないので、アンインストール後、再インストールしてください。
sudo apt purge libwidevinecdm0
sudo apt install libwidevinecdm0
最後にリブート
sudo reboot
xcompmgrの無効化についてはラズパイをwayland環境ではなくX11環境で利用する場合に、youtubeの再生画質を向上させるための設定です。
32bit版でのln -s についてはここらへんの話への対処となります。
Waylandの起動
BookwormではRPI 4Bと発売予定の5B上でwaylandが利用できます。これは
sudo raspi-config
して、Advanced Options > Wayland を有効にします。
Reboot後ログインで、waylandが起動するはずです。
Waylandでのキーボード設定
Waylandに切り替えた直後はキーボード設定がGB(イギリス)になっているようでした。これは メインメニュー > 設定 > Raspberry Piの設定 で ローカライゼーション タブを選択後、キーボードの設定から切り替えることができます。
X11で利用する場合にもfcitx5との兼ね合いで、日本語キーボードがうまく設定されない場合があります。そのような場合はこちらを参考に再設定してください。
Waylandでの音声
音声についてはログイン直後はうまく行かず、at-spi2-coreをインストールするなどして、何度か再起動するうちにいつのまにか音が出るようになりました。結局どのタイミングで音が出るようになったのか分からずじまいなのですが、とにかく私の環境では最終的に問題なく音が再生されています。
再び音声が再生されなくなったので、何度か再起動を繰り返したこともあったのですが、よく見たら音声がAV Jack側になっていただけだったということがありました(笑)。 どうしてもうまく音が出いない場合は、画面右上の音声アイコンを右クリックして、音声の出力先を確認してみてください。
ラズパイwaylandギャラリー
せっかくですので、bookwormにアップグレードしたラズパイで動くwaylandの雄姿をギャラリーにしていたのですが、あまりに長いので、こちらに移動しました。
まとめ
RPI 4Bのbullseyeをbookwormにアップグレードして、waylandを起動するところまでを説明しました。
考えてみれば、RPI 4Bの本当の本気の性能を見たのは、今回が初めてかもしれません。64bitで稼働する恩恵は実際のところ小さいようですが、waylandで解放されたgpu性能は「おまえほんとはもっとできる奴だったんだなー」と感心しきりです。
waylandになっても、pcmanfmやlxpanel(改めwf-panel-pi)を改修して、あのルックアンドフィールを守り続けようとするラズパイ財団のこだわりはすごいと思います…が、それほどいいルックアンドフィールかというと…ちょっと疑問、とかは言っちゃいかんか…(笑)
いつものことですが、新しいOSはちょっと使い込むといろいろつまずくところが出てくるので、そのあたりのポストをしばらく続けたいと思います。
10/24 追記
今回の記事は、こちらの方法を参考にさせていただいていることは、最初のポストから述べております通りです。
最初のあちらの方法は、そのまま当てはめると、多量のパッケージが依存性の関係でアンインストールされてしまう問題があり、それを解決するために独自にアレンジした方法を、こちらのブログに掲載していました。ただ、あちらの方法もその後改良され、パッケージの流出の問題は解決されたようです。あちらは、世界中のユーザーが、怒号の勢いで修正を進めているようで、見ていていろいろ勉強になります。
あちらとこちらの方法を比べると、現在でも以下の違いがあります。
- /boot => /boot/firmwareのマウントポイントの変更を前半にやってしまうか、あるいは最後にやるか。
- 依存性の問題をどう解決するか。
あちらは依存性の解決を、
sudo dpkg --purge --force-depends raspberrypi-kernel raspberrypi-bootloader
で行っていますが、こちらは/var/lib/dpkg/statusの書き換えで行っています。
/var/lib/dpkg/statusの書き換えは不格好なのですが、一度やってしまうと、依存性自体が抹消されているので、その後に依存性でエラーが出る心配をしなくていいぶん気分が楽というのはあります(あちらはforce-dependsで壊した依存性を、その後の手続きで修正していく必要があります。)一長一短という気がするので、こちらのページでは/var/lib/dpkg/statusの書き換えをそのまま残しておきたいと思います。
10/28 追記 「暫定版」という表記を取り除きました
こちらを参考にして始めたこのブログ記事ですが、元となったページの方法はその後かなり進化した後、現在ではほぼ安定期に入ったように思います。このブログ記事で実現されるアップグレード環境は、結果としてあちらの方法で実現される環境とほぼ同じと思われますので、こちらの方法も安定しているものと判断、これまで使っていた「暫定版」という表記をブログ記事から取り除きました。
暫定版であろうがなかろうが、実際のところ、ラズベリー財団はアップグレードを正式にサポートしていません。本ブログで説明したアップグレード方法については、自己責任ということで実行ください。
2024/6/25 追記、apt install dpkg を追加しました
「アップグレードの概要」の途中にapt install dpkgを追加しました。
これは去年の段階では必要なかったのですが、現在はこれを行わないと、full-upgradeの途中でdphys-swapfileなどのパッケージのインストールに失敗します。
dphys-swapfileは2024/3/11にアップデートされていますが、このときにパッケージの圧縮形式がzstd形式に変更されたものと思われます。bullseyeのdpkgはzstdに対応していないため、bookwormのdpkgに事前にアップグレードしてから、full-upgradeする必要があります。
コメント