今回は、10GbEのルーターを自作するにあたり、GoWin社のR86SとOSSのOpenWrtを使用することにした。セットアップにあたり、OpenWrtをNVMe SSDに書き込む作業を備忘録として残す。

経緯
以前からNASなどの大容量データ転送のために家庭内に10GbEのネットワークを導入しているが、WAN(インターネット)はフレッツ光ネクストの1Gbps止まりだった。
足枷になっていたのは自宅サーバーのポート開放問題だ。フレッツ光クロスの10GbpsではPPPoEが使用できない(正しくは使用できようになったがプロバイダの選択肢がない)ために、安価にはサーバー公開できないと思っていたから。IPoE経由でIPv4を使用する場合(v6プラスなど、いわゆるIPv4 over IPv6)は複数のユーザーで1つのIPアドレスを共有するため、ポートもユーザー間でシェアされ、特定の範囲のポートしか割り当てられない。なので、いわゆるウェルノウンポート(Webサーバーやメールサーバーで使用するポート)が必ずしも自分に割り当てられるとは限らない。
改めて調べてみると、フレッツ光クロスの接続方法であるIPoEの場合についても、固定IP契約をすることでIPv4のすべてのポートを使用できることが分かったので乗り換えてみる決意をした。
ただし、この方法をもってしても課題が1つだけある。固定IPに対応したルーターが民生品ではほぼ存在しないことである。
WAN/LANともに10GbEに対応し、かつ固定IPの設定が制限なく出来ると謳われているルーターで最安値コースでも10万越え。YAMAHAのRTX1300くらい。それ以外はもっと高級な業務用ルーターになる。値段に目を瞑ったとしても、筐体の大きさだけは許しがたい。
本末転倒ではあるが1Gbpsでもよければ今現在IPoEの接続に使用しているRTX830でも設定は可能である。
時間をかけて中古で探すなどの努力をしても良かったのだが、いかんせんYAMAHAのコマンドには癖があり、その他の機能を正直使いこなせる自信はない。
ということで。。。
自分で10GbE対応のルーターを作ることにした。
今回はGoWin社が販売している、SFP+x2/2.5Gx3が搭載されたルーター向けのミニPCとOSSであるOpenWrtを使用することにした。
OpenWrt : Linux operating system targeting embedded devices
GoWin GW-R86Sについて
このシリーズは様々なモデルがある。まずは全体の仕様から。
CPU | IntelN5100/N5105/N6005(Jasper Lake) |
RAM | 4GB/8GB/16GB/32GB |
eMMC | 128GB |
I/O | microSD(TF)、HDMI |
Power | DC/USB-C |
M.2 | 2280 x 1 / 2280 x 1 + 2230 x 1 |
Network | 2.5GbE x 3/2.5GbE x 3 + 10GbE(SFP+) x 2 |
その他モデル別に分けると、
GW-R86S-Xx (Xがアルファベット、xが数字)
モデル | B / P / T | G / U |
10GbE | 非搭載(薄型) | 搭載(厚型) |
model B
CPU | N5100 |
特徴 | ファンレス、B1のみRAM4GB/M.2無し |
model P
CPU | P1,P2:N5105 / P3,P4:N6005 Wifiあり |
特徴 | P1:RAM8GB / P2,P3:RAM16GB / P4:RAM32GB |
model T
Pシリーズの電源がDCジャックからType-Cに変更、USB 3.0×2 → USB 3.0×2 + USB 2.0×1
model G
CPU | G1,G2:N5105 / G3,G4:N6005 Wifiあり |
特徴 | G1:RAM8GB / G2,G3:RAM16GB / G4:RAM32GB |
model U
Gシリーズの電源がDCジャックからType-Cに変更、USB 3.0×2 → USB 3.0×2 + USB 2.0×1
こんな感じ。今回は、技適の問題もあるのでG1,G2/U1,U2になるが、Type-C好きということもありGW-R86S-U2を選択。正直トリガーケーブルの利用を前提にG2を選んでおくという手もあったのだが、モデル置き換えなのかGシリーズは買えるところがなかったので断念。
CPU性能に対して割高感は否めないものの、現状10GbEx2 + 2.5GbEx3を搭載したルーター向けミニPCとしては最良の選択肢か。
いきなり面倒なことが。
内蔵のeMMCにOpenWrtが書き込まれているので電源を入れれば即使える状態ではあるのだが、そもそも言語が中国語しか選べない、eMMCに直接書き込む方法が不明(USBブートしてイメージ書き込めば行ける気もするのでそのうちトライしてみるがNVMeのほうが早そうな気がする)という状態なのでNVMEのSSDにOpenWrtを別途書き込んで使用することとした。
OpenWrtのインストール
OpenWrt :Downloads Stable Release builds
各バージョンからtargetsと進み、x86->64と進みダウンロードする。悩むとすればUEFI版かBIOS版くらいだと思う。今回はUEFI版を選択。
今回はインストーラーなどを使用せず(圧縮展開もしない)、このイメージファイルを直接書き込むためチェックサムがあっているかどうかを確認しておくこと。
方法1. NVMeへのイメージファイルの書き込み(Windows Rufus)
NVMe M.2 SSDへのイメージファイルの書き込みにはWindowsPCとRufusを使用する。
今回はAmazonでNVMe M.2 SSDを買って使うことにした。128GBと容量少なめだがルーターにはどう考えてもオーバースペック。1500円ほどと激安なので悩む必要すらない。
NVMe M.2SSDに書き込むための外付けSSDケースもあると作業が捗る。
イメージの書き込みにはRufusというフリーソフトを使用。
Rufus – 起動可能なUSBドライブを簡単に作成できます
Rufusを起動し、書き込むドライブにR86Sに取り付けるNVMe M.2SSDを選択、ブートイメージに先ほどOpenWrtのサイトからダウンロードしたimg.gzを選ぶ。その他の設定はデフォルトで問題ないが、デバイス欄にメディアが出てこない場合は“詳細なドライブプロパティ”から“USB接続のHDDを一覧表示”にチェックを入れる。

