私の自宅のファイアーウォールは自作PC上に構築したProxmox VEの中でVMにOPNsenseを入れて動かしてる。GPUパススルーしてゲームを遊ぶ為のWinodwsとかも動かしており、偶に挙動が不安定になってホストOS側が再起動したりする。当然その場合は自宅からインターネットへ抜ける経路が閉ざされてしまうので、最近は正直別のノードを確保してそちらにOPNsenseのVMを引っ越ししたいと考えるようになった。
じつは丁度、この前入手したAT-x510-28GPXを注文するのと同時に、Qotomという中国の小型PCメーカ製のQ20311G9-S10という製品をRAMとストレージ無しでAliExpressで注文していた。この製品、最上位グレードだとCPUにatom c3758が採用されており8コア8スレッドとなる。別途SSD(DRAM入512GB*2)とRAM(32GB*2)は自分で確保した。どうせUTMのVM動かすだけならベアメタルもありかなと思ってたが、流石に自宅用のUTMでこのスペックは過剰気味でベアメタルでOPNsenseだけ動かすのは流石に勿体ないとなり結局ProxmoxVEをいれた。
インターフェース周りがネットワークエンジニアやサーバエンジニアがみると興奮しそうな仕様となっており、背面に2.5Gのマルチギガビットイーサネットが5つと、10GのSFP+が4つ、コンソールポート(RJ45)が搭載されているのが特徴。USB Type-Aは2ポートと少なめ。まぁこの手の製品はどうせファイアーウォールやサーバとして使われる運命なのでキッティング作業用にキーボードと外付けストレージが付けれれば十分である
表には映像出力用のVGAと、なぜかSIMカードをさすスロット(試してないので使えるのか不明)、USB Type-Cポート、あとMini-SASの一種であるSFF8087用のポートがある変態仕様である。SFF8087なんて一般の家庭向けの製品で使えそうなものはQNAPが出してるDAS製品のTL-D400Sぐらいしか思い浮かばない。
ProxmoxVEを導入し、行った設定など。
PVEは導入当時最新である8.1.4、カーネルは6.5.13-1-pveで構築(インストール後のアップデート含む)。
とりあえず以下のような設定作業を行った。
- SFP+を使えるようにする
- コンソールポート経由でProxmxoVEを操作可能にする
- コンソールポート経由で本製品のUEFI BIOSを操作できるようにする
SFP+を使えるようにする
正直そのまま使えるものかと思ってたが、どうもカーネルのバグを踏んだっぽく?SFPモジュールを接続し、対向のスイッチとMO3-LC-LCな光ケーブルで接続しても全くリンクアップしなかった。因みにOSが起動する前はリンクアップする。
とりあえlspciで出てきたintelのX553というキーワードとproxmoxについて色々ぐぐってたら解決方法を見つけたので実施。どうもLinuxカーネル6.*系の ixgbeというドライバモジュールが壊れてるのが原因の模様。
00:00.0 Host bridge: Intel Corporation Atom Processor C3000 Series System Agent (rev 11)
00:04.0 Host bridge: Intel Corporation Atom Processor C3000 Series Error Registers (rev 11)
00:05.0 Generic system peripheral [0807]: Intel Corporation Atom Processor C3000 Series Root Complex Event Collector (rev 11)
00:06.0 PCI bridge: Intel Corporation Atom Processor C3000 Series Integrated QAT Root Port (rev 11)
00:09.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #0 (rev 11)
00:0a.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #1 (rev 11)
00:0b.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #2 (rev 11)
00:0c.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #3 (rev 11)
00:0e.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #4 (rev 11)
00:0f.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #5 (rev 11)
00:10.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #6 (rev 11)
00:11.0 PCI bridge: Intel Corporation Atom Processor C3000 Series PCI Express Root Port #7 (rev 11)
00:12.0 System peripheral: Intel Corporation Atom Processor C3000 Series SMBus Contoller - Host (rev 11)
00:13.0 SATA controller: Intel Corporation Atom Processor C3000 Series SATA Controller 0 (rev 11)
00:14.0 SATA controller: Intel Corporation Atom Processor C3000 Series SATA Controller 1 (rev 11)
00:15.0 USB controller: Intel Corporation Atom Processor C3000 Series USB 3.0 xHCI Controller (rev 11)
00:16.0 PCI bridge: Intel Corporation Atom Processor C3000 Series Integrated LAN Root Port #0 (rev 11)
00:17.0 PCI bridge: Intel Corporation Atom Processor C3000 Series Integrated LAN Root Port #1 (rev 11)
00:18.0 Communication controller: Intel Corporation Atom Processor C3000 Series ME HECI 1 (rev 11)
00:1a.0 Serial controller: Intel Corporation Atom Processor C3000 Series HSUART Controller (rev 11)
00:1f.0 ISA bridge: Intel Corporation Atom Processor C3000 Series LPC or eSPI (rev 11)
00:1f.2 Memory controller: Intel Corporation Atom Processor C3000 Series Power Management Controller (rev 11)
00:1f.4 SMBus: Intel Corporation Atom Processor C3000 Series SMBus controller (rev 11)
00:1f.5 Serial bus controller: Intel Corporation Atom Processor C3000 Series SPI Controller (rev 11)
01:00.0 Co-processor: Intel Corporation Atom Processor C3000 Series QuickAssist Technology (rev 11)
02:00.0 Non-Volatile memory controller: Silicon Motion, Inc. SM2262/SM2262EN SSD Controller (rev 03)
03:00.0 Non-Volatile memory controller: Silicon Motion, Inc. SM2262/SM2262EN SSD Controller (rev 03)
04:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
05:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
06:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
07:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
08:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
09:00.0 PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 03)
0a:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 30)
0b:00.0 Ethernet controller: Intel Corporation Ethernet Connection X553 10 GbE SFP+ (rev 11)
0b:00.1 Ethernet controller: Intel Corporation Ethernet Connection X553 10 GbE SFP+ (rev 11)
0c:00.0 Ethernet controller: Intel Corporation Ethernet Connection X553 10 GbE SFP+ (rev 11)
0c:00.1 Ethernet controller: Intel Corporation Ethernet Connection X553 10 GbE SFP+ (rev 11)
Code language: plaintext (plaintext)
このままSFPポートに接続しててもネットに繋げないので/etc/network/interfacesを編集して一旦SFP+ポートにブリッジさせてるProxmoxVEのIPを設定してあるvmbr0を適当なRJ45のマルチギガビットイーサネットへブリッジさせてPVEがインターネットへ抜けれるようにして作業続行。
ドライバモジュールのビルドに必要らしいパッケージをインストール。
apt-get install proxmox-default-headers build-essential gcc make
Code language: Bash (bash)
紹介されてた手順では/tmpで作業してたけど自分はとりあえず拾ってきたソースコードは/usr/local/src/において作業してるのが慣例になってるのでそちらへ移動してソースコードをDLする。DLしたファイルをtarで解凍し、出てきたixgbe-5.19.9内のsrcへ移動
cd /usr/local/src/
wget https://sourceforge.net/projects/e1000/files/ixgbe%20stable/5.19.9/ixgbe-5.19.9.tar.gz
tar xvfvz ixgbe-5.19.9.tar.gz
cd ixgbe-5.19.9/src
Code language: Bash (bash)
srcディレクトリ内でビルドする
make
ixgbe.koというファイルがあるので中身を確認。depends:というセクションの値を見ればいいっぽい
modinfo ./ixgbe.ko
既存のixgbeモジュールをアンロードする。
rmmod ixgbe
カーネルモジュールを組み込む。
dcaという引数は環境によっては異なることもあるっぽい。さっきixgbe.koの中身を確認したときのdepends:の値を引数にすればいいらしい。自分もdcaだった。
modprobe dca
カーネルモジュールをロードする。
insmod ./ixgbe.ko
ビルドしたものをインストールする。
make install
起動時にixgbe ドライバーを自動でロードするようにする。
echo "ixgbe" >> /etc/modules
Code language: JavaScript (javascript)
その他試したこと
IntelのNICにはベンダーロックされてる場合があるらしく、Intel製以外のSFP+モジュールだと動かない場合があるらしい。自分が使ってるSFP+モジュールはciscoのSFP-10G-SRという製品だったので最初はこれかもと疑った。
Resolve issue with Unsupported SFP+ module – Cesbo Docs
上記記事が示す手順でベンダーロックの回避を試みた。
カーネルコマンドラインにixgbe.allow_unsupported_sfp=1
という引数を入れればいいっぽい。自分の場合はインターフェースが4つあるのでixgbe.allow_unsupported_sfp=1,1,1,1
のように記載すればいいっぽい。また自分の環境はsystemd-bootなので/etc/default/grubではなく/etc/kernel/cmdlineに以下のように一行で記述する。既存の記述の後ろにスペースを入れて追記する形となる。
root=ZFS=rpool/ROOT/pve-1 boot=zfs ixgbe.allow_unsupported_sfp=1,1,1,1
記述した内容を反映させて再起動してみる
proxmox-boot-tool refresh
reboot now
結果は特に変わらなかった。そもそもベンダーロックされてるのかが気になり確認してみた。
Intel X520等ixgbe系NICにおけるSFP+ベンダーロック解除 – infla – Confluence (xmms.jp)
上記ページに示されている方法で確認してみたところ特にベンダーロックはされてなかった。
ethtool -e eno4 offset 0x58 length 1
Code language: Bash (bash)
出力。値がffだとベンダーロックが回避できてる状態らいしい。
Offset Values
------ ------
0x0058: ff
Code language: plaintext (plaintext)
コンソールポート経由でProxmxoVEを操作可能にする
普段はsshやWeb GUIで操作するし、いざというときはディスプレイに接続して操作も可能なので必須ではないが、いざというときにコンソールポートへ手元の別PCから接続して操作できればディスプレイとキーボードを別途用意する手間が省けるのでコンソールポート経由で操作できるようにしておく。正直ttyS0が実際のコンソールポートに紐づいてるかとおもってたんだが、どうも違ったようで結構ぬまってしまった。
以下のようにlsコマンドで/sys/class/tty/ttyS*がなんのシンボリックリンクか確認する。
ls -la /sys/class/tty/tty*
Code language: JavaScript (javascript)
以下のようなそれっぽい記述が出てきた。0000:00:1a.0
はさっきlspciで見かけたデバイス番号と一致する。00:1a.0 Serial controller: Intel Corporation Atom Processor C3000 Series HSUART Controller (rev 11)
おそらくこれである。
lrwxrwxrwx 1 root root 0 Mar 10 19:45 /sys/class/tty/ttyS4 -> ../../devices/pci0000:00/0000:00:1a.0/tty/ttyS4
Code language: plaintext (plaintext)
該当するシリアルポートの通信速度を上げる。デフォルトだと9600である。大量の文字列を出力した際に全部の文字列を表示しきるのにかなり時間がかかるので115200へ変更。
# 通信速度の変更
stty -F /dev/ttyS4 115200
# 設定内容を確認したい場合
stty -F /dev/ttyS
Code language: Bash (bash)
実際にシリアルポートでログイン出来るようにする。以下コマンドで当該サービスは自動機動するようになり、なおかつ今すぐsatartする。もし速度変更操作よりも先にこちらを行って、後から速度を変えたくなった場合は一度stopさせ、速度変更、再度startという手順を踏むと上手く行った。
systemctl enable serial-getty@ttyS4.service --now
Code language: Bash (bash)
これでコンソールケーブル繋いだら他のPCからteratermなりscreenなりでシリアル通信して操作可能になってるはずである。
再起動するとttyS4の速度が9600に戻ってしまう問題
再起動すると9600に戻ってしまった。毎回速度を手動で変更するのは結構な手間である。serial-getty@ttyS4.serviceのユニットファイルを編集して、定義されているExecStartの前に実行されるExecStartPreを速度を変更する為のコマンドを記載して対処する。
enableしたときにユニットを定義しているファイルは以下のよなパスにシンボリックリンクが作成される
Created symlink /etc/systemd/system/getty.target.wants/serial-getty@ttyS4.service → /lib/systemd/system/serial-getty@.service
Code language: plaintext (plaintext)
systemdのお作法敵に/lib/systemd/system/
内のユニットファイルを直接編集するのはあまり良くなさそうな気がする。
なので一旦/etc/systemd/system/
へコピーする。両方に同じユニットファイルがある場合、enableしたときに後者から優先してシンボリックリンクを作成するっぽい。
cp /lib/systemd/system/serial-getty@.service /etc/systemd/system
Code language: Bash (bash)
/etc/systemd/system/serial-getty@.service
を編集
vim /etc/systemd/system/serial-getty@.service
Serviceセクション内にExecStartPre=/usr/bin/stty -F /dev/ttyS4 115200
という記述を追加。ExecStartに設定しているコマンドよりも先に実行してくれるらいし。あとExecStartと違って複数記述してもいいっぽいので他にコンソールポートが複数あるなら同じように複数行書けばよさそう。
[Service]
# The '-o' option value tells agetty to replace 'login' arguments with an
# option to preserve environment (-p), followed by '--' for safety, and then
# the entered username.
ExecStartPre=/usr/bin/stty -F /dev/ttyS4 115200
ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,57600,38400,9600 - $TERM
Code language: PHP (php)
上記の手順よりもベストプラクティスだ!!といえる方法知ってる方はXとかで教えてください。
コンソールポート経由で本製品のUEFI BIOSを操作できるようにする
起動時にESCを連打してUEFI BIOSの管理画面を表示させ、Advancedタブに移動。Serial
Port Console Redirectionを選択。
Console RedirectionをEnableへ変更、その後Console Redirection Settingsを選択
Console Redirection Settingsに入ったらTerminal TypeをVT-UTF8に変更。ここは各々が使うターミナルソフトの環境によって変わると思う。自分が使ってるteratermの設定ではVT-UTF8にしたら文字化けしなくなった。
上記設定が完了したら保存して再起動する。
成功するとこんな感じで任意のターミナルソフトから表示できる。