EdgeRouter PoE の復旧

EdgeRouter の SNMP が取れなくなっていたので、ログを見たら IO エラーが出ていたので USB フラッシュが死んだらしい。 ネットワークは生きていたので、再起動とかはしないで、代替の USB フラッシュドライブとシリアルケーブルを購入しておいた。 購入した USB フラッシュは、SanDisk の SDCZ33-016G-J57。どうも相性問題があるらしくフォーラムから動きそうなフラッシュを購入したが結果としては、相性問題に当たってしまった。

公式のレスキュー方法は以下にあるが、TFTP を使ったりしてちょっと面倒くさい。 https://help.ubnt.com/hc/en-us/articles/204959514-EdgeRouter-Last-resort-recovery-of-failed-EdgeOS-device

ソースコードは以下にあって、やっていることは適当にパーティション作って、公式の tar からファイルをコピーすれば良いらしい。 https://github.com/vyos/emrk

パーティションは、msdos で作って、1st primary を fat32 で1セクタから150MB、2nd を ext3 でディスクいっぱいに設定した。 デフォルトでは1900MBになっていて謎だが、特に問題なく動いている。

後は、vmlinux.64{,.md5} を1stに、squashfs.img{,md5}を2ndにコピーして、version ファイルと writable ディレクトリとして w を作っておけば良い。

さて、これで動いてくれると嬉しかったのだが、USB フラッシュを挿入して起動したところ、シリアル経由でブートを覗いていたら、USB フラッシュが認識できずにブートに失敗していた。

ワークアラウンドは u-boot で usb reset をブート前にすれば良い。

https://community.ubnt.com/t5/EdgeMAX/New-U-Boot-image-for-better-USB-drive-compatibility/td-p/850744

シリアル経由で、u-boot を設定する。

setenv oldbootcmd '[copy from bootcmd]'
setenv bootcmd 'sleep 10;usb reset;sleep 10;$(oldbootcmd)'
saveenv

これで復旧完了。