自然の赴くままに・そのときの 気分次第で・なんとなく

自分がその時その時に興味を持ったことを、なんとなく気の向くままに書いているブログです。

ESXi Arm Edition をシリアルコンソール化

今回は ESXi Arm Edition をインストールした Raspberry Pi 4 をシリアルコンソール化し、ヘッドレスシステムにしてみました。

f:id:imaisato:20210104033150p:plain

ヘッドレスシステムの ESXi

ESXi のヘッドレスシステム

ESXi では昔からマウスやキーボード、ディスプレイモニター(VMware では MKS:Mouse, keyboard, Screenの略)を使わない、ヘッドレスシステムをサポートしています。このヘッドレスシステムですが、通常は特別な設定を必要とせず、条件が合致すれば自動的にヘッドレスシステムとして検出され、シリアルポートからコンソール操作ができるようになります。

ESXi のヘッドレスシステム検出時の動作

動的な通信速度の設定

ESXi では、MKS のないホストが検出されると自動的にシリアル ポートに対して COM1、115200 ボーに設定して、シリアル ポートに対してDCUI(ダイレクト コンソール ユーザー インターフェイス )をリダイレクトします。(最終的にシリアルポートは、Port com1, Speed 115200 Baud, Data 8bit, Parity  none, Stop-bit 1, Flow control none で通信をします。)この通信設定の情報の詳細は、SPCR (シリアル ポート コンソール リダイレクト)テーブルがある場合は、そこから値が読み込まれます。このデフォルト設定が無い場合、手動でパラメータを設定し、ヘッドレスとして指定することもできます。

 ※ESXi では速度を Baud の値が出ています。bps ではないので注意。Baud は変調の速度で、bps はデータ信号の伝送速度の単位で、実際の値は同じ場合が多いのですが、電話回線での通信のように、位相変調を使って伝送を行ったりする場合、Baud の伝送速度がbpsより高くなることがあります。

動的なモードの設定

 ESXi が動的にヘッドレスモードを検出すると、シリアルポート経由で通信を始めます。このモードをシリアルポートモードと呼びます。シリアルポートモードでは、入力されてくる文字列のシーケンスに基づき、DCUI(ダイレクト コンソール ユーザー インターフェイス)、シェル、GDBまたはログの各モードで動作します。4つのモードは以下のようになっています。

  • ログ モード:デバッグ ビルドのデフォルト モードで、vmkernel.log をシリアル ポートに送信
  • GDB モード:デバッグ専用の場合に使用
  • シェル モード:SSH のようなシェル ポート アクセス
  • DCUI モード:ダイレクト コンソール ユーザー インターフェイス

シリアルポートはデフォルトで2つのポートをサポートしていて、それぞれ1つ目のcom1にはGDBとログが、com2にはDCUI(ダイレクト コンソール ユーザー インターフェイス)とシェルが出力されます。

それぞれのモードはデフォルトの設定の場合、キーボードのキーシーケンスで切り替えができます。

  • ログ モード: Ctrl+G, Ctrl+B, 1
  • シェル モード: Ctrl+G, Ctrl+B, 2
  • DCUI モード: Ctrl+G, Ctrl+B, 3
  • GDB モード: Ctrl+G, Ctrl+B, ?

操作は最初に「Ctrl+G」を押し、次に「Ctrl+B」、そして最後にモード切替の 1, 2, 3, ? をキー入力します。

ログモード Syslog に書き出していれば使わない、そしてGDBモードにしてしまうと、その後はシリアルモードに対して一切の操作ができなくなる(CLIに入ってモードを強制変更しない限り、GDBモードから抜けられない。)ので、通常はDCUIモードとシェルだけで使うと思います。

なお、間違えてGDBモードにしてしまったりしたら、CLI から以下のコマンドで復旧します。

  • ログ モード: esxcfg-advcfg -s com1 /Misc/LogPort
  • シェル モード: esxcfg-advcfg -s com1 /Misc/ShellPort
  • DCUI モード: esxcfg-advcfg -s com1 /Misc/ConsolePort
  • GDB モード: esxcfg-advcfg -s com1 /Misc/GDBPort

