ProxmoxVE(以後PVE)を動かしているコンピューター上でグラボはWindowsなVMに対してPCIeパススルーさせて使っている。
普段ホストOSであるPVEを操作する際はWeb GUIかsshを利用する。しかし万が一自分のネットワーク機器やPVEの設定ミスなどで接続できなかった時のために直接操作する手段は常に用意しておかなければならない。
現状はCPUに内臓されているGPUをPVE側で利用することでホストOS側の操作手段を確保している。しかし、このホストに使わせてる内蔵GPUも別のVMにパススルーさせて使わせたいなと思った。当然PVEを直接操作する手段を別途確保しないといけないと思ったのでシリアルコンソールでできるかなと思ったらあっさり出来たのでPVEにシリアルコンソールを経由してアクセスする為の手順を残しておく。
PCIeで増設も可能なようだけど、文字列のやり取りだけにコンシューマ向けCPUとマザーの貴重なレーンを消費したくない。
ちなみにシリアル通信の仕様やら仕組みやらはあんまり詳しくなく、雰囲気で使ってるので間違っている記述があればtwitterなどでご指摘ください。
用意するもの
PVEを導入しているPCのマザーにはシリアルポートがない。よってUSB Aオス-RS232cメスを用意する。自分はRS232Cのオスも持ってなかったのでそちらも用意。
PVE側でシリアルポートとして使う側としてICUSB2321Fを選定。
シリアル通信で操作する側に接続するUSB Aオス-RS232cオスなケーブル
PVE側の設定
シリアルケーブルでコンピュータ同士を接続してもそのまま操作できるわけではないらしい。
ICUSB2321FをUSBでPVEに接続して認識してたら/dev配下にttyUSB0が出てくる。
ls /dev/ttyUSB*
# 出力結果
/dev/ttyUSB0
Code language: Bash (bash)
systemdでserial-gettyを有効にして起動させる
systemctl enable serial-getty@ttyUSB0.service --now
Code language: Bash (bash)
状態を確認してみる。
systemctl status serial-getty@ttyUSB0.service
# 出力結果
● serial-getty@ttyUSB0.service - Serial Getty on ttyUSB0
Loaded: loaded (/lib/systemd/system/serial-getty@.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-02-03 19:20:26 JST; 1s ago
Docs: man:agetty(8)
man:systemd-getty-generator(8)
https://0pointer.de/blog/projects/serial-console.html
Main PID: 1040847 (agetty)
Tasks: 1 (limit: 114092)
Memory: 268.0K
CGroup: /system.slice/system-serial\x2dgetty.slice/serial-getty@ttyUSB0.service
└─1040847 /sbin/agetty -o "-p -- \\u" --keep-baud 115200,57600,38400,9600 - vt220
Code language: Bash (bash)
一番したに表示されてるのは利用可能なポートレートかな?しらんけど。
PVEを操作する側のコンピュータ
USB Aオス-RS232cオスなケーブル接続して、PVE側のrs232Cのメスにつなぐ。あとは任意のターミナルソフトで接続したら利用可能なはず。私はWinodwsのTeraTermを以下設定にして利用した。
ポート: COM4
スピード: 9600
データ: 8bit
パリティ: none
ストップビット:1bit
フロー制御: none
注意点
PVE側のコンソールケーブルを抜くとserial-getty@ttyUSB0.serviceは停止し、再度接続しなおしても自動で起動しないので注意。PVEが再起動した場合か、再度systemctl startかrestartすれば起動する。
よくわからん現象
今回買ったrs232cケーブルはオス側は速度が1Mbpsまで対応、メス側のICUSB2321Fは115.2kbpsまでいけると記述されていた。
9600だと大量の文字列を出力した際、ターミナルにすべての文字列が表示されるまで結構時間がかかる。なので115200まで上げてみることにした。
stty -F /dev/ttyUSB0 115200
# 設定内容確認は以下
stty -a < /dev/ttyUSB0
speed 115200 baud; #以降の文字列・行に色々とパラメータが表示される。
Code language: Bash (bash)
上記のようにPVE側でsttyコマンドを用いてポートレートを115200まで上げてteraterm側でその速度に設定しても使えなかった。そしてその状態でPVE側のポートレートをsttyコマンドで確認しにいくと、なぜか38400まで落ちていることを確認。teraterm側の速度を38400にすると正常に利用できた。9600よりはだいぶ快適だが115200で利用できない理由がさっぱりわからん。
stty -a < /dev/ttyUSB0
speed 38400 baud;
Code language: JavaScript (javascript)
因みにこの状態でPVEを再起動するとポートレートは9600に戻る…。どうにか常時高いポートレートで利用したいんだけどなぁ…。