Edgerouterの内部USBフラッシュメモリをリストアする
我が家ではすでに4年ほどEdgerouter-Lite3を使っていて、これまで特に異常なく利用できていた。
ところがここにきてシステムドライブに異常が発生し書き込みエラーが発生、再起動しても修復することができなくなってしまった。Edgerouterは内部システムドライブにUSBフラッシュメモリを利用していることで有名だが、これを別のUSBフラッシュメモリに換装することにした。
Edgerouter-Lite3の裏面ネジ2本を外せば、簡単に基盤にアクセスできる。
下図の赤線で囲われたところにシステムドライブとして利用されているUSBフラッシュメモリが見える。
下図の左がもともと挿入されていたUSBフラッシュメモリ(1.6GB)で、右が今回換装するUSBフラッシュメモリ(8GB)。どのUSBフラッシュメモリでもEdgerouterのシステムドライブに利用できるわけではなく、どうも相性問題がある様子。公式フォーラムにもcompatibilityについてのスレッドがあるので心配な方はこちらを参照するとよい。
私が購入したUSBフラッシュメモリは以下のもの。たしか購入時900円くらいだった。
- Transcend USBメモリ 8GB TS8GJF510S
USBフラッシュメモリ障害が発生した場合に備え、Edgerouterユーザの有志(と一部メーカーサポート)によるレスキューキットを利用した復旧方法が用意されているが、TFTPサーバーを事前に用意したりと面倒が多い。
やっていることはUSBフラッシュメモリにパーティションを切ってファームウェアを書き込んでいるだけなので、今回は手作業で実施することとした。
まずは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
squashfs
とvmlinux
をリネームする。
$ 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)
オリジナルのbootcmd
をoldbootcmd
に保存し、以下のように新しく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!!
Discussion
先日ルーターをリブートしたところ、突如USBフラッシュメモリが書き込めなくなりエラーをはいて起動しなくなってしまった。手元にあった後継品のJetFlash 710C 32GB TS32GJF710Sに換装しようとしたところ、起動後数分後に必ずエラーを吐いて止まってしまう。。。
どうもUSBフラッシュメモリの相性問題に引っかかってしまった模様。
色々代替品を検索するも、公式コミュニティにて起動確認済みのUSBフラッシュメモリは凡そ市場から消えてしまってて、確実に起動すると確信できるものは見つからず。どうなるか不安なままとりあえずKingstonのDataTraverler Kysonを購入して換装した結果、無事に起動できた。
usb reset
のハックも不要。この商品もまた手に入らなくなるといずれまた困るだろうから、余裕のあるうちに在庫確保しておくとよいかも。