ヤフオクにて漁っていた際にネットワークアダプタの情報がMarvellのものであることに気付いて衝動的に確保し、多少苦しみながらも解決して投げ込み、マージされました。
まとめていきます。
仕様
大半の機種でFortiSOCまたはIntel CPUを搭載するFortiGateとしてはかなり珍しく、Marvellの汎用SoCである88F6820を搭載しています。
そしてRAMが大きい上、個人的に初となる128MiBのSPI-NOR Flashを搭載。(これまで見たことのあるSPI-NORは64MiBが最大)
さらにはイーサネットポートを合計7ポートも搭載。
- SoC: Marvell Armada 385 88F6820
- RAM: DDR3 2048MiB (MT41K512M8DA-107 x4)
- Flash: SPI-NOR 128MiB (MX66L1G45GMI-10G)
- WAN/LAN: 1000Mbps x2/1000Mbps x5
- USB: USB 3.0 Type-A x1
- UART: "CONSOLE", 所謂Ciscoケーブル互換
その他詳細については、雑記を参照。
OpenWrt化
ブートローダが主に復旧用としてファームウェア投入機能を持つ為、それを利用してinitramfsイメージを踏み台とする
なお、 "FG-50E" と称する
- FG-50Eのブートメニューを表示させる
- 電源を接続してブートする途中、
Please wait for OS to boot, or press any key to display configuration menu
と表示されたタイミングで適当なキーを押下し、ブートメニューに入る - TFTPサーバを用意
- ブートメニュー上で
[R]: Review TFTP parameters.
を選択してTFTP関連の情報を表示し、それに従ってTFTPサーバを用意する
なお、PCはTFTP関連情報内に示されるポートに接続する
また、OpenWrtのinitramfsイメージは "image.out" にリネームの上TFTPフォルダに配置する - TFTPでinitramfsイメージをダウンロード
- ブートメニュー上で
[T]: Initiate TFTP firmware transfer.
を選択してTFTPを実行し、initramfsイメージをサーバからダウンロードする - initramfsイメージを実行
- TFTPサーバからのダウンロードが完了後
Save as Default firmware/Backup firmware/Run image without saving:[D/B/R]?
と表示されたら R キーを押下し、Flashには書き込まず実行する - メーカーファームウェアをバックアップ
- もし将来的にメーカーファームウェアに書き戻す可能性がある場合など、必要であればメーカーファームウェアをバックアップする
dd
を用い、/proc/mtd を確認の上 "firmware-info", "kernel", "rootfs" を最低限取り出し、scp等でPCに転送し保管する
例)
root@OpenWrt:/# mkdir /tmp/mtd root@OpenWrt:/# cd /tmp/mtd root@OpenWrt:/tmp/mtd# cat /proc/mtd dev: size erasesize name mtd0: 001c0000 00010000 "u-boot" mtd1: 00010000 00010000 "firmware-info" mtd2: 00010000 00010000 "dtb" mtd3: 00010000 00010000 "u-boot-env" mtd4: 00010000 00010000 "board-info" mtd5: 00600000 00010000 "kernel" mtd6: 01800000 00010000 "rootfs" mtd7: 00600000 00010000 "kn2" mtd8: 01800000 00010000 "rfs2" mtd9: 01200000 00010000 "part1" mtd10: 01200000 00010000 "part2" mtd11: 01e00000 00010000 "config" root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock1 of=mtd1_firmware-info.bin 128+0 records in 128+0 records out root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock5 of=mtd5_kernel.bin 12288+0 records in 12288+0 records out root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock6 of=mtd6_rootfs.bin 49152+0 records in 49152+0 records out
バックアップをデバイスに書き戻す際は、mtd
コマンドを用いて書き込む
mtd write <backup image> <target partition>
例)
mtd write mtd1_firmware-info.bin firmware-info mtd verify mtd1_firmware-info.bin firmware-info # 書き込まれたデータが元データと一致するか検証
- OpenWrt上でsysupgradeを実行
- scpなどを用いてsysupgradeイメージをデバイス上にアップロード(またはダウンロード)し、sysupgradeを実行する
- 完了
- Flashへの書き込みが完了後再起動され、OpenWrtで起動する
この時メーカーファームウェアで起動してしまう場合は、ブートメニューに入ったうえで[B]: Boot with backup firmware and set as default.
を選択し、デフォルトのOSイメージをOpenWrtを書き込んだ1番目の方に切り替える
備考
フロントのWAN1/2の "SPEED" LED(緑)とLAN1~5の "SPEED" LED(緑/橙)はOpenWrtにおいては100/1000Mそれぞれのリンク速度による取り扱いを行うことができない為、代わりに速度問わずリンクが確立された場合点灯するように構成した。
Linux Kernel及びOpenWrtにおいて、ネットワークデバイスのリンク速度に従ってLEDを制御するトリガが存在しないことが理由。
2023/07/29追記: 後日薄っすらと気になる記憶があり確認したところ、Ethernet PHYのリンク状態でLEDを制御するトリガがLinux Kernelに存在していることに気付き、それを使用してメーカー公式ファームウェアと同じ挙動をさせる変更を投げ、マージされた。WAN1, WAN2ポートはデフォルトでブリッジを構成している為、上流が1系統である場合はどちらに接続しても問題無い。
ただし、それぞれで別系統のWANを利用する場合、ブリッジを解除しそれぞれにOpenWrtの仮想インターフェースを割り当て直す。OpenWrtのサポートにおいては、Flash内に2組存在するOSイメージ領域のうち1つ目の最小限を利用するよう構成しており、もう片方のメーカーファームウェアに対しての影響は恐らく無いと思われる。
この為、ブートメニューにおいて[B]: Boot with backup firmware ~
を選択することで、必要に応じてOpenWrtとメーカーファームウェアを切り替えてブートできる。中古などで入手する場合、本機種のDCジャックは特殊であり通常の丸形プラグを持つACアダプタを使用できない為、基本的にはACアダプタが付属するものの選択を推奨。
なお、嵌合するプラグはMolex 5557-02Rであり、自作することは可能(例)。
作業時の色々
現状FortinetからGPLのソースコードは提供されておらず、基本的にはメーカーファームウェアのDeviceTreeのほか、実機上で試行錯誤を重ねてサポートを詰めていった。
ブートローダ自体はU-Bootであるものの、それ自体では中断プロンプトが出ず連続して実行されるFortiGate用プログラムないしはU-Boot内の改変部において中断プロンプトが表示される。それによって現れるブートメニューで受け付けるイメージ形式はU-BootのものではNGで、その形式の特定に少々時間を要した。
最終的に、本来ヘッダ内にはkernelやrootfs, DTB, その他データ等のoffset/lengthに加え様々な情報が付加されるようであるものの、そのうちkernelとrootfsのoffset/lengthのみでチェックを通せることが判明し、その形式をOpenWrtでのビルド時に生成するようにした。上記のTFTPで渡すイメージ形式に加えて、Flash内からブートする際に必要となるファームウェア情報が格納される場所の特定にも少々時間を要した。
TFTPで渡すイメージにはヘッダが必要であるものの、実際にFlash内のファームウェア領域に書き込まれるファームウェアではヘッダが削除されており、単体のzImageとなっている。しかし一方で、ブートローダによってFlash内からブートされる際、明らかにどこかに格納されたサイズ値を用いてkernelを読み込んでいるログが出ており、FlashからOpenWrtをブートするにはそれがどこに存在しているかを探し当てる必要に迫られた。
Flash内でファームウェア情報らしきものが存在する領域は早々に特定していたものの、ではその内のどれがKernelのサイズ値であるかということを特定するのに手間取った。結局のところ、あちこちの値に何とはなしにビットシフトを掛けていた時に偶然ブートローダが読み出すサイズの16進数値に見えるものが出現し、確認した結果0x200
(512 bytes) をブロックサイズとしたブロック数が格納されていることを特定した。なお、kernelだけではなくrootfsのブロック数も格納されていた。SoCのCPUが2C2Tであること、1GHzを超えるクロックであることなどからパワーがあり、サポート作業中の計測では LAN→WANの単純NATにおいて900Mbps超を記録し、負荷時のCPU使用率は 50%前後であった。
色々
日本国内でのOpenWrt目的としては貴重な有線機であること、上記の通り厄介な点はいくつかあったものの技術的興味は大きかったことなどから、ヤフオクで落札し届いた翌日からひたすら弄り回してサポート作業を進め、作業開始から4日ほどで大まかにOpenWrtで動作するところまでこぎつけることができた。
上述の通りSoCにパワーがあり、RAMが多く、イーサネットポート数が多く、USB 3.0ポートを搭載する上に中古ではライセンス切れの個体などが安価に数が出ている為、選択肢として良いように思える。個人的にはコンソールポートを搭載しているのもGood。