WXR-2533DHPをメーカーファームに書き戻す

弄るうえで一番重要な気がする。書くのを忘れていた。

WXR-2533DHPでのfirmware

WXR-2533DHPでは、U-Bootやデバイス固有の情報(WPS PIN、無線の事前共有鍵、MACアドレス、その他色々)を4MBのSPI Flashに持ち、KernelとRootfs、Rootfs_data は256MBのNAND Flashに持っている。

このうちNANDでは、前半128MB分が 0x0 – 0x4000000 と 0x4000000 – 0x8000000 にそれぞれ分割され、それぞれ mtd0, mtd1 として割り当てられており、それぞれに Kernel + Rootfs + Rootfs_data の同一のイメージが格納されている。ちなみに、後半128MB分は使用されず空。
ただしデータは直接mtdに書き込まれているのではなく、書き込み分散などのウェアレベリング機能を有するUBIにより “kernel”, “ubi_rootfs”, “ubi_rootfs_data” パーティションが形成され、その中にそれぞれ格納されている。

このためか、mtdに対してそのバックアップを直接

1
# mtd write mtd0.bin /dev/mtd0

として書き込んでも、エラーが大量に出るようになってしまう。

書き戻し

そこで、書き戻しには ubiformat または ubiupdatevol を使用する。

  • ubiformat
    mtdをUBIとしてフォーマットするコマンドではあるものの、-f オプションでイメージの書き込みも可。
    1
    # ubiformat -f 

    上記コマンドを使い、メーカーファームで

    1
    # dd if=/dev/mtd0 of=/tmp/mtd0.bin

    などとして取得したイメージを投入する。現状ビルドできているOpenWrt initramfsイメージ上からも可。
    例:

    1
    # ubiformat -f mtd0.bin /dev/mtd0

    ただし指定したmtdがUBIでattachされている場合は書き込みができずエラーが出るため、先に ubidetach でdetachしておく。

    1
    # ubidetach -p /dev/mtd0
  • ubiupdatevol
    mtd上に存在するUBI Volumeに対して、個別で更新を実行するコマンド。メーカーファームでのファームアップデートでもこれが使われていた。
    ubiformatとは異なり、先にmtdがUBIでattachされている必要がある。

    1
    2
    # ubiattach -p /dev/mtd0
    # ls -al /dev/ubi*

    /dev/ubi*_* の最初の数字は、マウントされた順番で割り当てられる。2つ目は 0: kernel, 1: ubi_rootfs, 2: ubi_rootfs_data 。
    基本はそれぞれにkernelやrootfsの単体のイメージを焼き込む。単一のイメージから位置とサイズを指定して実行することも可能。
    位置の指定は、メーカーファームではoffsetを意味する -o オプションが該当、OpenWrtでは –skip オプションが該当すると思われる。

    1
    ubiupdatevol 

    例:

    1
    ubiupdatevol /dev/ubi0_1 /tmp/ubi0_1.bin

    メーカーファームでのkernelやrootfsの取り出しは、/dev/ubi*_* をcatでファイルに出力することで可能だった。

広告
Report this ad

コメントを残す