弄るうえで一番重要な気がする。書くのを忘れていた。
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されている必要がある。12# 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 オプションが該当すると思われる。1ubiupdatevol
例:
1ubiupdatevol /dev/ubi0_1 /tmp/ubi0_1.bin
メーカーファームでのkernelやrootfsの取り出しは、/dev/ubi*_* をcatでファイルに出力することで可能だった。