KVMとProxmoxでのシリアルコンソール設定:SSHが突然切断された時の「命綱」

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

実例:SSHが突然「音信不通」になった時

システム管理者の皆さんなら、このような状況に心当たりがあるはずです。Netplanやファイアウォールの設定ファイルを編集してサービスを再起動するためにEnterキーを押した瞬間、ターミナルが固まってしまう.これでSSH接続は完全に失われました。物理サーバーであれば、サーバー室に駆け込んでモニターを繋ぐことができます。しかし、数百キロ離れたデータセンターにあるVMの場合、ブラウザ経由のVNCは動作が重く、ラグが発生したり、文字化けしたりすることがよくあります。

シリアルコンソール(Serial Console)こそが、完璧な代替案です。筆者の15台のVMを運用しているラボ環境では、シリアルコンソールを事前に設定しておくことで、ホストマシンからわずか1秒でVMのシェルに直接アクセスできます。高速でスムーズ、そして何より仮想ネットワークカード(NIC)の状態に依存しないのが最大の利点です。

クイックスタート:5分で完了する設定手順

手順は大きく分けて2つです:ホスト側での仮想ハードウェアの定義と、ゲスト(VM)内部のソフトウェア設定です。

ステップ1:ホスト側でシリアルデバイスを追加する

Proxmox VEの場合:

  • Web UIにアクセス -> 対象のVMを選択 -> Hardware -> Add -> Serial Port をクリック。
  • 0 (Serial port 0) を選択して Add を押す。
  • Options タブ -> Console Viewer -> Serial terminal 0 (xterm.js) に変更。

KVMの場合(コマンドライン):

# VMのXMLファイルを編集
virsh edit <vm_name>

# <devices> タグの中に以下の行を追加
<serial type='pty'>
  <target port='0'/>
</serial>
<console type='pty'>
  <target type='serial' port='0'/>
</console>

ステップ2:Linux仮想マシン内部の設定

最後に一度だけSSHでVMにログインするか(あるいはデフォルトのコンソールを使用して)、GRUBファイルを編集します:

sudo nano /etc/default/grub

カーネルがシリアルポートにデータを出力できるように、以下のパラメータを探して更新します:

GRUB_CMDLINE_LINUX_DEFAULT="quiet console=tty0 console=ttyS0,115200"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

最後に、ブート設定を更新して再起動します:

sudo update-grub
sudo reboot

なぜ `console=ttyS0,115200` を使うのか?

デフォルトでは、Linuxは tty0(VGA仮想画面)への出力を優先します。ttyS0 を追加することで、そのデータストリームをシリアルポートにも複製するようカーネルに指示します。115200 ボーレートは現在の標準的な速度です。古い9600のような遅延がなく、長いログメッセージも十分に高速に表示できます。

従来のnoVNCと比較したxterm.js(シリアル)の最大の利点は、コピー&ペーストができることです。手元のPCから長いスクリプトをVMのターミナルに直接貼り付けることができます。これは、VNC의 ビットマップ形式のコンソール画面ではほぼ不可能です。

管理のコツとトラブルシューティング

ホストマシンのターミナルから高速アクセス

KVMホストマシンを操作しているなら、時間をかけてWeb UIを開く必要はありません。以下のコマンドを入力するだけです:

virsh console <vm_name>

終了するには、Ctrl + ] を押します。注意:コマンド入力後に画面が止まっているように見える場合は、Enter キーをもう一度押すとログイン画面が表示されます。

Proxmoxでの黒い画面(表示されない)の修正

もし “Guest has not initialized the display (yet)” というメッセージが表示される場合、通常はVM内で update-grub を実行していないか、ハードウェア設定にシリアルデバイスが不足していることが原因です。ホスト側で qm config <vmid> コマンドを使用して、serial0 の行が存在するか確認してください。

RedHat/CentOS系での注意点

CentOSやRHELの場合、GRUBの更新コマンドはブートモードによって異なります:

# BIOSの場合
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# UEFIの場合
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

実戦での経験則

Share: