Edgerouterの内部USBフラッシュメモリをリストアする

5 min read読了の目安(約5000字

我が家ではすでに4年ほどEdgerouter-Lite3を使っていて、これまで特に異常なく利用できていた。

ところがここにきてシステムドライブに異常が発生し書き込みエラーが発生、再起動しても修復することができなくなってしまった。Edgerouterは内部システムドライブにUSBフラッシュメモリを利用していることで有名だが、これを別のUSBフラッシュメモリに換装することにした。

Edgerouter-Lite3 outside

Edgerouter-Lite3の裏面ネジ2本を外せば、簡単に基盤にアクセスできる。
下図の赤線で囲われたところにシステムドライブとして利用されているUSBフラッシュメモリが見える。

下図の左がもともと挿入されていたUSBフラッシュメモリ(1.6GB)で、右が今回換装するUSBフラッシュメモリ(8GB)。どのUSBフラッシュメモリでもEdgerouterのシステムドライブに利用できるわけではなく、どうも相性問題がある様子。公式フォーラムにもcompatibilityについてのスレッドがあるので心配な方はこちらを参照するとよい。

https://community.ui.com/questions/List-of-Compatible-USB-drives/efc39232-89e7-4cf5-b9f8-df9913fd5cd9

私が購入したUSBフラッシュメモリは以下のもの。たしか購入時900円くらいだった。

  • Transcend USBメモリ 8GB TS8GJF510S

https://jp.transcend-info.com/Support/No-497

私と同様にUSBフラッシュメモリ障害が発生した場合に備え、Edgerouterユーザの有志(と一部メーカーサポート)によるレスキューキットを利用した復旧方法が用意されているが、TFTPサーバーを事前に用意したりと面倒が多い。
やっていることはUSBフラッシュメモリにパーティションを切ってファームウェアを書き込んでいるだけなので、今回は手作業で実施することとした。

https://community.ui.com/questions/EdgeMax-rescue-kit-now-you-can-reinstall-EdgeOS-from-scratch/58d474b4-604d-48c9-871d-ff44fd9240f3#M12098

まずはUSBフラッシュメモリの先頭150MBほどをfat32で、残りをすべてext3でフォーマットする。

$ sudo parted -s /dev/sda mktable msdos
$ sudo parted -s /dev/sda mkpart primary fat32 1 150MB
$ sudo parted -s /dev/sda mkpart primary ext3 150MB 100%

$ sudo mkfs.vfat /dev/sda1
$ sudo mkfs.ext3 -q /dev/sda2

$ sudo parted -s /dev/sda print
Model: JetFlash Transcend 8GB (scsi)
Disk /dev/sda: 7902MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  150MB   149MB   primary  fat16        lba
 2      150MB   7902MB  7752MB  primary  ext3

次に公式サイトから最新のファームウェアをダウンロードする。

$ wget https://dl.ui.com/firmwares/edgemax/v2.0.9/ER-e100.v2.0.9.5346345.tar
$ tar xf ER-e100.v2.0.9.5346345.tar 

$ ls
compat  ER-e100.v2.0.9.5346345.tar  squashfs.tmp  squashfs.tmp.md5  version.tmp  vmlinux.tmp*  vmlinux.tmp.md5

squashfsvmlinuxをリネームする。

$ rename tmp img squashfs.tmp*
$ rename tmp 64 vmlinux.tmp*

$ ls
compat  ER-e100.v2.0.9.5346345.tar  squashfs.img  squashfs.img.md5  version.tmp  vmlinux.64*  vmlinux.64.md5

マウントポイントを作成し、必要なファイルをそれぞれ配置する。

$ mkdir /tmp/er_sda1 /tmp/er_sda2

$ sudo mount /dev/sda1 /tmp/er_sda1
$ sudo mount /dev/sda2 /tmp/er_sda2

$ sudo cp vmlinux.64* /tmp/er_sda1/
$ sudo cp squashfs.img* /tmp/er_sda2/
$ sudo cp version.tmp /tmp/er_sda2/version

$ sudo mkdir /tmp/er_sda2/w
$ sync

$ sudo umount /tmp/er_sda1 /tmp/er_sda2

これでUSBフラッシュメモリの準備は完了。
Edgerouter内部のUSBドライブに挿入し、電源を投入!これでリストア完了したかと思いきや、何故かEdgeMAXが起動されずにいる様子。

Edgerouer-Lite3にコンソール接続し、出力を見ると以下のようにbootloaderが換装したUSBフラッシュメモリをうまく読みこめずエラーを起こしていた。

U-Boot 1.1.1 (UBNT Build Version: e102_003_eace7) (May 27 2019 - 06:35:40)

BIST check passed.
UBNT_E100 r1:2, r2:14, f:4/71, serial #: DC9FDB280FDD
MPR 13-00000-00
Core clock: 500 MHz, DDR clock: 266 MHz (532 Mhz data rate)
DRAM:  512 MB
Clearing DRAM....... done
ERROR: Unable to allocate linux reserved memory (addr: 0x100000, size: 0x8000000).
Flash:  4 MB
Net:   octeth0, octeth1, octeth2

USB:   (port 0) scanning bus for devices...
      USB device not responding, giving up (status=0)
1 USB Devices found
       scanning bus for storage devices...
No device found. Not initialized?
** Partition 1 not valid on device 0 **

** Unable to use usb 0:1 for fatload **
argv[2]: coremask=0x3
argv[3]: root=/dev/sda2
argv[4]: rootdelay=15
argv[5]: rw
argv[6]: rootsqimg=squashfs.img
argv[7]: rootsqwdir=w
argv[8]: mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@1024k(eeprom)
## No elf image at address 0x09f00000
Octeon ubnt_e100#

公式フォーラムを探すとusb resetすることで正常に読み込めるようになるとの事例報告があり、こちらを試してみると無事にEdgeMAXが起動した。

Octeon ubnt_e100# usb reset

ただこのままではEdgerouterを再起動するたびに毎回コンソール接続しusb resetコマンドを投入しなくてはならない。そこでbootloaderがEdgeMAXを起動する際のコマンド列bootcmdを修正することで、起動時に都度usb resetが自動投入されるよう修正する。

まずはprintenvコマンドでオリジナルのbootcmdを確認する。

Octeon ubnt_e100# printenv
bootcmd=fatload usb 0 $loadaddr vmlinux.64;bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw rootsqimg=squashfs.img rootsqwdir=w mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)

オリジナルのbootcmdoldbootcmdに保存し、以下のように新しくbootcmdを設定すればよい。

setenv oldbootcmd 'fatload usb 0 $loadaddr vmlinux.64;bootoctlinux $loadaddr coremask=0x3 root=/dev/sda2 rootdelay=15 rw rootsqimg=squashfs.img rootsqwdir=w mtdparts=phys_mapped_flash:512k(boot0),512k(boot1),64k@3072k(eeprom)'
setenv bootcmd 'sleep 10;usb reset;$(oldbootcmd)'
saveenv

以上でEdgerouterのUSBフラッシュメモリの換装は完了。Enjoy a happy Edgerouter life!!