RISC-VボードNezhaで標準Debianを使う

Debian 13 (Trixie) でriscv は公式サポートされたアーキテクチャになっていて、 RISC-Vボード NezhaでもDebian 本家で配布されているカーネルやインストールイメージをそのまま利用できる。

ただし、このボードは起動に使うファームウェアの大半をmicroSDの特定のオフセットから読む都合で、 公式に配布されているイメージと起動に必要なファームウェアを合わせて配置する必要がある。 大まかな作業のながれはこう:

  1. u-bootのイメージをビルドする
    • または私がビルドしたイメージを使うのでも良い
  2. microSDにEFI System Partition (ESP) を作る。
  3. u-bootのイメージを決まった場所に書く。
  4. Debian Installer のEFI実行ファイルをESP に配置して起動。

u-bootのイメージをビルドする

これはFreeBSDのページに手順を書いた。 ビルド済みイメージもそこにあるので、 手元にu-boot-sunxi-with-spl.binがあればOK.

EFI System Partitionを作る

単にmicroSD 先頭をクリアしてからFAT パーティションをtype 0xef作っているだけだが、 最初のセクタを8192 にしているところがコツ。 Allwinner D1 はmicroSD の先頭のあたりからファームウェアを読むので、この領域と重複しないように若干空けておく必要があるのだ。

$ sudo dd if=/dev/zero of=/dev/sdc bs=1024 count=8192
$ sudo fdisk /dev/sdc

fdisk (util-linux 2.41.2) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

デバイスには認識可能なパーティション情報が含まれていません。
新しい DOS (MBR) ディスクラベルを作成しました。識別子は 0xb27c3772 です。

コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p
パーティション番号 (1-4, 既定値 1): 1
最初のセクタ (2048-124735487, 既定値 2048): 8192
最終セクタ, +/-セクタ番号 または +/-サイズ{K,M,G,T,P} (8192-124735487, 既定値 124735487): +512M

新しいパーティション 1 をタイプ Linux、サイズ 512 MiB で作成しました。

コマンド (m でヘルプ): t
パーティション 1 を選択
16 進数コード または別名 (L で利用可能なコードを一覧表示します): ef
パーティションのタイプを 'Linux' から 'EFI (FAT-12/16/32)' に変更しました。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

$ sudo mkfs.vfat -F 16 -n ESPRV64 /dev/sdc1

最後のボリュームラベルをESPRV64としているところは何でも良いはずで、好きな名前を付けたら良い。

u-bootのイメージを決まった場所に書く

これはNezha のおまじないなので、深く考えずに特定のオフセットにspl+u-boot+OpenSBIのイメージを書く。

$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdc bs=1024 seek=128

Debian Installer のEFI実行ファイルをESP に配置して起動

Debian 13 (Trixie) では、 公式配布物に含まれるmini.efiを使うとDebian-Installer が起動した。

sudo mount /dev/sdc1 /mnt
curl -LOf --compressed https://deb.debian.org/debian/dists/trixie/main/installer-riscv64/current/images/netboot/mini.efi
sudo mkdir -p /mnt/EFI/boot
sudo cp mini.efi /mnt/EFI/boot/bootriscv64.efi
sudo umount /mnt

この状態でmicroSD をNezha に挿入し電源を入れる。 シリアルコンソールを見て待っていると、カーネルが起動して、なぜか一回再起動する。 コールドブートだとカーネル起動中に一回再起動するのだ。 諦めかけたところで放置しておくと、二回目の起動は無事に完了するのでDebian-Installer が動いている。 後は通常のPC でのDebianインストールと同じ。

インストール後は通常のPC と同じような感じで利用可能だ。 起動ログ.

豆知識: MACアドレスが起動のたびに変わる

u-boot でHit any key to stop autobootと言われたときにすかさずキーを押して、saveenvするとMACアドレスは固定になる。

Hit any key to stop autoboot:  0 
=> saveenv
Saving Environment to FAT... OK