始まりはここにあります。
当初のターゲットはBroadcomのBCM47xxだったようです。BCMはSOC内のデバイスの管理にSonicという会社のSiloconBackplane(siba)という仕組みを採用していて、そのドライバも作ったようです。FreeBSD 9-CURRENTかRELASEの頃のようです。
Atherosのサポートはrayと同じウクライナ出身のgonzoさんが作られ、程なくして元AtherosのadrianがFreeBSDに参加され引き継がれたようです。AtherosはMIPS 4KのSOCが一世代目で、AR2xxx/5xxxという型番で、二世代目が24KのAR7xxxでした。NetBSDなどはAR2xxx/5xxxのサポートコードもありますが、後から着手したFreeBSDはAR7xxxからのサポートになっていました。
ほとんどのMIPS SOCを使ったルーターにはEthernet switchが入っていて、それを初期化しないとEthernetが使えないため、Stefan BethkeやadrianやrayでEthernet switchのサポートコードを作り始めたようです。途中でrayの実装とは別になったStefan Bethkeのetherswitch(4)が10RでHEADに入りました。
2012年のBSDCanでStefan Bethkeがetherswitchの事を発表しています。
rayはgeom_map(4),geom_uncommpress(現:g_unzip)などを作って、ZRouterの必要な機能を用意しました。またrayはralinkのrt305xのサポートコードを作っています。
ZRouterはビルド環境という側面と、実行環境という側面を持っています。
ZRouterの実行環境はroot fsはiso9660のlzmaなread onlyなfsです。またmd(4)を使ってメモリディスクな/tmp作って、unionfs(4)を使って/etcのrwを実現しています。
余談ですが、unionfsは日本のongsの方が作られたようです。ongsの後藤さんはちょっと危ないので使わないでくれって言ってましたが、ZRouterのような使い方であれば十分実用になっています。
ZRouterではflashをroでmountしているのでflashのファイルシステムが壊れる心配がありません。これが実現できているのはunionfsのおかげでもあります。
flashにrwなfsを置いてるのは頭がおかしいと思います。
ZRouterはhg(Mercurial)で管理していて、HEADに入っていないrayのコードを含んだFreeBSDのソースも置いてありました。
2012年のEuroBSDConでrayの発表がありました。
2012年位にはhgの更新がとまって休眠状態でした。
私がいじり始めたのは2015年の10R,11-CURRENTくらいの時期で、最初にZRouterとFreeBSDをhgでダウンロードして一発でビルドできたのに感動した記憶があります。
これ以前にLuigi RizzoがどっかにDD-WRTをFreeBSDでビルドする方法を書いていてまったく上手くいかなかったので、そう思ったのだと思う。
ただ、hgにあったFreeBSDのコードが古いものになっていて当時のCURRENTとかなり差が出ていたので、こつこつFreeBSDのCURRENTにあわせ始めました。
まず最初に寄せたのはrayのswitchの実装からetherswitchへの置き換えでした。当初はrayの方にしかなかったサポートコードもじきにetherswitchにも入ってきました。また私もいくつかetherswitchのサポートコードを書きました。
AR2xxx/5xxxのサポートコードは私がNetBSDなどのコードを参考に書いて入れてもらいました。AR2xxx/5xxxの頃はAtherosはSwitchチップを作っていなかったので、いろいろな他社のSwitchが接続されたモジュールがあるのでetherswitchのリファレンスにもなっています。
必要なsoも構成が変わっていたので、修正しました。
元々最小構成でも4M Flashに入らない構成だったのを、いろいろ外してOSだけであれば4Mに入るようにもしました。
あと11R前後くらいで、buildworld/kernelのオブジェクトのパスが変わったのもなにか対応したような気がします。
また時々、コマンドのsoの利用が増えたりするので、利用をダンプするスクリプトを作り調整しました。
あ、buildworldとbuildkernelのパラビルドオプション(PARA_OPTION)も追加しました。rayがやってたころはまだなかったか、安定してなかったのか、それとも他の理由で入っていかったようです。
いろいろ調整してみて12Rでも最低限のビルドであれば4M Flashに入ります。
先頭に空白ある特殊なビルドイメージの対応なども行いました。他にもいくつかビルドイメージの調整は行ったと思います。
ZRouterにはportsと同様なビルドシステムを作ろうとした形跡があったのですが、未完成でした。これを私のほうで作りこんで正しくビルドできるようにしました。当初はpkgの仕組みを使っていたのですが、pkgが10Rくらいで変わってうまく動かなくなったので、Makefileのpost-installでZRouterのターゲットディレクトリにファイルを直接コピーするようにしました。また始めのうちはconfigureを使うものがhostベースで動いてしまっていたのですが、いろいろためして正しくクロスでのconfigureが通るようになっています。
configureは型の長さやエンディアンを見てるケースがありますが、最初のうちはpost-configureでMakefileを書き換えたりしていたのは内緒です。:)
portsはビルド依存(MakefileのUSE)は他のportsのビルドが必要で、現実的ではないので、gmakeなどが必要な場合はホストに手動でpkgをインストールします。また実行時依存がある場合は事前にビルドしてターゲットディレクトリにヘッダーとライブラリファイルをコピーしておきます。ヘッダーは最終イメージでは消されます。
今のところportsのビルドに必要なパッケージは下記のようなところです。
autoconf
automake
cmake
dialog4ports
gettext
gmake
libtool
pkg
pkgconf
ruby
rubygem-rake
私はZRouterのportsはportsもどきと呼んでるのですが、私が個人的に試したいものが入ってます。依存の解決が手動なのであまり依存が激しくないものに限っています。mrubyはこのビルドの仕組みと非常に相性がよく、いろいろ使ってます。また変わったところでは飛行機のADS-Bを受信するdump1090やインターネットラジオが聞けるmpg123などがあります。
本家のportsでもクロスビルドの仕組みを作ろうとした形跡がありましたが、おそらく動かないような気がします。
portsもどきでも本家のportsの脆弱性のチェックが効きます。ただZRouterのような限定的なプログラムの使い方では影響のないものも多いようなきがします。
とりあえず脆弱性の警告が出たときは本家の新しいものをコピーして修正してアップデートしてます。
本家のMakefileをいじらずにportsもどきでも利用できるといいのですが、あまりportsを理解できていないので、とりあえずになっています。
Makefileで修正が必要なのはconfigureのクロスの設定、post-installでファイルのコピーはどです。あと/usr/libなどを直接していしているものは書き換えています。cmakeも使えますが、デフォルトの処理が上手く動かなかったので、buildに処理を書き加えています。
あと、portsもどきは毎回クリーンビルドになるのですが、あまり大きなものもないので、良しとしてます。
portsもどきの事はAsiaBSDCon 2020で話すつもりだったのですが、中止になってしまいました。paperやプレゼン資料はrayがチェックしてくれました。
ZRouterにはtargetという仕組みでMakefileだけでバイナリを作ることも出来ます。しかし上で書いたオブジェクトのパスの変更があってからカレントディレクトリにオブジェクトを作るようになってしまっています。バイナリは正しくコピーされるので動かなくはなってませんが、すこし気持ちが悪いです。
rayのralinkのコードのmips/rt305xはFDT対応してmips/mediatekとしてStanislav Galabovが作り変えました。これにあわせZRouterでもFDTなターゲットにも対応しました。
また当初のターゲットだったBCMのコードもLandon Fullerが作り直しました。ただ完成度が低く結局使いものになりませんでした。
BCMを作り直したのはBloadcomのWiFiドライバを作り直すののついでだったみたいですいが、mips SOCサポートはRalink,Atherosがあれば十分だったになぜ作業したか疑問が残ります。
今はZRouterはgithubにあります。
私はBastilleBSDのjailにビルド環境を作っています。ZRouterのビルドはユーザ権限でできます。というかこういう操作でroot権限が必要になると誤ってホストシステムを壊してしまう可能性があるので、まずいです。
Allwiner A10(arm)もビルドしていましたが、clangで10倍近い時間がかかるので、最近はまったく試していないので、ビルドできないかもしれません。
FreeBSDのクロスビルドの仕組みがよく出来ていて、ZRouterはそれを上手くラップしていてよい仕組みだと思っています。本家ではportsのビルドをqeumで行ったりすることもあるようですが、ZRouterのビルド手法の方がスピードやコスト的に有利だと思います。
大きくはいじってませんが、rayが好きにやらせてくれてるので助かってます。あまりいろいろ説明するのは得意ではありません。ZRouterは完璧を目指さず現実的な解を出すのがポリシーだと私は思っています。
FreeBSD/mipsを消すって言う話が出て、forkしてなんか名前付けようよと提案したら、rayはZRouterは今までもFreeBSDのforkでFreeBSDのままでいいと言ってました。
FreeBSD/mipsは12Rで終わりですが、ZRouter.orgではまだまだいろいろいじっていきたいと思います。
ターゲットはHardOffで入手しているのですが、HardOffのロゴとウクライナの国旗の色似てますよね。
また一日も早くウクライナのrayのところに平穏な日がもどる事を祈ります。必ずいつかrayとは会えると信じています。💙💛