OpenWrtからメーカーファームへのrevert

某所で話題が出ており、自分がサポートを担当した機種だけ書いておこうと思いページ作成。

I-O DATA

  • WN-AG300DGR / WN-AC1167DGR / WN-AC1600DGRx

    Senao機はメーカーファームが特定の方法によりエンコードされているため、デコードしてから書き込む。
    上記機種の場合、メーカーファームにおいてはデュアルイメージではない為デコードしたファームをそのまま書き込めばOK。

    必要なもの

    • Linux環境(WSLで代用可)
    • 各機種のI-O DATAが提供するアップデート用ファーム
    • SCP (SSH)

    手順

    mksenaofwコマンドを用意
    メーカーファームのdecodeの為、mksenaofwコマンドを実行可能な状態にする。
    Linux機が手元にありOpenWrtのビルド環境が構築済みの場合は、OpenWrtのリポジトリをcloneしたうえでmenuconfigを適当に設定し、 make V=s tools/install することでstaging_dirのいくつか下にビルドされる。

    ビルド環境が無い場合、 taiha.net/jenkinsのWorkspace からLinux環境(またはWSL)の適当なディレクトリに mksenaofw をダウンロードする。
    ダウンロード後、chmod 755 mksenaofw により実行のパーミッションを付加する。

    メーカーファームを用意
    メーカーファームに戻したい機種用のI-O DATAが提供するアップデート用ファームをダウンロードし、適当な場所に展開しておく。
    メーカーファームをdecode
    以下を実行し、メーカーファームをdecodeする。

    mksenaofw -d decodeするファイル名 -o 出力先ファイル名
    

    例:

    ~/router/firmware-utils/mksenaofw -d wnac1600dgr2_v207.dlf -o wnac1600dgr2_v207.dec
    


    decode後、正常に行えているか hexdump または od 等で確認しておく。
    例:

    hexdump -n 128 -C wnac1600dgr2_v207.dec
    00000000  27 05 19 56 a0 08 19 88  59 71 a1 61 00 2b fb 0b  |'..V....Yq.a.+..|
    00000010  80 00 20 00 80 24 b2 60  e5 a2 0b 1b 05 05 02 03  |.. ..$.`........|
    00000020  4c 69 6e 75 78 20 4b 65  72 6e 65 6c 20 49 6d 61  |Linux Kernel Ima|
    00000030  67 65 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |ge..............|
    00000040  5d 00 00 00 02 00 c6 a2  00 00 00 00 00 00 00 6f  |]..............o|
    00000050  fd ff ff a3 b7 7f 63 c5  55 7e b6 b7 c0 22 87 02  |......c.U~..."..|
    00000060  b6 55 67 6f 74 14 e4 c2  81 b5 38 ce 8f b7 87 be  |.Ugot.....8.....|
    00000070  c2 c8 be e9 47 c4 44 73  9e f5 0e b3 72 a1 8e ff  |....G.Ds....r...|
    00000080
    


    27 05 19 56 から始まり、文字列データに “Linux Kernel Image” が含まれていればOK。

    ルータにdecode済みファームを転送
    上記でdecodeしたファームをルータへ転送する。次の手順でFlash内のfirmware領域を消去した後では転送できなくなる恐れがあるため、先に転送しておく。
    scp コマンドや、USBストレージが利用可能であればそちらでルータ内にコピーでも可。

    例 (scp):

    scp wnac1600dgr2_v207.dec root@192.168.1.5:/tmp/
    

    Flash内に書き込み
    転送したファームを書き込む。
    個人的に、Flash内のfirmware領域を全部削除してから書き込むことが多い。
    まず以下を実行してfirmwareパーティション内を全消去する。

    mtd erase firmware
    


    この時、最後の “firmware” を間違えないよう注意すること。ただし、WN-AG300DGR/WN-AC1167DGR/WN-AC1600DGRxでは他のパーティションは全てread-onlyに設定しているため、コマンドの実行に失敗するだけのはずではある。
    また、このコマンドの完了時点で再起動しないこと。OSイメージが消えている状態のためブート不能に陥り、復旧にはシリアル (UART)の接続が必要になる。

    次に、以下を実行して転送済みのファームを書き込む。

    mtd write 転送済みファーム名 firmware
    

    例:

    mtd write wnac1600dgr2_v207.dec firmware
    


    書き込み後、hexdump コマンドを使用して、正常にFlash内に書き込まれているか確認する。予め、 cat /proc/mtd で “firmware” と名付けられているmtdパーティションの番号を確認しておく。

    hexdump -n 128 -C "firmware"パーティションのmtd
    

    例:

    hexdump -n 128 -C /dev/mtd2
    00000000  27 05 19 56 a0 08 19 88  59 71 a1 61 00 2b fb 0b  |'..V....Yq.a.+..|
    00000010  80 00 20 00 80 24 b2 60  e5 a2 0b 1b 05 05 02 03  |.. ..$.`........|
    00000020  4c 69 6e 75 78 20 4b 65  72 6e 65 6c 20 49 6d 61  |Linux Kernel Ima|
    00000030  67 65 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |ge..............|
    00000040  5d 00 00 00 02 00 c6 a2  00 00 00 00 00 00 00 6f  |]..............o|
    00000050  fd ff ff a3 b7 7f 63 c5  55 7e b6 b7 c0 22 87 02  |......c.U~..."..|
    00000060  b6 55 67 6f 74 14 e4 c2  81 b5 38 ce 8f b7 87 be  |.Ugot.....8.....|
    00000070  c2 c8 be e9 47 c4 44 73  9e f5 0e b3 72 a1 8e ff  |....G.Ds....r...|
    00000080
    


    書き込んだファームと同じデータが存在してればOK。

    再起動
    正常に書き込まれたか確認後、reboot を実行して再起動し、メーカーファームで起動してくれば完了。
広告