太字の部分を適切な値、com1 / com2 / none を指定して切り替えます。先に現在のモードを無効にして、次に新しいモードを設定します。

esxcfg-advcfg –s none /Misc/LogPort

esxcfg-advcfg –s com1 /Misc/ConsolePort

このような感じです。

ESXi 側でヘッドレスシステムを設定する

そうはいっても Raspberry Pi 4 で ESXi Arm Edition を使う場合、その小さなサイズを活用して MKS を接続しないのが普通だと思います。しかし、うまく自動的に切り替わらなくて(切り替わらなかったことは無いですが・・・・)操作できなくならないように、ESXi 側も設定変更しておきます。

ESXi に vSphere Host Client でログインし、管理=>システムに移動します。

f:id:imaisato:20210104033318p:plain

管理=>システム

検索窓で VMkernel.Boot.tty1Port を指定して、キーの内容を表示します。値が default なので、キーを選択しオプションの編集をクリック、下に表示されている値から該当するものを入力します。Raspberry Pi 4は UART が 0~5 まであり、シリアルポートも設定すれば複数使えるのですが、Raspberry Pi 4 デフォルトの設定では 1つだけで com1 をのみ、そして ESXi 側はログやGDBが通常使用している tty1 が、デフォルトで com1 を使っています。これを変更して VMkernel.Boot.tty1Port を com2 に変更します。(com1 を使わせないということなので、com2 以外でもよいです。)

f:id:imaisato:20210104033651p:plain

VMkernel.Boot.tty1Port(変更前)

次に、DCUI が使用する tty2 に対しては、逆にデフォルトが com2 なので、com1 に変更します。

f:id:imaisato:20210104034212p:plain

VMkernel.Boot.tty2Port(変更前)

同じように VMkernel.Boot.gdbPort を none に

f:id:imaisato:20210104034323p:plain

VMkernel.Boot.gdbPort(変更前)

VMkernel.Boot.logPort も none に変更します。

 

f:id:imaisato:20210104034421p:plain

VMkernel.Boot.logPort(変更前)

最終的に、以下の4つの値が変更されていれば、準備は完了です。初期値はデフォルト設定の際に使われる値で、それを変更するわけです。

キー デフォルト設定 初期値 設定値
VMkernel.Boot.gdbPort default com1 none
VMkernel.Boot.logPort default com1 none
VMkernel.Boot.tty2Port default com2 com1
VMkernel.Boot.tty2Port default com2 com1

これだけで、ヘッドレスシステム化(シリアルコンソール化)は出来上がりです。

私の場合、念のために boot 時にこの設定が反映されるよう、boot.cfgにも以下のパラメータを追加しています。

ファイルの場所:/bootbank/BOOT.CFG

修正内容: kernelopt にオプション gdbPort=none logPort=none tty2Port=com1 を追記
修正前

kernelopt=FeatureState.bnxtroce_unstable=enabled autoPartition=FALSE FeatureState.nmlx5_rdma_unstable=enabled FeatureState.bnxtnet_unstable=enabled FeatureState.ena_unstable=enabled FeatureState.nmlx5_core_unstable=enabled

修正後

kernelopt=FeatureState.bnxtroce_unstable=enabled autoPartition=FALSE FeatureState.nmlx5_rdma_unstable=enabled FeatureState.bnxtnet_unstable=enabled FeatureState.ena_unstable=enabled FeatureState.nmlx5_core_unstable=enabled gdbPort=none logPort=none tty2Port=com1

これで起動時にGDBとログを使わずに、DCUI を com1 に出せるになりました。

ヘッドレスシステム ESXi Arm Edition の画面キャプチャ

いつもの DCUI

f:id:imaisato:20210104040549p:plain

DCUI ログイン画面

System Customization 画面

f:id:imaisato:20210104040723p:plain

System Customization 画面

画面表示はみんな一緒

f:id:imaisato:20210104041326p:plain

他の操作画面

コマンドラインシェルモード

f:id:imaisato:20210104041538p:plain

