treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Raspberry Pi OSをbusterからbullseyeへアップグレード

やや今更感がありますが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アップグレードまで実施してみました。

blog.treedown.net