Slide 1

Slide 1 text

近況まとめ OSC 2018 Tokyo/Spring @musashino205

Slide 2

Slide 2 text

自己紹介 • HN: 武蔵野, 大破 • musashino_205 • musashino205 @mstdn.maud.io • OSSは2年目くらい(?) • Linuxはルータと戯れながら学習中 • ドメイン: taiha.net, 大破.net

Slide 3

Slide 3 text

近況 • 新規ルータのOpenWrtサポート追加作業 • BUFFALO WXR-2533DHP • (作業中) • 多摩電子工業 Axing W06 • openwrt/openwrtへマージ済み

Slide 4

Slide 4 text

BUFFALO WXR-2533DHP

Slide 5

Slide 5 text

BUFFALO WXR-2533DHP • 仕様 • SoC: Qualcomm IPQ8064 (ARM, 2C2T, Max 1.4GHz) • RAM: DDR3 512MB • Flash: • SPI: 4MB • ブートローダや個体に関する設定の保持 • NAND: 256MB • OSイメージ (Kernel + Rootfs) を2組 • 後半128MBは空 • WAN/LAN: 1000Mbps x1 (WAN), 1000Mbps x4 (LAN) • WLAN: • USB: USB 3.0 Type-A x2

Slide 6

Slide 6 text

対応作業 • とりあえずシリアルを繋いで、MTDやGPIOの情報を取り出し ながらDTS等を記述 • LEDやボタン類のGPIOはすぐに判明 • /sys/kernel/debug/gpio • イメージ生成も、既存の機種と同様に記述 • initramfs, sysupgradeイメージが生成される • ここまでは順調

Slide 7

Slide 7 text

NAND Flash • OS (Linux) の格納に使用 • MTD パーティション2つ • 各MTD パーティション内にUBIによりボリューム3つ Bank1 0x0 – 0x4000000 (64 MiB) Bank2 0x4000000 – 0x8000000 (64 MiB) (未使用) 0x8000000 - 0x10000000 (128 MiB) MTD mtd0 (rootfs) mtd1 (rootfs_1) - UBI Vol kernel ubi_rootfs (squashfs) ubi_rootfs_data (ubifs) Kernel ubi_rootfs (squashfs) ubi_rootfs_data (ubifs) -

Slide 8

Slide 8 text

NAND Flash - 2 • ブートには基本的にBank1 (mtd0)を使用 • Bank2 (mtd1)はバックアップ用 Bank1 0x0 – 0x4000000 (64 MiB) Bank2 0x4000000 – 0x8000000 (64 MiB) (未使用) 0x8000000 - 0x10000000 (128 MiB) MTD mtd0 (rootfs) mtd1 (rootfs_1) - UBI Vol kernel ubi_rootfs (squashfs) ubi_rootfs_data (ubifs) Kernel ubi_rootfs (squashfs) ubi_rootfs_data (ubifs) -

Slide 9

Slide 9 text

NAND Flash - 3 • ブート時にU-Bootが各Bankのチェックを実施 • KernelのchecksumとRootfsのchecksumをチェック Checking Bank1 Image ... Creating 1 MTD partitions on "nand0": 0x000000000000-0x000004000000 : "mtd=0" Bank1 Image is good kernel_checksum is 0x4d51f25f , rootfs_checksum is 0xd3 Checking Bank2 Image ... Creating 1 MTD partitions on "nand0": 0x000004000000-0x000008000000 : "mtd=0" Bank2 Image is good kernel_checksum is 0x4d51f25f , rootfs_checksum is 0xd3 Bank1 Image the same as Bank2 Image

Slide 10

Slide 10 text

NAND Flash - 4 • Bank1のchecksumが取得できない、または一致しなければ Bank2からBank1へ書き戻し • Bank2のchecksumが取得できない場合、Bank1から書き戻し • Kernelのchecksumはヘッダ内に含まれるdata CRC値 tofu@Tofu-H170W10:~/wxr-2533dhp$ binwalk wxr_2533dhp_jp_133 DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 128 0x80 uImage header, … , data CRC: 0x4D51F25F, OS: Linux, CPU: ARM, image type: OS Kernel Image, …

Slide 11

Slide 11 text

NAND Flash - 5 • Rootfsのchecksumは、ボリューム内データの末尾に付く1Byte

