文鎮化した WHR-G301N を Macbook air or Pro retina から復旧させる
WHR-G301N を DD-WRT 化して使っていたのですが、ファームウェアをアップデートしようとしたら、別の機種のを間違って焼いて文鎮化。。。ググってみると修復手順は判ったのですが、Macbook air or Pro retina の場合は若干の工夫が必要だったので忘備録として残すメモ。
この手順でできること
- WHR-G301Nに純正のファームウェアを強制的に書き込む。
必要なモノ
- 流し込みたいファームウェア
- USB or Thunderbolt LAN アダプタ
あると便利なもの
- イーサネットハブ
これが有ると、大変便利です。無い場合は少々しんどい。
手順の中で "arp -s" を行いますが、これは Macbook が有線LANに接続済みの状態で行う必要があります。有線LANに接続されていない状態では "arp -s" が失敗します。しかし今回の復旧では作業開始の時点で WHR-G301N の電源を落としています。だから WHR-G301N と Macbook を直結した場合は LAN がアクティブではないために、予め arp を実行しておくことができない。
そうすると直結の場合は WHR-G301N の電源を投入後、有線LANが有効な状態となったことを確認して "arp -s" を実行し、さらにタイミングを合わせて tftp も行うことになります。この間、僅か7秒ですよ。これって無理とは言わないけど、かなり厳しいです。
でも、イーサネットハブがあれば、予め LAN 接続が有効な状態で arp -s を実行した段階までは事前に準備しておけます。あとはタイミングを合わせて WHR-G301N の電源投入と tftp の実行を行うだけです。
手順概略
- Macbook と WHR-G301N を接続します。ハブが別にある場合は Macbook と WHR-G301N の間に挟みます。
- Macbook に接続した LAN アダプタのIPアドレスを 192.168.11.2 に設定します。
- ターミナルで "sudo arp -s 192.168.11.1 WHR-G301NのMACアドレス" を実行し、WHR-G301N の MAC アドレスに対して 192.168.11.1 のIPアドレスを紐づけます。
- 別のターミナルを開き、ping 192.168.11.1 を実行します。
- WHR-G301Nの電源を入れて7秒待ち、tftp コマンドで純正ファームウェアを流し込みます。
- ping の応答が帰ってくるようになったら、Web の管理画面にアクセスしてみます。
上記の手順を自動的にやってくれるスクリプト
この手順をスクリプトにしてみました。ただし Mac 側の NIC のIPアドレス設定は含んでおりませんので、これは行った上でご利用ください。また、このスクリプトは「イーサネットハブを別途準備する」ことを前提に書いています。
また、このスクリプトは WZR-HP-AG300H に tftp でファームウェアを流し込む場合にも使えることを確認しています。
#!/bin/sh macaddr=$1 firmware=$2 # パラメタ数が合わないときは中止 if [ $# != 2 ]; then echo "" echo " $0 MACアドレス ファームウェアのファイル名" echo "" exit 1 fi # ファームウェアが無ければ中止 if [ ! -f $firmware ]; then echo "" echo " ファームウェア $firmware が見つかりません。中止します。" echo "" exit 1 fi echo "以下の内容で実行します。" echo "実行する場合は enter を、中止する場合は ctrl + c を押してください。" echo " MACアドレス $macaddr" echo " ファームウェア $firmware" echo "" echo "※" echo "enter を押すと、arp 実行のためにログインアカウントのパスワード入力を要求します。" read echo "MACアドレスとIPアドレスの紐付けを解除します" sudo arp -s 192.168.11.1 $macaddr if [ $? -ne 0 ]; then echo "sudo arp の実行に失敗しました。処理を中止します。" echo "" exit 1 fi echo "enter を押して3秒後に WHR-G301N の電源を入れてください。" echo "画面にはカウントダウン表示が出ます。" read # 3秒カウントダウン for i in $( seq 3 -1 1 ) ; do echo "$i\r" sleep 1 done echo "電源を入れてください。" sleep 1 # 7秒待つ for i in $( seq 1 7 ) ; do echo "$i\r" sleep 1 done echo "" echo "tftpを実行します" ( cat<<EOF verbose connect 192.168.11.1 binary put $firmware EOF ) | tftp echo "" echo "MACアドレスとIPアドレスの紐付けを解除します" sudo arp -d 192.168.11.1 echo "" echo "終了しました。念のために ping 192.168.11.1 を実行して、応答が返ってくるのを待ってください。"