隠居日録

2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。日々を読書と散歩に費やす

NanoPI NEO2にFreeBSDをインストールしてみた

LinuxをNanoPI NEO2にインストールしたときに謎のkernel panicが発生し、理由が見当がつかずハードウェア本体を疑ったので、秋月で本体をもう一台購入した。その後kernel panicはイーサーネットを100BASEのHUBに接続することで、解消したのだが、本体が一台余ってしまった。ちょうどFreeBSD-12がリリースされて、ARM64がそこそこサポートされているようなので、余ったNanoPI NEO2にFreeBSDをインストールしてみた。まず、NanoPI NEO2用にFreeBSDのインストールイメージを作らなければならないのだが、常時稼働させられれマシンは15~16年前に組み立てたデスクトップPCしかない。以下のようなマシンだ。

---<<BOOT>>---
Copyright (c) 1992-2018 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 12.0-RELEASE r341666 GENERIC i386
FreeBSD clang version 6.0.1 (tags/RELEASE_601/final 335540) (based on LLVM 6.0.1)
VT(vga): resolution 640x480
CPU: Intel Pentium III (997.48-MHz 686-class CPU)
  Origin="GenuineIntel"  Id=0x686  Family=0x6  Model=0x8  Stepping=6
  Features=0x387f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,PN,MMX,FXSR,SSE>
real memory  = 268435456 (256 MB)
avail memory = 225263616 (214 MB)

このマシンが未だに稼働することに驚きを感じるている。だが、もう十年ぐらい前から年に一~二回電源を入れるぐらいだ。本体のみでインストールできないので、ハードディスクをノートPCにUSB経由で接続して、インストールした。

NanoPI NEO2のFreeBSDのインストールについて参考にしたのはrixwwdさんのページ。

rixwwd.hatenablog.jp

基本的にはそこに書かれている通りなのだが、FreeBSD-12をインストールしたときにソースもインストールしておいたので、ソースのチェックアウトは割愛した。それと、FreeBSD-12ではデフォルトでntpdのユーザーが追加されているので、ntpdユーザの作成も割愛した。

まず、u-bootをportsからインストールしたのだが、ここで数時間かかってしまった。最近のインストールしたてのFreeBSDではperlとかpythonもインストールされていないようで、これらのportsからのビルド・インストールで結構時間がかかった。後で思えば、u-bootはpkgでインストールできたではないかと想像している。

次にNanoPI NEO2用のビルドだが、最初、

./crochet.sh -b nanopi-neo2

と実行したのだが、その直後、これではまずいと気が付いた。というのもNanoPI NEO2にシリアルコンソールをつないでいないので、このままでとsshでログインできないのだ。それと、SDカードイメージの作成にはrootでなければならないので、そこで失敗してしまうだろう。とりあえずスタートしたので、終わるまで待とうと思って放置しておいたのだが、カーネルとユーザーランドのコンパイルに約二日半かかってしまった。SDカードイメージの作成に失敗したところで、config.shのファイルを以下のように作成した。

board_setup nanopi-neo2
option User user_name

こうすると、user_nameという名前のユーザーが作成されて、パスワードもuser_nameになる。そして、次に

sudo ./crochet.sh -c config.sh

を実行した。既にカーネルとユーザーランドはできているのだが、この処理も結構かかった。そして最終的にworkディレクトリの下に出来上がったFreeBSD-aarch64-12-GENERIC-nanopi-neo2.imgをSDカードの書きこんで、本体に接続すると無事にFreeBSDが起動してきた。

次に、NanoPI NEO2にハードディスクを接続し、SDカードからシステムをコピーして、ハードディスクから起動できるようにした。FreeBSDもU-BOOTを使っているのだが、U-BOOTがどこにあるのか見えなく、どのように設定ファイルを書けばハードディスから起動できるようになるのかさっぱりわからないので、カーネル起動後のルートデバイスがハードディスクになるようにした。そのために、SDカード上に/boot/loader.confを作成し、

rootdev="disk1p1"

と書いておいた。それと、ハードディスクSD上のfstabを以下のように適当に編集して、

/dev/mmcsd0s1   /boot/efi       msdosfs rw,noatime      0 0
/dev/da0p1      /               ufs rw,noatime          1 1
/dev/da0p2      none            swap sw                 0 0
/dev/da0p3      /mnt/disk1      ufs rw,noatime          1 1

ルートデバイスとかが見えるようにした。/boot/efiはマウントする必要があるかどうかよく判っていないので、とりあえず残してある。HD側の/etc/fstabは以下のような記述にしている。

/dev/da0p1      /               ufs rw,noatime          1 1
/dev/da0p2      none            swap sw                 0 0
/dev/da0p3      /mnt/disk1      ufs rw,noatime          1 1
/dev/mmcsd0s2a  /mnt/sdcard     ufs rw,noatime          1 1
/mnt/sdcard/boot        /boot   nullfs  rw              0 0
/dev/mmcsd0s1   /boot/efi       msdosfs rw,noatime      1 1

nullfsをマウントするために、SDカード上のloader.confには

nullfs_load="YES"

を追加している。

さて、このFreeBSDは1000BASEのハブに接続しているのだが、これにtinyproxyをインストールして、動作を見てみた。Linuxとはインプリが違うので、当たり前と言えば当たり前だが、FreeBSDではカーネルパニックも起きず快適に動いている。もう少し様子を見て、問題がないようだったら、もう一台の方もLinuxからFreeBSDに移行しようかとも考えている。

f:id:prozorec:20181217125619p:plain
剥き出しのままだと心配なのでケースに入れてみた