Slide 12

Slide 12 text

NAND Flash - 6 • このchecksum算出方法は某氏から教わった • これによりイメージ生成方法を改変することで、U-Bootのチェッ クをパスできるように • が。 • 今度はOpenWrtがRootfsを見つけられなくなりKernel Panicするよう に • OpenWrtはRootfsのUBI Volume名としては “rootfs” しか対応し ていない • U-Bootは “ubi_rootfs” が見つからないと「ボリューム無し」と 判定してしまう(Bankが破損していると判定される) • ボリューム名をどちらかに寄せることができない • ⇒!?!? od -A n -t u1 | tr -s ' ' '¥n' | awk '{s+=$0}END{printf "%c", 255-s%256}'

Slide 13

Slide 13 text

NAND Flash - 7 ならU-Boot用にfakeなRootfs作ってしまおう • OpenWrtのRootfsを複製すると、無駄に容量を取ってしまう • 空のディレクトリを作成し、squashfs化 • そこにchecksumを取得して付加

Slide 14

Slide 14 text

NAND Flash - 8 • Bank1 (mtd0)内のUBI Volumeは4つに Bank1 0x0 – 0x4000000 (64 MiB) MTD mtd0 (rootfs) UBI Vol ubi_rootfs (sqashfs) kernel rootfs (squashfs) rootfs_data (ubifs)

Slide 15

Slide 15 text

NAND Flash - 8 • Bank1 (mtd0)内のUBI Volumeは4つに Bank1 0x0 – 0x4000000 (64 MiB) MTD mtd0 (rootfs) UBI Vol ubi_rootfs (sqashfs) kernel rootfs (squashfs) rootfs_data (ubifs) U-Bootのチェック OpenWrtのブート

Slide 16

Slide 16 text

WXR-2533DHP 課題 • とりあえずOpenWrtが動作するようになったものの、UBI ボ リュームの扱いが複雑すぎる • OpenWrtで “rootfs” 以外のボリューム名も使えるようにで きないか…? • sysupgrade時に、ubi_rootfsを消してしまうと起動できなく なる • WXR-2533DHP用にsysupgradeスクリプトが追加で必要 • USBポートへの電源供給を管理しているGPIOが不明 • ブート時にデバイスが接続されていると、エラーを起こし て再起動するまでポートが使用不可に • BUFFALOが公開しているGPLソースコードに該当箇所を見 つけられず

Slide 17

Slide 17 text

多摩電子工業 AXING W06

Slide 18

Slide 18 text

AXING W06 • フラッと行った秋葉原某所で見つけ、USBポートが付いていて 面白そうだなと購入 • 個人的に初めてのMediaTek MT7688AN (MIPS, 1C1T, 575MHz) • メーカーファームがOpenWrtベースで、さほど難しくなさそう • LEDとボタン類はGPIOを1つずつ叩いて特定 • “Power” LEDがGPIOに接続していなかった • 直接3.3Vの電源回路に接続 • ステータスを表すために使用できない(点滅とか) • ある程度まとまったのでupstreamにPR • 少し議論したうえでマージ

Slide 19

Slide 19 text

ご清聴ありがとうございました。 記事など • WXR-2533DHP – 大破雑記帳 • https://memo205.wordpress.com/2018/01/05/wxr-2533dhp/ • WXR-2533DHPをOpenWrtでサポートしてみる(経過報告)- 鉄PCブログ • https://tetsupc.wordpress.com/2018/01/08/wxr- 2533dhp%e3%82%92openwrt%e3%81%a7%e3%82%b5%e3%83%9d%e3%8 3%bc%e3%83%88%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b%ef%b c%88%e7%b5%8c%e9%81%8e%e5%a0%b1%e5%91%8a%ef%bc%89/ • WXR-2533DHP(経過報告2)- 鉄PCブログ • https://tetsupc.wordpress.com/2018/01/19/wxr- 2533dhp%ef%bc%88%e7%b5%8c%e9%81%8e%e5%a0%b1%e5%91%8a2% ef%bc%89/ • 多摩電子工業 Axing W06 – 鉄PCブログ • https://tetsupc.wordpress.com/2018/02/21/%e5%a4%9a%e6%91%a9%e9 %9b%bb%e5%ad%90%e5%b7%a5%e6%a5%ad-axing-w06/