NanoPi R5SにはメーカーよりfriendlycoreというUbuntu20.04ベースのOSが提供されています。通常20.04で困ることは無いと思いますが、systemd.network のIPv6SendRAオプションが20.04のsystemdでは使えないようなのでアップデートを試みます。
まずはUbuntuのアップグレード方法のおさらい
Ubuntuのバージョンアップグレードはdo-release-upgrade
を実行するだけです。
事前の手順としては、do-release-upgrade
がインストールされていなければupdate-manager-core
をインストールします。
その後、インストールされているパッケージを全てアップグレードし、不要パッケージを削除します。
概ね以下のような手順です。
$ sudo apt update
$ sudo apt install update-manager-core
$ sudo apt upgrade
$ sudo apt autoremove
準備が整えば、do-release-upgrade
を実行します。
途中いくつか質問がありますのでよく読んで対処すればアップデートは完了します。
$ sudo do-release-upgrade
さて、これでアップグレードは完了するのですが、これだけだと他に参考になるブログが多々公開されています。
NanoPi R5Sのfriendlycoreは/
が overlayになっています。これは下層の配布媒体。いわゆるファームウェアと呼ばれるものの上に書き込み可能なレイヤーを重ねてファイルシステムを提供しています。つまりこのままだと下層の20.04はそのままで上部の書き込み層に大量の変更が発生します。特に不都合はないのですがなんだかもったいない気がします。
そこで下の層、つまりファームウェアのファイル群を22.04にアップグレードしてしまいたいと思います。
イメージ作成環境を整える
まずはfriendlyelecが提供するイメージ作成環境を入手します。作成環境としてはLinux/amd64環境が必要です。筆者はUbuntu20.04の環境を使いました。
$ git clone https://github.com/friendlyarm/sd-fuse_rk3568
この中のbuild-kernel.sh を実行するとヘルプ表示されます。
$ ./build-kernel.sh
Usage: ./build-kernel.sh <buildroot|friendlycore-focal-arm64|debian-buster-desktop-arm64|debian-bullseye-desktop-arm64|friendlywrt22|friendlywrt22-docker|friendlywrt21|friendlywrt21-docker|eflasher>
# example:
# clone kernel source from github:
git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi5-v5.10.y_opt /home/okamoto/src/sd-fuse_rk3568/out/kernel-rk3568
# or clone your local repo:
git clone git@192.168.1.2:/path/to/linux.git --depth 1 -b nanopi5-v5.10.y_opt /home/okamoto/src/sd-fuse_rk3568/out/kernel-rk3568
# then
convert files/logo.jpg -type truecolor /tmp/logo.bmp
convert files/logo.jpg -type truecolor /tmp/logo_kernel.bmp
LOGO=/tmp/logo.bmp KERNEL_LOGO=/tmp/logo_kernel.bmp ./build-kernel.sh eflasher
LOGO=/tmp/logo.bmp KERNEL_LOGO=/tmp/logo_kernel.bmp ./build-kernel.sh debian-buster-desktop-arm64
./mk-emmc-image.sh debian-buster-desktop-arm64
# also can do:
KERNEL_SRC=~/mykernel ./build-kernel.sh debian-buster-desktop-arm64
# other options, build kernel-headers, enable/disable 3rd drivers:
MK_HEADERS_DEB=1 BUILD_THIRD_PARTY_DRIVER=0 ./build-kernel.sh debian-buster-desktop-arm64
指示にあるようにgithubからカーネルソースをとってきます。ヘルプに表示されたものをそのまま実行すれば、sd-fuse_rk3568/out以下にカーネルソースが配置されます。
カーネルオプションを変更する場合には以下のファイルに追加するのがよさそうです。
arch/arm64/configs/nanopi5_linux_defconfig
さて、ひとまずカーネルを作ってみましょう。
すると sd-fuse_rk3568/out 以下に rootfs_new というディレクトリが出来ています。
これは sd-fuse_rk3568/tools/update_kernel_bin_to_img.sh の中でrootfs.imgを展開して、カーネルを作った際に生成されたドライバ類を追記して新しいrootfs.imgを作るようです。ここに手を加えても毎回rootfs.imgから作り直されてしまうので処理を止めてしまいます。
update_kernel_bin_to_img.sh の49行目から62行目あたりにその処理があるのでバッサリ削除してしまいます。
これでrootfs_newが作り直されることはなくなります。自分用のカスタマイズした/etc/などを最初から用意しておけば再インストールが楽になります。
あとは、sd-fuse_rk3568 以下でカーネルを作ってイメージを作成すればできあがりです。
$ ./build-kernel.sh friendlycore-focal-arm64
$ ./mk-sd-image.sh friendlycore-focal-arm64
一旦SDカードで確認した方が良いと思いますが、問題なさそうならmk-sd-imgae.shのかわりにmk-emmc-image.shを実行すればeMMCへ書き込むイメージを作成してくれます。
rootfsをUbuntu22.04にアップグレードする
さて rootfs_new 以下にOSファイルがあるのですが、これをアップグレードしなければいけません。
ここにはDockerを使いますので実行環境を用意してください。但し、ターゲットアーキテクチャはaarch64です。aarch64のコンテナを稼働させる環境を用意しておく必要があります。NanoPi R5S自身で構築しても良いでしょう。
おススメの環境は Oracle Cloud無料枠で使用できる armインスタンスです。
aarch64のDockerが準備できたら先ほどの rootfs_new をインポートします。
out/rootfs_new 以下を一旦 tar形式(gzip圧縮可)に纏めます
$ sudo tar cvzf ../rootfs.tgz .
これで out にrootfs.tgzができるのでこれをarmインスタンスへコピーします。
次にこのファイルをdockerへインポートします
$ cat rootfs.tgz | docker import - friendlycore:2004
これで friendlycore:2004というイメージが生成されます。
起動します。
$ docker run -it --name friendlycore friendlycore:2004 sh
あとは、冒頭の手順に従ってUbuntu 22.04へアップデートします。
アップデートが終わると再度抽出します。
$ docker export firendlycore | gzip > rootfs.2204.tgz
これをsd-fuse_rk3568/out/rootfs_newに書き戻します。
$ cd ....sd-fuse_rk3568/out
$ sudo mv rootfs_new rootfs_new.orig
$ sudo mkdir rootfs_new
$ cd rootfs_new
$ sudo tar xvzf ....rootfs.2204.tgz
/etc/resolve.conf や /etc/hosts 等はDockerに上書きされてしまっているので必要に応じて rootfs_new.orig から戻します。ユーザーの作成など独自の設定をここで行うのもよいでしょう。
あとは先ほどの手順に従いカーネルを作成、イメージを作成、そして完成したイメージをsdカードへと焼き込みます。
まずはsdカード起動で確認を行った後、eMMCへインストールすれば出来上がりです。