
以前手広くOpenWrtでサポート可能なデバイスを調べていた際、Check Point公式Forumかどこかであったり、OpenWrt ForumなどでMarvellの64bit SoCであることを知り、気になっていたものです。
Linux Kernelのバグであったり、OpenWrt側の実装不足であったりを修正や改善していて時間が掛かったものの、マージされました。
まとめていきます。
仕様
RAMは同じくMarvell機でサポート済みのFortiGateと同じ2GiBであるものの、SoCとしてaarch64かつ4コアである88F7040または88F8040を搭載。
共通
- RAM: DDR4 2GiB
- UART: 115200bps("CONSOLE", USB 1.1 Type-C, CP2102N)
V-80
- SoC: Marvell Armada 7040 (88F7040)
- WAN/LAN: 1000Mbps x1/1000Mbps x5
- Flash: eMMC 4GiB
V-81
- SoC: Marvell Armada 8040 (88F8040)
- WAN/LAN: 1000Mbps x2 (RJ-45 x1, RJ-45/SFP x1)/1000Mbps x8
- Flash: eMMC 16GiB
その他詳細については、雑記を参照。
OpenWrt化
諸々の都合によりfactoryは無く、メーカーファームウェアでのコマンド操作など少々複雑な手順が必要です。
共通
- V-80またはV-81を通常通り起動
- メーカーのCLIにログインし(デフォルト:
admin/admin)、expertコマンドによってLinuxのCLIに遷移する 以下のコマンドを実行し、U-Boot環境変数にOpenWrtのブートの為に必要なものを追加する
V-80:
fw_setenv bootcmd_ow_usb 'usb start; load usb 0:1 ${loadaddr} boot.scr && source ${loadaddr}' fw_setenv bootcmd_ow_emmc 'run set_mmc_internal; mmc read ${loadaddr} ${prim_header_mmc_blk} 4 && source ${loadaddr}' fw_setenv bootcmd 'run bootcmd_ow_usb; run bootcmd_ow_emmc; run bootcmd_part${activePartition};'V-81:
fw_setenv bootcmd_ow_usb 'usb start; load usb 0:1 ${loadaddr} boot.scr && source ${loadaddr}' fw_setenv bootcmd_ow_sd 'load mmc 0:1 ${loadaddr} boot.scr && source ${loadaddr}' fw_setenv bootcmd_ow_emmc 'run set_mmc_internal; mmc read ${loadaddr} ${prim_header_mmc_blk} 4 && source ${loadaddr}' fw_setenv bootcmd 'run bootcmd_ow_usb; run bootcmd_ow_sd; run bootcmd_ow_emmc; run bootcmd_part${activePartition};'
注: 各コマンドの引数に付いている
'(シングルクォーテーション)は必ず付加する電源ボタン等により電源を切る
USB/SDブート
SDからのブートはV-81のみ
squashfs-sdcard.img.gz(またはext4-sdcard.img.gz)をgzip展開の上USBストレージまたはSDカードに書き込みイメージを書き込んだストレージをV-80またはV-81に接続し、起動する
- OpenWrtで起動してくれば完了
eMMCブート
initramfsイメージ, dtb, bootscriptを適当なUSBストレージのルート階層にリネームの上でコピーする
initramfs.bin -------> Image dtb -----------------> armada-8040-v-81.dtb bootscript (.scr) ---> boot.scr- 3種を投げ込んだUSBストレージを接続し、V-80またはV-81を起動する
- OpenWrtで起動してきたら、
squashfs-sysupgrade.gz(またはext4-sysupgrade.gz)をデバイス上にアップロード(またはダウンロード) - USBストレージを切断し、アップロードしたsysupgrade用イメージを用いてsysupgradeを実行する
- 完了後再起動され、OpenWrtで起動してくれば完了
備考
V-81に於いては、共通手順の最後で電源を切るまでに、イメージを書き込んだMicroSDは挿入しない。
電源断前に挿入した場合、メーカーファームウェアにおいてログファイル等の保存に使用する為、1番目のパーティション内の全データが削除される。
V-81における "DMZ" ポートのRJ-45及びSFPポートは、接続状況による切り替えは無いようである。切り替えはethtoolコマンドによって行う。
例:
ethtool -s eth1 port fibreなお、起動時にSFPポートに接続されている場合は、最初からSFPポートに切り替えられているようである。
ただ、RJ-45/SFPポートそれぞれに存在するLEDは内部GPIOによって切り替えられる仕様であり、自動的には切り替わらない。そのまま既にアクティブな方で現示させるか、あるいは接続状況により手動で切り替える。
V-81のSFPポートにおける最大の電力供給値は
2,000mW (Power Level III)とした。Check PointからこのポートやV-81オプション品として紹介があるDSL-SFPの詳細な仕様は出ていないものの、一般的なDSLモジュールでは大体が3.3V/700mAを仕様としており、単純計算で少なくとも 2,000mA は出せるはず、と判断した。V-80に於いては、内部にMicroSDカードスロットとMiniPCIeスロットを搭載するものとしないものの2種類のハードウェアが存在する。
現時点で明確にこの差異を示すものは見付かっていないものの、底面ラベルに記載されている
Versionがそれではないかと推測される。- 1.0.1: 無
- 1.0.3: 有?
この他、1.0にも実装されている可能性がある。
V-80とV-81のそれぞれにおいて、単一のサポートでeMMCやUSB, SDカード全てのブートに対応させる為、sysupgradeにやや制約が生じている。
USB/SDカード用イメージを書き込んだストレージからブートした場合、eMMCに対するsysupgradeは行えず、現在実行中のブートに使用されたストレージ (USB/SD) へのsysupgradeのみをサポートする。逆に、USBストレージ内のinitramfsイメージ又はeMMCからブートした場合は、eMMCに対するsysupgradeのみをサポートする。
作業時の色々
内部eMMCのパーティション分割には、eMMC内に持つGPTのテーブルではなく、ブートローダから渡された
blkdevpartsパラメータによって渡されたものを使用している。これが正しくLinux Kernelに渡らない場合、GPT側に抱えるパーティション1つしか認識されない問題が発生する。先行したV-80の作業に着手した当初のLinux Kernel 6.1では問題無かったが、その後の6.6において、
blkdevpartsを解釈するドライバが壊れており、前述の問題が発生した。MastodonでLinux Kernelに詳しい方から色々と教導を受けつつ修正を行って投げ込み、マージされたことでなんとか解決した。
備考で触れたとおり、単一のサポート内でeMMC, USB, SDカード全てのブートをサポートする為、ブートデバイスの切り替えの為にスクリプトが必要となり、eMMC用イメージにおけるkernelデータの構造がやや変則的となっている。搭載されているU-BootでFlattened Image Treeがサポートされていれば、もういくらかマシな状態にできた。
シリアルコンソールはリア側にあるUSB Type-Cポートを介して接続する。UARTはV-80/V-81内部でCP2102NによってUSBに変換されている。
色々
eMMCのパーティション絡みが壊れていたり、OpenWrt側の実装の不足絡みでだいぶ手こずったものの、ようやくマージ達成。
V-80で言えば、既にサポートされているFortiGate/FortiWiFiと筐体サイズが大体同じながら、SoCがかなり強力であり、より負荷の掛かる環境にお勧めできそうである。しかもヤフオク等ではOEM品も含め、Cortex-A72 SoC搭載機としてはかなり安くなっている。
この機種でDebianをブートした猛者もいる模様。
そしてV-81はSFPポートを搭載し、LAN側のポート数が非常に多い点が魅力であるものの、どうも国内における流通数は非常に少ないらしく、中古にもほとんど流れて来ないようである。レア中のレア。
両機種とも、v24.10シリーズには入らない為、その次のメジャーリリースからとなります。