大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

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に対してそのバックアップを直接 [sourcecode]

mtd write mtd0.bin /dev/mtd0

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

書き戻し

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

  • ubiformat
    mtdをUBIとしてフォーマットするコマンドではあるものの、-f オプションでイメージの書き込みも可。 [sourcecode] # ubiformat -f [/sourcecode] 上記コマンドを使い、メーカーファームで [sourcecode] # dd if=/dev/mtd0 of=/tmp/mtd0.bin [/sourcecode] などとして取得したイメージを投入する。現状ビルドできているOpenWrt initramfsイメージ上からも可。 例: [sourcecode] # ubiformat -f mtd0.bin /dev/mtd0 [/sourcecode] ただし指定したmtdがUBIでattachされている場合は書き込みができずエラーが出るため、先に ubidetach でdetachしておく。 [sourcecode] # ubidetach -p /dev/mtd0 [/sourcecode]
  • ubiupdatevol
    mtd上に存在するUBI Volumeに対して、個別で更新を実行するコマンド。メーカーファームでのファームアップデートでもこれが使われていた。
    ubiformatとは異なり、先にmtdがUBIでattachされている必要がある。 [sourcecode] # ubiattach -p /dev/mtd0 # ls -al /dev/ubi* [/sourcecode] /dev/ubi*_* の最初の数字は、マウントされた順番で割り当てられる。2つ目は 0: kernel, 1: ubi_rootfs, 2: ubi_rootfs_data 。
    基本はそれぞれにkernelやrootfsの単体のイメージを焼き込む。単一のイメージから位置とサイズを指定して実行することも可能。
    位置の指定は、メーカーファームではoffsetを意味する -o オプションが該当、OpenWrtでは --skip オプションが該当すると思われる。 [sourcecode] ubiupdatevol [/sourcecode] 例: [sourcecode] ubiupdatevol /dev/ubi0_1 /tmp/ubi0_1.bin [/sourcecode] メーカーファームでのkernelやrootfsの取り出しは、/dev/ubi*_* をcatでファイルに出力することで可能だった。