SHEEVAPLUGでNetBSD 9.3をブートしてみた

FreeBSD/armがくそなので、NetBSDを試してブートしてみました。

build.shはパラレルオプションの-jが使えryzenだとフルビルドが1時間くらいで終わります。

[9.0のインストール](https://qiita.com/yamori813/items/df71b1d0eea037e62bb4)の時はインストーラーでsdmmc0のエラーメッセージを一生懸命消しながら、ネットからインストールしたのですが、せっかくなのでエラーメッセージが出ないようにしたカーネルが入ったインストーラのカーネルをビルドしてみました。

ビルドするホストはFreeBSD/amd64のBastilleBSDのjailです。

1日くらいインストーラの作り方が分からなかったのですが、SHEEVAPLUG_INSTALLなカーネルを作ればいいことにきがつきました。

このカーネルをobjcopyでbinaryにしてu-bootでブートしたところ、埋め込まれたrootfsが読めないようです。

~~FreeBSDのffs(v2?)とNetBSDのffs(v2?)は違うのでFreeBSDでのクロスビルドではインストーラは作れないのではないかと思います。~~ ffs v1のramdisk.fsがカーネルに入っていないようです。なぜかビルド時にはエラーになりません。

そもそもELFがおかしいとエラーメッセージが出ていたのでインストーラーが壊れているのかもしれません。

仕方がないので、他の方法を考えます。

ZRouter.org方式でiso9660なrootfsを試してみます。

まずSHEEVAPLUGのデフォルトカーネルはiso9600なfsが入ってなかったので、入ったカーネルを作ります。

リリースバイナリのsets/base.tgzとsets/etc.tgzを展開してiso9600にします。

FreeBSDのmkisofsはcdrtoolsに入っていました。

```
> mkisofs -o output.iso -l -J -R -allow-leading-dots iso9600
Warning: creating filesystem that does not conform to ISO-9660.
Setting input-charset to 'UTF-8' from locale.
mkisofs: Permission denied. Unable to open directory iso9600/var/spool/ftp/hidden
Using GMT_0000.;1 for  iso9600/usr/share/zoneinfo/GMT-0 (GMT+0)
Using GMT_9000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-9 (GMT+9)
Using GMT_8000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-8 (GMT+8)
Using GMT_7000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-7 (GMT+7)
Using GMT_6000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-6 (GMT+6)
Using GMT_5000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-5 (GMT+5)
Using GMT_4000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-4 (GMT+4)
Using GMT_3000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-3 (GMT+3)
Using GMT_2000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-2 (GMT+2)
Using GMT_12000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-12 (GMT+12)
Using GMT_11000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-11 (GMT+11)
Using GMT_10000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-10 (GMT+10)
Using GMT_1000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-1 (GMT+1)
Using GMT_0000.;1 for  iso9600/usr/share/zoneinfo/Etc/GMT-0 (GMT+0)
  3.84% done, estimate finish Fri Oct 28 07:01:36 2022
  7.64% done, estimate finish Fri Oct 28 07:01:36 2022
 11.45% done, estimate finish Fri Oct 28 07:01:36 2022
 15.25% done, estimate finish Fri Oct 28 07:01:36 2022
 19.07% done, estimate finish Fri Oct 28 07:01:36 2022
 22.88% done, estimate finish Fri Oct 28 07:01:36 2022
 26.70% done, estimate finish Fri Oct 28 07:01:36 2022
 30.50% done, estimate finish Fri Oct 28 07:01:36 2022
 34.34% done, estimate finish Fri Oct 28 07:01:36 2022
 38.13% done, estimate finish Fri Oct 28 07:01:36 2022
 41.96% done, estimate finish Fri Oct 28 07:01:36 2022
 45.78% done, estimate finish Fri Oct 28 07:01:38 2022
 49.57% done, estimate finish Fri Oct 28 07:01:38 2022
 53.38% done, estimate finish Fri Oct 28 07:01:37 2022
 57.21% done, estimate finish Fri Oct 28 07:01:37 2022
 61.01% done, estimate finish Fri Oct 28 07:01:37 2022
 64.83% done, estimate finish Fri Oct 28 07:01:37 2022
 68.64% done, estimate finish Fri Oct 28 07:01:37 2022
 72.46% done, estimate finish Fri Oct 28 07:01:37 2022
 76.28% done, estimate finish Fri Oct 28 07:01:37 2022
 80.08% done, estimate finish Fri Oct 28 07:01:37 2022
 83.88% done, estimate finish Fri Oct 28 07:01:37 2022
 87.70% done, estimate finish Fri Oct 28 07:01:37 2022
 91.53% done, estimate finish Fri Oct 28 07:01:37 2022
 95.33% done, estimate finish Fri Oct 28 07:01:37 2022
 99.14% done, estimate finish Fri Oct 28 07:01:37 2022
Total translation table size: 0
Total rockridge attributes bytes: 791369
Total directory bytes: 3352576
Path table size(bytes): 21038
Max brk space used 0
131136 extents written (256 MB)
```

ターゲットにはCD-ROMドライブはついてないので、USBメモリにoutput.isoをddで書き込んで使用します。

isofs入りのカーネルをブートしてcdromをmountします。FreeBSDはmount時にファイルシステムのタイプを明示的に指定しますが、NetBSDは自動判定が入っているようです。
```
[   8.5799766] boot device: <unknown>
[   8.5799766] unknown device major 0xffffffffffffffff
[   8.5799766] root device: 
[   8.5799766] use one of: mvgbe0 sd0[a-p] ddb halt reboot
[   8.5799766] root device: sd0
[   8.5799766] dump device (default sd0b): 
[   8.5799766] file system (default generic): 
[   8.5799766] root on sd0a dumps on sd0b
[   9.0899788] mountroot: trying ffs...
[   9.0999805] mountroot: trying ext2fs...
[   9.1099804] mountroot: trying nfs...
[   9.1099804] mountroot: trying msdos...
[   9.1099804] mountroot: trying cd9660...
[   9.1299803] root file system type: cd9660
[   9.1299803] kern.module.path=/stand/evbarm/9.3/modules
[   9.1499796] init path (default /sbin/init): 
[   9.1499796] init: copying out path `/sbin/init' 11
Created tmpfs /dev (1196032 byte, 2304 inodes)
/etc/rc.conf is not configured.  Multiuser boot aborted.
Enter pathname of shell or RETURN for /bin/sh: 
```

とりあえずシングルユーザまで上がりました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=6751

FreeBSDのe2fsprogsというpkgに入っているmke2fsというコマンドでext2fsを作ることもできるよです。これでファイルシステムを作ってtgzを展開して設定するのでも良いかもしれません。

SHEEVAPLUGのカーネルはu-bootからの起動時のargをみていて、arm32_machindep.cの中にパースコードがあります。