あとはスタートを押して待つだけ。
方法2. 内蔵eMMCへのOpenWrtの書きこみ(Ubuntu)
書き込みは終わったが。。。
無事書き込みは終わったのだが、OpenWrtのイメージは組み込み向けのOSということもあり容量が100MB強しかないので128GBの容量の99%以上が無駄になる。
ストレージの拡張(を試したが別途パッケージで解決することにした)
ネット上ではOpenWrtのパーティションを拡張することで容量を増やせたという記事もいくつかみられるが、少なくとも私が試した方法では拡張することが出来なかった。というか直接増やすよりもマウントしたほうがよさそうだなとも思った。方法については後述。
eMMCの罠(番外編)
ここまでくると、128GBのM.2 SSDを取り付けるまでもなくR86Sに内蔵されている128GBのeMMCを有効利用したい気持ちにもなる。
じゃあどうやって内蔵のeMMCにOSを書き込むのか。それが問題である。他社製のSBCだとeMMCを取り外せるアダプタがあったり、USB接続すると外部ストレージ化できるものがあったりするのだが、このR86Sの場合は本体を起動した状態でごにょごにょするしかなさそう。
ネットの海を漁っていたら中国に一人、方法に言及している人を見つけた。
狂人山庄 Madman Hills : R86s刷入自制OpenWrt固件
やはりマシンを起動してddするパターンらしい。面倒だがNVMeがバックアップ的に使えると思えば確かに便利なので一応試してみることにした。
NVMe SSDからeMMCへのコピー – パーティション情報のコピー
まずはR86SでUbuntuをUSB起動する。前記Rufusを使用して同じようにUSBメモリに書き込む。
NVMeを挿入し、BIOSで起動順序をUSBに変更、Ubuntuが起動したらターミナルでの作業。まずはNVMe/eMMCのドライブ名を確認。
続いて、コピー元となるNVMeのパーティション情報を確認する。
ubuntu@ubuntu:~$ sudo gdisk -l /dev/nvme0n1
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Disk /dev/nvme0n1: 250069680 sectors, 119.2 GiB
Model: PCIe SSD
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 74B8FD5E-69A8-DAB4-F7EC-23A35BEF8A00
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 250069646
Partitions will be aligned on 2-sector boundaries
Total free space is 249823375 sectors (119.1 GiB)
Number Start (sector) End (sector) Size Code Name
1 512 33279 16.0 MiB 8300
2 33280 246271 104.0 MiB 8300
3 34 511 239.0 KiB EF02
最後のセクタ情報を使用するのでテキストエディタなどにコピーしておく。
続いてこれらの情報をコピーする先のeMMCを開く。
ubuntu@ubuntu:~$ sudo gdisk /dev/mmcblk0
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help):
パーティション情報をリセット。
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y
Command (? for help):
続いてセクタをコピーしていく。今回のセクターのアライメントは512で変更しなければならないのだが、gdiskは標準で2048単位になっているためエキスパートモードに入り、セクタのアライメントを変更し、エキスパートモードから戻る。
Command (? for help): x
Expert command (? for help): l
Enter the sector alignment value (1-65536, default = 2048): 512
Expert command (? for help): m
あとは’n’コマンドでパーティションを1から3まで開始セクタと終了セクタ、Current type(先ほどのメモの中のCode)の順に入力していく。最後に’p’コマンドで正しく入力できているか確認し’w’でパーティション情報を書き込む。
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-244318174, default = 2048) or {+-}size{KMGTP}: 512
Information: Moved requested sector from 512 to 2048 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (2048-244318174, default = 244318174) or {+-}size{KMGTP}: 33279
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8300
Changed type of partition to 'Linux filesystem'
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-244318174, default = 34816) or {+-}size{KMGTP}: 33280
Information: Moved requested sector from 33280 to 34816 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (34816-244318174, default = 244318174) or {+-}size{KMGTP}: 246271
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8300
Changed type of partition to 'Linux filesystem'
Command (? for help): n
Partition number (3-128, default 3):
First sector (34-244318174, default = 247808) or {+-}size{KMGTP}: 34
Last sector (34-2047, default = 2047) or {+-}size{KMGTP}: 511
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): EF02
Changed type of partition to 'BIOS boot partition'
Command (? for help): p
Disk /dev/mmcblk0: 244318208 sectors, 116.5 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 32C612DE-FF50-470A-B365-3CDEF7848B0A
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 244318174
Partitions will be aligned on 2048-sector boundaries
Total free space is 244074975 sectors (116.4 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 33279 15.3 MiB 8300 Linux filesystem
2 34816 246271 103.3 MiB 8300 Linux filesystem
3 34 511 239.0 KiB EF02 BIOS boot partition
Command (? for help): w
ここまででパーティションの枠だけはコピーできたので、実際に中のデータをddでパーティション毎にコピーしていく。
ubuntu@ubuntu:~$ sudo dd if=/dev/nvme0n1p1 of=/dev/mmcblk0p1
32768+0 レコード入力
32768+0 レコード出力
16777216 bytes (17 MB, 16 MiB) copied, 0.71076 s, 23.6 MB/s
ubuntu@ubuntu:~$ sudo dd if=/dev/nvme0n1p2 of=/dev/mmcblk0p2
212992+0 レコード入力
212992+0 レコード出力
109051904 bytes (109 MB, 104 MiB) copied, 4.71701 s, 23.1 MB/s
ubuntu@ubuntu:~$ sudo dd if=/dev/nvme0n1p3 of=/dev/mmcblk0p3
478+0 レコード入力
478+0 レコード出力
244736 bytes (245 kB, 239 KiB) copied, 0.0372842 s, 6.6 MB/s
最後に、ストレージの中のテーブル情報をコピーする。流れとしてはNVMeのテーブルを一度手元にバックアップし、それをeMMCにリカバリーする感じ。
ubuntu@ubuntu:~$ sudo sgdisk --backup=table.dat /dev/nvme0n1
The operation has completed successfully.
ubuntu@ubuntu:~$ sudo sgdisk --load-backup=table.dat /dev/mmcblk0
Warning! Current disk size doesn't match that of the backup!
Adjusting sizes to match, but subsequent problems are possible!
The operation has completed successfully.
以上の作業で、NVMeの中身がまるっとeMMCにコピーされているはず。BIOSで起動順序を変えればeMMCから起動する。
まとめ
今回はGoWin R86S-U2とOpenWrtを使ってルーターの起動ができるようになるところまでを確認した。
一般的なUSBブートからインストーラーを起動するOSとは異なり、直接メディアにイメージを書き込む必要があることからなにか難しそうな印象を受けるが、やっていることはRaspberryPiなどと同等。ただ、OpenWrt自体が既製品へのインストールを前提としているためウィザード的な親切さはなく、パーティション操作などはユーザーに委ねられているので少々上級者向きな感じだ。
コメント