シェルモード

ログイン後の画面

f:id:imaisato:20210104041717p:plain

最後の行は表示切れているけれど、すべての表示はされている

Raspberry Pi 4 の設定

Raspberry Pi 4 側の設定は、raspi-config コマンドを使ってシリアルポートを有効にするだけです。Raspberry Pi OS で Raspberry Pi 4 を起動し、コマンドプロンプトから

sudo raspi-config

コマンドを実行し、5 Interfacing Options=> P6 Serial でシリアルポートを有効にするだけです。これで再起動すれば Raspberry Pi 4 はシリアルコンソールが使えるようになります。

Raspberry Pi 4 からシリアルポートを取り出す

Raspberry Pi 4 では複数の 3.3V シリアルポートを GPIO ピンから取り出すことができます。そして、それぞれ別々の設定で動作させることができます。(UART0~UART5)

 しかし、シリアルポートを有効にして使えるのは一つだけ、UART1 の mini UART だけです。他はごにょごにょしないと使えません。(UART0 は Bluetooth につながっています。)

UART1 は GPIO の以下のピンと接続されています。

  • TXD GPIO 14 => 8番ピン
  • RXD GPIO 15 => 10番ピン

詳細のピン配置は以下を参照してください。

www.raspberrypi.org

つまり、シリアルポートとして取り出すには、この2つのピンと Grand を取り出せば OK です。

シリアルポートを取り出すアダプタは、以下のものを使いました。他にも同等の Raspberry Pi 4 で使えるものが出ているので、お気に入りのものを使うとよいと思います。

Amazon.co.jp: GAOHOURaspberry Pi ラズベリーパイ用の USB-TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル: 家電・カメラこれはまさにダメなものでした。先日の Windows UpdateをかけてWindows 10を新しいバージョンにしたところ、早速使えなくなってしまいました。PL2303 / PL2303HX / PL2303HXA もものは、安くても買わないほう場無難です。私も買いなおしました。

ただ、このアダプタも使用しているものは PL2303HX なので、いつ使えなくなるかわかりません。できれば FTDI 対応のものを使うことをお勧めします。同じようなタイプで PL2303 のものや CH340 のものもあるのですが、それぞれ正規チップではなくてコピー品の互換チップのものが多く出回っています。互換チップだと Windows 10 などでは動作しない&チップベンダーのドライバからもはじかれるので、チャレンジせずに動作実績のあるものを選択するのが良いと思います。正規品は Windows 10 で何もしなくても認識されます。
なお、PL2303HX などの互換チップを買ってしまった場合は、PL2303_Prolific_DriverInstaller_v1.5.0 のような古いドライバを適用すると動きます。ベンダーサポート対象外なのでリンクは載せませんが、探してみれば見つかるかもしれません。

接続はこのアダプタであれば白い線を8番ピンに、緑の線を10番ピンに、黒い線はいずれかのGrandに、そして赤い線は使いません。そして、USB 側は PC に接続するだけで使用できるようになります。

f:id:imaisato:20210105171318j:plain

接続例:8番、10番そして14番を使っています。(6番Grandはファンが使っているので)

これだけで、ヘッドレスシステムの ESXi 出来上がりです。この記事では ESXi Arm Edition をヘッドレスシステム化する例として書きましたが、この内容はそのまま x86 の ESXi でも利用できます。KVM 使ってマウス、キーボード、モニターを切り替えている環境から、全てシリアルポートで管理するシンプルな構成に変えてみるのも面白いかもしれないですね。私は次にシリアル<=>Ethernet変換アダプタを使って、LAN経由でコントロールするようにしていく予定です。

おまけ

購入したけれど使っていなかった Chromebookをシリアルコンソールサーバーにしました。

f:id:imaisato:20210105200133p:plain

Chromebook をシリアルコンソールサーバにした

/dev/ttyUSB0 ~ USBハブでシリアルコンソールケーブルをつないだ分だけ管理ができるので、これでようやく Chromebook も有効活用できそうです。

-----

[2021年1月20日Windows Update で PL2303がだめになる部分を追記]