文鎮化した Ubiquiti Networks Edgerouter X を復旧した備忘録です.
まずは,ER-X ってなに?ってところからスタートしたいと思います.なお,今回は手順が多いのでとても記事が
長い!
です.御注意ください.
Ubiquiti Networks Edgerouter X って?
製品ページは
です.アメリカの企業なんですが,かなりお安い企業向けネットワーク製品を提供しているところで,特に,この Edgerouter X (略して ER-X)は
- 安い($50 です.日本で買うと1万円程度)
- 高性能(らしい)
- 小さい
の三拍子揃った製品です.ただし,日本で買うには並行輸入するか,個人的に輸入している人のものを Amazon なんかから買うしかない.当然,日本語にも対応していないし,使えなくても自己責任っていう位置づけのものです.
実は,半年ほど前まで私のメインルーターは,IIJ の SEIL/X86 だったのですが,なぜなのか
に記した通り,Hyper-V で動かなくなってしまいました(で,いまだに動きません(泣)).仕方が無いので,その代替えとして調達したのが本製品です.
あたりのページを見て,面白そうだと思ったのももちろん理由なんですが,最も大きな理由は,とても「小さい」から.なんと,5ポートの単なるスイッチの小型のものと同じくらいの大きさしかありません.と言うことで,これは良い,と思って買ったんですが,初っ端からある意味大変愉しい経験をすることができました(そう思わないとやってられない).
文鎮化(Bricked)ってなにしたの?
届いた製品の Firmware が結構古かった(ver. 1.7,今は 1.10.1)ので,まずはファームウェアを最新にしてから設定しようとしただけです.
本製品,日本の家庭用ルーターなんかと同じように,Web インターフェースから色々設定できますし,Firmware のアップデートもここからできたので,最新の 1.10.1 の Firmware を適用しようとしました.でも,なぜだか「アップデートできない」って怒られます.仕方ないので,再起動してもう一度やってみようとしたところ,文鎮化(Bricked) してしまいました(泣).
もう少し詳しく言うと,リセットは効いているように見えるけど,なんどやっても設定画面にはアクセスできなくなってしまいました.
調べてみると,本製品,Firmware のアップデート後,文鎮化する事例が結構おきているみたいです.どうも安全にアップデートしたければ,Web インターフェース経由ではなく,CUI 経由でするべきだったようなのですが,後の祭りです.
アメリカ在住なら交換依頼もアリだと思いますが,並行輸入品なので,どうしたものか……と色々ググってみたところ,
で,USB-TTL Cable を使えば,シリアルコンソールから復旧できる可能性があるとのことが分かったので,まぁ,ものは試しと,やってみることにしました.
USB-TTL を使った ER-X へのアクセス
これはほとんど
と同じです.ただし,私の場合は,USB-TTL として,以下のものを使いました.
Amazon で300円くらいです.
参考にさせて頂いたページで紹介されている USB-TTL も注文したのですが,届くのに3週間ほどかかることが分かったので,注文し直したものです.
本製品に限らず格安品の USB-TTL は,正規のチップが使われていないことから,Windows で使うときは古いドライバを手に入れないといけないなどの問題点があるみたいで面倒なので,MacOS から使うことにします.
まずは,Prolific の
から,PL2303_MacOSX_1.6.1_20171018.zip をダウンロードしてきて,展開すると,
のように,インストーラーと英語ですけどかなり丁寧なインストール方法の解説PDFがあるので,それに従ってまずはドライバを導入し再起動します.
きちんとドライバが導入できていれば,USB-TTL をつなぐと,システム情報の USB に,
のように「USB Serial Controller」が現れます.また,Terminal を立ち上げ,
$ cd /dev $ ls -alF tty.usb*
とすると,
のように,tty.usbserial というデバイスが現れるはずです.
次に,ER-X のカバーを外します.裏面
の両端の2ヵ所にネジがあるので,これを外すと,
のように簡単にカバーを外せます.少なくとも私の場合は封印シールなんかは特に付されていませんでした.で,USB-TTL を
のように接続します.この状態で,まず,brew から,
$ brew install minimum
のように minicom を導入し(brew ってなに?って人は
を参照してください),Terminal の「プロファイル」⇒「キーボードの設定」の「メタキーとして Options キーを使用」にチェックが
のように入っているのを確認してから,
$ export LANG=C $ minicom -b 57600 -o -D /dev/tty.usbserial
のように minicom を起動します.「メタキーとして Options キーを使用」にチェックが入ってないないと,minicom を終了させられなくなるからです(META Z, X で minicom は終了です).ここまで,キチンと設定できていれば,ER-X の電源を入れると,
のように,1, 2, 3, 4, 7, 9 の選択肢が現れます.で,
だと,4 を選択して,シングルモードで起動させて……という手順が記されていますが,残念ながら私の場合はより深刻な症状で,これだと上手くいきませんでした(具体的に言うと,起動して ID と password は聞かれるのですが,ID: ubnt, password: ubnt ではログインできず,かと言って root なんかでもログインできないし,さらに,eth0 にケーブルを刺すとカーネルパニックでハングアップするという,なんだか中途半端に Firmware が書き込まれてしまったような状態でした).
と言うことで,次の策として,boot 時の選択肢に,
- Load system code to SDRAM via TFTP
- Load system code then write to Flash via TFTP
ってのがあったので,tftp 経由で正しいファームウェアを送り込めないかを検討することにしました.
tftp server の準備
MacOS High Sierra だと,tftp server ははじめから導入されているようで,単に,
$ sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
とするだけで使えるようになります.
さて,ここからの手順の大枠は,
に従います.なお,ググると見つかる
に「emrk-0.9c.bin」を tftp で送り込む手順が示されていますが,これは ER-X だとうまくいかないことを注意しておきます.上のページにもありますが,これは「ER-Lite」 もしくは「ER-PoE」でしか使えないイメージのようで,実際に手順に従い書込んでもウンともスンとも言いません.
ブートイメージと書込みイメージの準備
次にER-X で使えるブートイメージと書込みイメージの準備をします.まず,ER-X で使えるブートイメージですが,
から
- openwrt-ramips-mt7621-ubnt-erx-initramfs-kernel.bin
をダウンロードしてください.また,ER-X に書き込むイメージとして,
から
- ER-e50.v1.10.1.5067582.tar
をダウンロードし,適当なところに
$ tar -xvf ER-e50.v1.10.1.5067582.tar x vmlinux.tmp x vmlinux.tmp.md5 x squashfs.tmp x squashfs.tmp.md5 x version.tmp x compat
のように展開しておいてください.
ブートイメージの送り込みと起動
次は,ブートイメージを tftp で ER-X に送り込むための準備を行います.
まず,ER-X の「eth0/PoE IN」ポートと Mac を Ethernet ケーブルで接続します.今の Mac は Ethernet ポートが無いので,実際には USB Ethernet 変換アダプタなどを利用することになると思います.私の場合はたまたま所有していた Anker の USB Hub + Ethernet 変換アダプタを使って,
のように接続しました.また,USB Ethernet アダプタに,固定アドレスとして,192.168.1.179 を「システム環境変数」⇒「ネットワーク」経由で割り当てました.
次に,ブートイメージを
$ sudo mv Downloads/openwrt-ramips-mt7621-ubnt-erx-initramfs-kernel.bin /private/tftpboot/
の様に,tftp server が管理するディレクトリに送り込みます.この状態で,再び,ER-X の電源を投入し,今度は,シリアルコンソールに表示されるメニュー
...... Please choose the operation: 1: Load system code to SDRAM via TFTP. 2: Load system code then write to Flash via TFTP. 3: Boot system code via Flash (default). 4: Entr boot command line interface. 7: Load Boot Loader code then write to Flash via Serial. 9: Load Boot Loader code then write to Flash via TFTP. default: 3
から1番を選択し,
1: System Load Linux to SDRAM via TFTP. Please Input new ones /or Ctrl-C to discard Input device IP (172.20.32.1) ==: 192.168.1.1 Input server IP (172.20.32.2) ==: 192.168.1.179 Input Linux Kernel filename (xxxxxxxxxxx) ==: openwrt-ramips-mt7621-ubnt-erx-initramfs-kernel.bin
のように,ER-X の IP アドレス,tftp server の IP アドレス,そして送り込むイメージの名前を入力します.正しく入力できていると,
ETH_STATE_ACTIVE!! TFTP from server 192.168.1.179; our IP address is 192.168.1.1 Filename 'openwrt-ramips-mt7621-ubnt-erx-initramfs-kernel.bin'. TIMEOUT_COUNT=10,Load address: 0x80a00000 Loading: Got ARP REPLY, set server/gtwy eth addr (00:e0:1b:80:06:b0) Got it ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ############################################################## done Bytes transferred = 2976846 (2d6c4e hex) NetBootFileXferSize= 002d6c4e Automatic boot of image at addr 0x80A00000 ... ## Booting image at 80a00000 ... Image Name: MIPS OpenWrt Linux-4.9.87 .....
のような感じでブートしますので,
....... [ 16.470801] br-lan: port 1(eth0.1) entered forwarding state [ 16.482346] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready [ 17.470874] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready [ 34.610853] random: crng init done
まで待ち,Enter キーを入力すると(Enter を入力しないといつまで経っても進まない),
BusyBox v1.27.2 () built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt SNAPSHOT, r6551-905a3f2 ----------------------------------------------------- === WARNING! ===================================== There is no root password defined on this device! Use the "passwd" command to set up a new password in order to prevent unauthorized SSH logins. -------------------------------------------------- root@OpenWrt:/#
のようにプロンプト # が表示され,コマンド入力待ちとなります.
書き込みイメージの送り込みと書き込み
次は,書き込みイメージを送り込まないといけないのですが,その前に,「eth0/PoE IN」ポートに刺さっているイーサネットケーブルを取り外し,それを下の写真の様に「eth1」ポートに刺し直さなければなりません.
この状態で,Mac の ER-e50.v1.10.1.5067582.tar を展開したフォルダに移動し,ファイル
- vmlinux.tmp
- squashfs.tmp
- squashfs.tmp.md5
- version.tmp
を scp を使って ER-X の /tmp に
$ scp version.tmp squashfs.tmp squashfs.tmp.md5 vmlinux.tmp [email protected]:/tmp/. The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established. RSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts. version.tmp 100% 42 29.5KB/s 00:00 squashfs.tmp 100% 76MB 3.8MB/s 00:20 squashfs.tmp.md5 100% 33 25.1KB/s 00:00 vmlinux.tmp 100% 1679KB 3.7MB/s 00:00
の様に送り込みます.
送り込みが終了したら,次のコマンドをこの順に ER-X のシリアルコンソールから実行していきます.
root@OpenWrt:/# cd /tmp root@OpenWrt:/tmp# ubidetach -p /dev/mtd5 root@OpenWrt:/tmp# ubiformat /dev/mtd5 root@OpenWrt:/tmp# ubiattach -p /dev/mtd5 root@OpenWrt:/tmp# ubimkvol /dev/ubi0 --vol_id=0 --lebs=1925 --name=troot root@OpenWrt:/tmp# mount -o sync -t ubifs ubi0:troot /mnt/ root@OpenWrt:/tmp# cp /tmp/version.tmp /mnt/version root@OpenWrt:/tmp# cp /tmp/squashfs.tmp /mnt/squashfs.img root@OpenWrt:/tmp# cp /tmp/squashfs.tmp.md5 /mnt/squashfs.img.md5 root@OpenWrt:/tmp# dd if=/tmp/vmlinux.tmp of=/dev/mtdblock3 root@OpenWrt:/tmp# dd if=/tmp/vmlinux.tmp of=/dev/mtdblock4
なお,cp /tmp/squashfs.tmp /mnt/squashfs.img とすると,
[ 912.269341] Data buffer not 16 bytes aligned: 8ee3c798
のような表示が大量に出てきますし,時間もかかりますが,終わるまでとにかく待ちます.全て終了後,
root@OpenWrt:/tmp# reboot
として再起動し,しばらく待つと,
.... Starting network plug daemon: netplugd. Welcome to EdgeOS ubnt ttyS1 By logging in, accessing, or using the Ubiquiti product, you acknowledge that you have read and understood the Ubiquiti License Agreement (available in the Web UI at, by default, http://192.168.1.1) and agree to be bound by its terms. ubnt login:
の様に login プロンプトが出てきますので,
- ubnt login: ubnt
- password: ubnt
とするとログインできます.また,再び eth1 に刺さっているイーサネットケーブルを
のように eth0 に刺し直し,http://192.168.1.1 にアクセスすると Web インターフェースにアクセスすることができ,これで復旧完了です.
全体を通して
お気付きの通り,この復旧手順は,先人の努力の賜物なのですが,いろいろな所に情報が断片的に記されているのと,いろいろハマりどころがあり,私の場合,スタートしてから復旧までにほぼ半日要しました.
スムーズにいけば大体30分から1時間程度で復旧できますが,とてもではないけど覚えておけない手順なので,念のため,記録に残しておこうと思ったのがこの記事な訳です.
しかし,まぁ,頑張っただけあって,これで,ER-X なら,物理的に壊れない限りまぁ何とかできるかなという気分になりました.また,本システム,見ての通り u-boot が使われています.実は私は初めて u-boot を使ったのですが,調べてみるとラズパイで u-boot を使える様で,いちいち SD を書き換えなくても u-boot 経由でネットワークブートも実現できるみたいなので,まぁ,収穫かな,と(無理矢理)思うことにしています.
しかしですね,
今のところ復旧しただけ.本来の目的は SEIL/X86 の置き換えなんですが,いつになったらコレ実現できるのかなぁ……
というのが問題ですね.