やや今更感がありますが2024年6月にLTSサポート終了を迎えるbusterのRaspberry Pi OSをbullseyeにアップグレードした時に発生したエラーと対処をご報告です。
busterからアップグレード
しばらく取りかかっていなかったRaspberry Pi OS buster(Debian10 busterベース)で稼働するRaspberry Piのバージョンアップを実施することにしました。
busterは現在LTSサポートのフェーズに入っており、LTSサポートが終了する2024年6月にアップデートの提供が打ち切られます。それまでにバージョンアップしておきたいところです。
事前準備
今回は事前準備としてddコマンドでのバックアップを取得、予備在庫のmicroSDカードを用意してリストアし、「テスト用のクローン環境」を用意してアップグレードの試験をしてみることにしました。
Raspberry Piのddバックアップとリストアテストをやってみる - treedown’s Report
これならいざアップグレードで問題が起きても旧microSDに差し替えれば本番環境として秒で復旧できますし、ddのバックアップもあるのでいつでもスタートからやり直しが可能です。
対象のRaspberry PiはsambaサーバでUSB HDDに共有フォルダを用意してファイルサーバとして使っています。
実施前に「apt update」と「apt upgrade」を実行し、現行バージョンの最新の状態になっている状態からスタートです。
sources.list編集
まずは恒例のリポジトリ編集です。
最近テストで実施したときは、実際にインストールした環境から記述を調べて、</etc/apt/sources.list>の編集を実施していました。
テスト環境でDebian10⇒11アップグレードの確認・テスト - treedown’s Report
テスト環境でDebian11⇒12アップグレードの確認・テスト - treedown’s Report
今回は伝統的なやり方である、旧バージョンbusterの記述をbullseyeにviで書き換える方法でsources.listの編集を実施します。
--------------------------------------------------------------
$ cat /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
$ cat /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ buster main
--------------------------------------------------------------
これを以下のように書き換え。(busterのところをbullseyeに書き換えただけ)
--------------------------------------------------------------
$ cat sources.list
deb http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi
$ cat ./sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ bullseye main
--------------------------------------------------------------
アップグレード実施
早速アップグレードを実行していきます。
$ sudo apt update
で更新、まずはシステムの最小アップグレードを実行します。
$ sudo apt upgrade --without-new-pkgs
--------------------------------------------------------------
root@raspberrypi:/etc/apt# apt upgrade --without-new-pkgs
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
(中略)
udev (241-7~deb10u9+rpi1) のトリガを処理しています ...
ca-certificates (20210119) のトリガを処理しています ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
initramfs-tools (0.140) のトリガを処理しています ...
root@raspberrypi:/etc/apt#
--------------------------------------------------------------
特にエラーもなく完了。つづいてシステム全体をアップグレードします。
$ sudo apt full-upgrade
--------------------------------------------------------------
root@raspberrypi:/etc/apt# apt full-upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
(中略)
perl-modules-5.28 (5.28.1-6+deb10u1) を削除しています ...
rpi.gpio-common:armhf (0.7.0-0.2+b1) を削除しています ...
usb.ids (2024.01.20-0+deb11u1) を削除しています ...
man-db (2.9.4-2) のトリガを処理しています ...
mailcap (3.69) のトリガを処理しています ...
libc-bin (2.31-13+rpt2+rpi1+deb11u8) のトリガを処理しています ...
root@raspberrypi:/etc/apt#
--------------------------------------------------------------
こっちもエラーなく終了しました。
あとは、残存した不要なパッケージを
$ sudo apt autoremove
で削除しておきます。
バージョン確認
バージョンbusterだったRaspberry Pi OSのアップグレードは無事エラーもなく完了。
バージョンアップの結果を確認してみようと思います。
--------------------------------------------------------------
# cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
--------------------------------------------------------------
# cat /etc/debian_version
11.9
--------------------------------------------------------------
バージョンは無事Debian 11 bullseyeベースであるRaspberry Pi OSにアップグレードできたようです。
最後に
# systemctl reboot
でシステムを再起動して動作確認します。
再起動後にSSHが繋がらない?
Raspberry Piを再起動して起動時のコンソール画面を見ていたら、プロセスの一部でFAILエラーが出ていることに気づきました。
メッセージ:
--------------------------------------------------------------
[FAILED] Failed to start DHCP Client Daemon.
See 'systemctl status dhcpcd.service' for details.
--------------------------------------------------------------
何回か起動を試みるも「Stoped DHCP Client Daemon」とあるのでプロセスの起動が停止しているようです。
調べてみたら、これです。
■Fix error "Failed to start DHCP Client Daemon" after upgrade to "Bullseye" remote?
https://raspberrypi.stackexchange.com/questions/133376/fix-error-failed-to-start-dhcp-client-daemon-after-upgrade-to-bullseye-remot
ここからのリンクするページが以下
■Updated to Bullseye, needed to change my dhcpcd.conf
https://www.reddit.com/r/pihole/comments/pr64gg/updated_to_bullseye_needed_to_change_my_dhcpcdconf/
簡単にまとめると、「この"Failed to start DHCP Client Daemon" エラーの修正は、"Updated to Bullseye, needed to change my dhcpcd.conf"に記載があるようにconfファイルを修正する必要があります。
早速確認してみると
--------------------------------------------------------------
$ cat /etc/systemd/system/dhcpcd.service.d/wait.conf
[Service]
ExecStart=
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w
--------------------------------------------------------------
記載の通り、これを編集する必要があるようです。(bullseyeでパスが変わったってことのよう)
$ sudo vi /etc/systemd/system/dhcpcd.service.d/wait.conf
で以下のように編集。
--------------------------------------------------------------
$ cat /etc/systemd/system/dhcpcd.service.d/wait.conf
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpcd -q -w
--------------------------------------------------------------
再起動すると"[FAILED] Failed to start DHCP Client Daemon."は発生せず、無事プロセスが起動してきました。
スタティックIP設定が有効じゃない?
"[FAILED] Failed to start DHCP Client Daemon."は解消したものの、依然SSH接続ができないことに気づきました。コンソール画面でエラーは出ていないので通信はしているはずなのですが、なんでしょう。
コンソール画面で直接ログインして「ip a」コマンドでNICの状態を確認したところ、DHCPで取得した動的IPが割り当てられていることが分かりました。ん?静的IP設定をしているはずなんですが。
ファイル</etc/dhcpcd.conf>の末尾に、
--------------------------------------------------------------
interface eth0
static ip_address=192.168.x.xx/24
static routers=192.168.x.x
static domain_name_servers=192.168.x.x
--------------------------------------------------------------
※「x」の部分は実際に使っているローカルIPアドレスの数値が入っています。
こういう感じで静的IP設定を実施しています。これが有効になっていないようです。
もう一度、「ip a」コマンドの実行結果をよく見てみると、
「eth0」だった箇所が「enxb000xx000x00」という感じに書き換わっています。
これは最近のRaspberry Pi(Debianでもそうだったような気がする)ではenx000xxx...というMACアドレスベースでのNIC名になっていることが要因のようです。
IP設定としては</etc/dhcpcd.conf>にNIC名「eth0」で指定しているから、その設定は読み込まれず、DHCPから取得したIPアドレスをRaspberry Piは使っている、という動きをしているようでした。
そこで、さしあたって</etc/dhcpcd.conf>を、
sudo vi /etc/dhcpcd.conf
で以下のように編集しました。
--------------------------------------------------------------
$ cat /etc/dhcpcd.conf
(中略)
#interface eth0
interface enxb000xx000x00
static ip_address=192.168.x.xx/24
static routers=192.168.x.x
static domain_name_servers=192.168.x.x
--------------------------------------------------------------
※繰り返しになりますが、上記は実際のファイルの内容を加工しています。
これで再起動、電源OFFからの起動が正常なことを確認したいので、「systemctl reboot」でOSを再起動して正常動作を確認します。
これで起動してきたOSから「ip a」でIPアドレスの確認をすると、
--------------------------------------------------------------
$ ip a
(中略)
2: enxb000xx000x00: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether
inet 192.168.x.xx/24 brd 192.168.x.255 scope global noprefixroute enxb000xx000x00
valid_lft forever preferred_lft forever
(以下略)
--------------------------------------------------------------
無事、</etc/dhcpcd.conf>で指定したスタティックIP設定で起動してくることが確認できました。良かった。
せっかくだから…
ここまででbusterからbullseyeへのアップグレードが無事完了。
テスト環境として用意したものの、なんか本番環境として動作は問題ないように思えてきました。
せっかくバックアップをddとmicroSDの二重に取得して容易に復旧可能な状態にしたので、せっかくなら、さらに11(bullseye)からの⇒12(bookworm)へのアップグレードを進めてみようと思います。後日記事予定。
追記:
同じRaspberry Piでbookwormアップグレードまで実施してみました。