大破ログ

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

NEC WG2600HP

PRを5月17日に投げ、それ以降かなり時間がかかりましたが、6月20日にマージされました。WN-AX1167GRやETG3-Rのサポート作業等で後回しになっていましたが、この機種についてもまとめます。

2020/07/20 追記: WG2600HP2については、少し別の手順が必要です。以下を参照してください。 musashino205/routers/issues/1

仕様

以前経過報告として記事を書いたとおり、BUFFALO WXR-2533DHPと同じくIPQ8064を搭載しています。おおよそ構成は似通っているものの、WXR-2533DHPの大型筐体に対して、こちらは厚みのある金属板を基板両側に持たせてチップ等からの熱を伝達させるなどして廃熱を処理し、かなりコンパクトにまとめられています。

  • SoC: Qualcomm IPQ8064 (384 - 1,400MHz, 2C2T)
  • RAM: DDR3 512MB
  • Flash: SPI Flash 32MB
  • WAN/LAN: 1000Mbps x1 / 1000Mbps x4
  • UART: 115200bps (電源コネクタ側からRX, TX, NC, GND, Vcc)
  • USB: 3.0 Type-A x1

その他Kernel等の詳細は雑記ブログを参照。

OpenWrt化

現状メーカーのアップデートファームの形式が判明していないため、factoryファームはありません。 WG2600HPのU-BootやKernel周りの仕様上、OpenWrt化にはシリアルコンソールが必須であるほか、非常に複雑な手順で導入する必要があります。また、U-Bootが元々持っている復旧手段が無いに等しいため、文鎮化のリスクが高めです。

  • WG2600HPのfailsafeモードに入る

    WG2600HPをシリアルコンソールを接続した状態で電源を投入し、途中 Press the [f] key and hit [enter] to enter failsafe mode と表示されたタイミングで "f" -> "Enter" の順にキーを押下してfailsafeモードに入る
  • fw_env.configを作成

    fw_printenv, fw_setenvコマンドを使用できるようにするため、/etc/fw_env.configを以下の内容で作成する [sourcecode] /dev/mtd9 0x0 0x10000 0x10000 [/sourcecode]
  • U-Bootの環境変数を設定

    以下のコマンドを上から下まで全て実行し、OpenWrtをブートするのに必要なU-Bootの環境変数を設定する 追記: LAN側のリンクがある場合、延々とTFTPを試行し続ける問題があったので変更しました。ipaddrとserveripは、ローカル環境で使用することが無いアドレス帯に設定してください。
    fw_setenv ipaddr "192.168.0.1"
    fw_setenv serverip "192.168.0.2"
    fw_setenv bootcmd 'ping ${serverip} && set autostart yes && tftpboot 0x44000000 wg2600hp-initramfs.bin; bootipq'
  • PC側でTFTPサーバを準備

    PC側のIPアドレス192.168.0.2 に設定し、WG2600HP用のinitramfsファームを wg2600hp-initramfs.bin にリネームしたうえでTFTPディレクトリに置き、TFTPサーバを起動
  • WG2600HPをinitramfsファームでブート

    WG2600HPから電源ケーブルを抜き差しして再起動させる。ブートする際に自動的にinitramfsファームをTFTPサーバからダウンロードしてRAMに読み込み、それを使用してブートされる 追記: PC側でWG2600HPからのpingに応答できる状態にしておく。Windowsの場合、ファイアウォールの "パブリック" でファイアウォールを一旦無効化、またはICMP requestの許可を行う。 pingが失敗した場合、TFTPでinitramfsが取得されずFlashからのブートが試行されてしまう。
  • sysupgradeファームの書き込み

    initramfsファームで起動後、 mtd erase firmwarefirmwareパーティションのメーカーファームを消去したうえでsysupgradeコマンドでWG2600HP用のsysupgradeファームを書き込む
  • 完了

    sysupgradeファームを書き込み後、OpenWrtが正常に起動してくれば完了。 sysupgradeが完了して再起動される前に、TFTPサーバが起動しているPCは切断しておく(initramfsファームでの起動を試行してしまうため)。

