irc.cre.jp系IRCサーバ群の公式ボットでは、Windows用LimeChat2のDLLも使っています。VPSでWindowsを使うのは結構コストがかかるので、このWindowsだけ管理者の1人が自宅サーバで動かしています。

そのサーバにはUPSが繋がっているのですが、シリアルポートで接続したUPSと仮想マシンを直接つなげる方法が日本語で見当たらなかったので備忘録代わりに書いておきます。

システム環境

  • 仮想化ホスト:CentOS7.3.1611 + KVM (libvirt)
    • kernel 3.10.0-514.2.2.el7.x86_64
    • qemu-kvm 1.5.3-126
    • libvirt 2.0.0-10
  • 仮想マシン:WindowsServer2012

UPSと仮想化ホストはシリアルケーブル(RS-232C)で接続し、仮想化ホストは /dev/ttyS0 として認識しています。

仮想化ホストの設定

libvirt の仮想マシンの設定ファイルを書き換えます。

$ sudo virsh edit winsrv2012

書き換えるべきは1箇所です。

    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>

これを、以下のように書き換えます。

    <serial type='dev'>
      <source path='/dev/ttyS0'/>
      <target port='0'/>
    </serial>
    <console type='dev'>
      <source path='/dev/ttyS0'/>
      <target type='serial' port='0'/>
    </console>

この内容で保存すると、自動的に文法チェックが走ります。エラーがあればメッセージが出ますが、問題なければ「設定を更新しました」というようなメッセージを出してシェルのプロンプトが戻ります。

仮想マシンの再起動

プロンプトが戻ったら、仮想マシンをシャットダウンしてから起動します。
再起動だと書き換えた設定ファイルを読み込み直さないようなので、面倒ですが仮想マシンのシャットダウンを行ない、完了してから改めて起動し直します。

すると、仮想マシンのシリアルポートからハードウェアのシリアルポートを経て、接続した機器(今回はUPS)に接続できるようになります。

今回の仮想マシンは Windows なので、COM1 ポートに接続されました。
あとは仮想マシンから、物理マシンに直接つないでいるのと同じように操作できます。