玄箱PROにBusterを入れた

購入後すぐに etch をいれて、時々 HDD 交換するも旧環境を dd コピーして10数年使い続けてきた[玄箱PRO](https://www.kuroutoshikou.com/product/old_series/old_case/old_case_kurobako/old_case_kurobako_select/kuro-box_pro/)。
HDD 故障後に dd コピーしたり無理なこともしてきたのでファイルシステムも怪しくなってきているのか、消しても消えないファイルがいくつか出てきたり、、、いいかげん OS を更新することにした。

旧環境HDDを外して、玄箱に新しいHDDを装着。シリアルケーブル数年ぶりに引っ張り出してきて装着。

# NVRAM 起動に切替

U-Boot に入り、setenv する[^1]。

[^1]: U-Boot に入るためには autoboot 前のカウントダウン中にキーを押すが、玄箱の U-Boot 起動前のカウントダウンは2回行われるようになっており、1回目のカウントダウン中ではなく2回目のカウントダウン中にキーを押さなければならない。1回目の最中にキーを押すと「ピーポーピーポー」とうるさく鳴りだす。ってこんな仕様だったんだっけ。

```
setenv bootargs_root root=/dev/mtdblock2
setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver)
setenv uImage_block 0
setenv uImage_offset 0x00020000
setenv nand_boot yes
setenv bootcmd 'nboot $(default_kernel_addr) $(uImage_block) $(uImage_offset); bootm $(default_kernel_addr)'

boot
```

懐かしいグラサン男が出てきたのち、root / kuroadmin でログイン。

# installer を get

* disk に /dsk/sdX1 の primary partition を切り ext2 で mkfs し適当な場所に mount する
* そこに、 http://http.us.debian.org/debian/dists/buster/main/installer-armel/current/images/orion5x/network-console/buffalo/kuroboxpro/ から  download した uImage.buffalo と initrd.buffalo を置く
* 上記から download した config-debian を実行
    * config-debian のなかで U-boot の bootcmd が以下に書き換えられる
    
          ```ide reset; ext2load ide 0:1 $(default_kernel_addr) /$(kernel); ext2load ide 0:1 $(default_initrd_addr) /$(initrd); bootm $(default_kernel_addr) $(default_initrd_addr)```
* reboot

HDD の initrd からインストーラが起動する。そのままシリアルコンソール上でインストールする。簡単だな。でも今時の機器と比べると進行が格段に遅い。さすがに。

# インストール後

* 欲しいパッケージを入れたり、dpkg-reconfigure locales したり、普通の Buster と大体同じ。

* miconapl の代替えになる microapl を含む micro-evtd パッケージがインストール済みになっている。
従来の miconapl はさすがに動かない(*)ので、miconapl をつかったスクリプトは修正して microapl を使うように書き換える。
    * (*)こんな感じで動かない。
    
```
root@nas:~# LD_LIBRARY_PATH=/usr/local/kurobox/lib /usr/local/kurobox/sbin/miconapl
/usr/local/kurobox/sbin/miconapl: relocation error: /usr/local/kurobox/lib/libc.so.6: symbol _dl_out_of_memory version GLIBC_PRIVATE not defined in file ld-linux.so.3 with link time reference
```
* micro-evtd は温度の監視や fan の制御をやってくれるらしい。etch では sh script でやってたが、それは不要になるのだね!

* daemon-reload ができない。/var/run が狭いらしい

```
root@nas:/usr/local/kurobox/init.d# systemctl daemon-reload
Failed to reload daemon: Refusing to reload, not enough space available on /run/systemd. Currently, 9.4M are free, but a safety buffer of 16.0M is enforced.
root@nas:/usr/local/kurobox/init.d# df -h /run
Filesystem      Size  Used Avail Use% Mounted on
tmpfs            13M  2.7M  9.5M  22% /run
```
メインメモリ量から tmpfs の容量を決めているのかな。玄箱のメモリは 128MiB しかないもんな。
daemon-reload が必要な場合、tmpfs の size を増やして remount してから行う。

```
root@nas:~# mount -t tmpfs tmpfs /run -oremount,size=32M,nosuid,noexec,relatime,mode=755
root@nas:~# systemctl daemon-reload
```

都度 remount するのが面倒な場合 fstab に下記のように書いておいてもよい。

```
tmpfs      /run           tmps nodev,nosuid,size=32M 0 0
```

* いままで、グラサン男の ASCII art 表示をする shell script は  rc.local から呼んでいた。表示は単に ECHO でやっている。今回も同じように rc.local から呼び出すと、rc.local が systemd の service になっている関係でグラサン男が syslog に記録されてしまう(笑)。 ECHO に ```> /dev/console``` の追加が必要。

* miconapl -a bz_melody で起動時にピロピロ鳴らしていたのを microapl でやるとテンポがえらく遅い。テンポの指定を 1 とかにしてみても、従来の 30 より全然遅い。従来並みのテンポにする方法はあるのか。
    * microapl は shell script のようだ。テンポで指定したミリ秒 sleep しながら音を出しているようだが、感覚的にはそれより遅い
        * microapl の作りのせいだった。1音ならすたびに呼ばれる note_to_freq() という関数の実行に 300ms 位かかっている。これではテンポの指定を 30ms にしても 1ms にしても誤差程度にしかならない。 遅い原因は sed を使いまくっているためのようだった。 sed でやっている処理は全部 bash の内部コマンドで実現できる処理だったため書き換えたところ、従来並みのテンポになった。
        * 1音目と2音目の間に sleep が入ってないというバグもある。note_to_freq() が遅すぎて気付かなかったのか。

* systemctl stop micro-evntd が失敗する。
    * PID ファイルを world writable で作っているため。PID ファイルは micro-evtd から呼ばれるシェルスクリプトの /usr/sbin/micro-evtd.event の中で作っているので、umask 066 を追加する。

# よくわかっていない

* fw_printenv が正しく動かない。
```Warning: Bad CRC, using default environment``` というエラーが出て、デフォルト? のコンフィグが表示される。
fw_setenv は怖いので試していない。
dmesg には ```[  576.840183] __nand_correct_data: uncorrectable ECC error``` が大量に表示される。
うちの玄箱の NVRAM が逝ってるのかな? U-Boot や nvram コマンドでは問題なく読み書きできるのだけど。

* 時々単発でビープ音が鳴る場合がある。
    * ビープ音を鳴らしている処理が micro-evtd.event の中にある。とりあえず煩いビープを鳴らす処理をコメントアウトしておく。
    * /etc/micro-evtd.conf で DEBUG=2 を指定すると /var/log/micro-evtd.log に若干ログが出るようになる (デバッグログのようなので、意味は micro-evtd のソースを見ないとわからない)。 このログによると、ビープが鳴るトリガーはボタン押下が検出された契機のようだった。だが、ピーゆうてた時間にボタンの操作などはしていない。何が起きているのか調査中…。
* しばらく断続的にビープ音が鳴った後シャットダウン? してしまう場合もある。
    * watch dog timer が発火した時の現象の模様。micro-evtd は定期的 (デフォルト40秒ごと) に WDT を 250 秒にリセットしている。micro-evtd による WDT 更新が止まった場合、250 秒後にピーピー言って落ちる。
    * micro-evtd を殺して micro-evtd -s 8035 を何度か叩くと死へのカウントダウン (数字は増えていくのでカウントアップ?) が確認できる。数字が 255 に達すると発火する。
    * WDT は /etc/micro-evtd.conf の REFRESH で無効にできる。
    * 実際に micro-evtd が落ちていたのか、落ちていたならその原因は何か、は未判明。crash 時に core dump が残るように sysctl.conf と /etc/systemd/system.conf を設定して様子見する。

## 参考
* https://salsa.debian.org/debian/micro-evtd
    * Debian の micro-evtd のソース。
* https://buffalonas.miraheze.org/wiki/Terastation_Microcontroller_Interface
    * micro-evtd -s でマイコンに送っているコマンドの説明がある。
* http://driver.cfd.co.jp/cfd-drv/products/kuro-nas_x4/KURO-NAS_X4_micon100.pdf
    * KURO-NAS/X4 マイコン通信仕様書