備考

  • WG2600HPは、以前の記事でも書いた通りU-BootとKernelのどちらもログインパスワードが設定されており、通常の方法では直接操作することができない。 ファームはOpenWrtベースのQSDKを利用しているため、failsafeモードを利用していく。
  • U-BootはCtrl + Cでブートプロセスを中断させコンソールに入る方法が提供されているものの、前述のとおりパスワードがかけられており入ることができない。 ただしLinux Kernelが破損している場合は非常時であるためか、そのままU-Bootのコンソールに落ちる。 注意するのはKernelが破損している場合のみという点で、もしKernelが問題なくてもRootfsが破損するなどしてKernelがRootfsを読み込めずKernel Panicになった場合、U-Bootに落ちず再起動が繰り返されるのみとなり、Flashを直接ライタ等で書き換えるなどするしか復旧できなくなる。
  • 上記に関連して、OpenWrt化の手順でU-Bootに設定する環境変数のうち、 "ping ${serverip} && tftpboot 0x44000000 wg2600hp-initramfs.bin; bootipq" はまずserveripに対してpingを試行し、成功すればTFTPサーバがあるものとしてinitramfsファームの読み込みを試行する。pingが失敗した場合、TFTPでのinitramfsファーム転送を行わないものとしてそのまま bootipq に進み、Flashからのブートが行われる。 initramfsファームを介してOpenWrtを導入した後も、この設定は復旧手段としてそのまま残すことを強く推奨。 また、この関係上 "wg2600hp-initramfs.bin が存在するTFTPサーバが起動されているPCが接続されている" 場合は先に読み込まれるinitramfsファームが優先されるため、必要がなくなったら切断する。
  • メーカーファームでは、32MBのFlashのうち 0x860000 - 0xa60000 の0x200000 (2MB)をKernel、 0xa60000 - 0x2000000 の 0x15a0000 (21.625MB)をRootfs として使用している。 しかしOpenWrtではもう既にKernelが2MBでは全く不足すること、またFlash内を効率的に利用したいことから、ramips等で行われているようにKernel + Rootfsをひとまとめにした "firmware" パーティションを利用するようにした。なお、これについてはForumで頂いたアドバイスがきっかけ。 これにより、他機種では "kernel" パーティションを4MBまで拡張するコミットが入るなどしているものの、WG2600HPではKernelのサイズに縛られたりすることなく柔軟にFlash内の領域を利用できる。 余談として、この "firmware" パーティションの仕組みを採用したことにより、"Netgearの一部機種でsysupgradeが失敗する" という問題が起きた。これはNetgear機のdts内にあった潜在的な問題が原因で、今回WG2600HPが "firmware" パーティションをipq806x targetで初めて採用したために偶然踏み抜いた模様。既に修正が行われ、snapshotと18.06のいずれも問題は解消済み。
  • メーカーファームに戻す場合、initramfsを投入した際に "firmware" パーティションをバックアップしたものを mtd write stock_firmware.bin firmware として書き込むことで可能。 ただし、OpenWrt投入前のメーカーファームではU-Bootの環境変数が格納される "APPSBLENV" 内の設定は利用されておらず、U-Bootが持っているデフォルト値が使用されている。上記のOpenWrt導入手順では、OpenWrtにおいては "bootargs" の設定は不要であるため手順に含めていないものの、メーカーファームではbootargsでカーネルログ出力先のttyやbaudrateの指定が必要であり、もしこれが無いと何もコンソールに出力されない。 そのため、メーカーファームに戻す場合は以下によってbootargsを追加しておく。 [sourcecode language="bash"] fw_setenv bootargs "console=ttyHSL1,115200n8 root=mtd:rootfs rootfstype=squashfs reboot=0" [/sourcecode] このbootargsはOpenWrtにおいては無視されるため、予め追加しておいても問題ない。
  • SoCの動作クロックは 384MHz - 1,400MHz の間で負荷に応じて変動。

雑感

今回、WG2600HPが非常に厄介な仕様であったため、以前の記事で書いた通り文鎮化スレスレでメーカーファームでのアップデート作業から意図的にKernelを破損させたりと、なかなかにヒヤヒヤする作業の連続だった(最初に作業していた個体は、基板上のシリアル用ピンを修正する際に誤って破損させてしまい、文鎮化してしまったが)。factoryを作れなかった故に導入の難易度が高いことが心残りであり、そのうちなんとかしたいなとも思う。 また、偶然踏み抜いたものではあるものの、結果的にNetgear機でのトラブルを引き起こしてしまったのが若干申し訳ない。