マシン仮想化ソフトであるOracleのVirtualBoxで、シリアルポート(COMポート)を使う場合の設定方法についてメモします。使えることは昔から分かっていたのですが、設定方法などを調べることができていなかったので本日実施。備忘録です。なお、使用したVirtualBoxのバージョンは4.0.4です。
最初に設定画面のスクリーンショットを掲載しておきます。
さて、おそらくゲストOS(仮想マシン)がホストOS(物理マシン)のシリアルポートを直接使いたい、というケースが一番多いのではないかと思いますが、ここではあえて一般的に説明してみます。VirtualBoxのゲストOSの設定画面を開いたら「Serial Port」を選択し、各設定項目を次の通り設定します。なお設定画面のタブは「Port 1」でも「Port 2」でも構いません。2つの仮想シリアルポートをゲストOSで使いたい場合は、両方のタブを設定すればOKです。
- Enable Serial Port: 該当画面の設定を有効にする=仮想シリアルポートをゲストに見せる場合はチェックします
- Port Number: ゲストOSからこの仮想シリアルポートが何番目のシリアルポートに見えるかを設定
- IRQ: (普通は標準通りで良いです)
- I/O Port: (普通は標準通りで良いです)
- Port Mode: (後述します)
- Port/File Path: (Port Modeの指定によって意味が変わります)
Enable Serial Port、Port Numberは説明不要だと思います。IRQとI/O Portについては、これらの値が決まらないと「OSがシリアルポートを使えない」ことだけ理解すれば問題ありません。Port ModeとPort/File Pathは、Port Modeの選択肢ごとに次のような意味になります。
- Disconnected: 何も接続されていないシリアルポートがあるように見せかける方法です。シリアルポートを列挙するプログラムをゲストOSで開発・検証する場合など、とりあえずダミーであってもポートが存在していて欲しい場合に使います。Port/File Pathの値は無視されます。
- Host Pipe: ホストOS上の名前付きパイプをシリアルポートに見せかける方法。高度な使い方ですので普通は使いません。ホストOS上で動いているプログラムとリアルタイムで通信したい場合で、しかもTCP/IPなどの通信が使えないような場合などに使います(おそらくこの設定を使うのはOS自体を開発する場合ぐらいではないかと思います)。Port/File Pathの値には名前付きパイプの名称を指定します(Windowsならば\\.\pipe\mypipenameなど)。
- Host Device: ホストOS上で使えるシリアルポート(=物理マシンの物理的なシリアルポート)をそのまま使わせる方法。まさに「そのまんま」な方法ですが、ポート番号、IRQ、I/O Portアドレスといったパラメータを変更することもできます。Port/File Pathの値には、COM1を使う場合は「COM1」、COM2を使う場合は「COM2」などと指定します。
- Raw File: ホストOS上のファイルをシリアルポートに見せかける方法。使ったことがないため憶測ですが、指定したファイルにホストOS上で何かを書き込むとその内容がゲストOSに送信され、ゲストOS側でシリアルポートに何かを書き込むとその内容が指定したファイルに書き込まれる、という形になると思われます。Port/File Pathの値には、このような用途で使いたいファイルのパスを指定します。
ホスト側の設定は以上です。ゲストOS側については、おそらく正しく設定した状態でOSをインストールすれば認識されるはずだと思います。もし後から追加する場合、ゲストOSの側でシリアルポートの設定を追加してください(たとえばWindows 2000ではコントロールパネルから「ハードウェアの追加と削除」を選択し、「デバイスの追加/トラブルシューティング」、「新しいデバイスの追加」、「いいえ、一覧からハードウェアを選択します」、「ポート(COMとLPT)」、「製造元=(標準ポート)、モデル=通信ポート」と選択して、IRQをVirtualBoxのIRQの設定値に合わせ、I/O範囲の開始アドレスをVirtualBoxのI/O Portの設定値に合わせます)。Windows 2000で設定した画面例を次になります。
なお、VirtualBox側でCOM1として見えるよう設定した場合でもゲストOS側でCOM1と認識されるとは限りません。このあたりの理由はまだ分からないのですが、実用上は問題ありませんので「そういうものだ」と理解しています。
シリアル通信の開発を経験されている方の中にはHost DeviceモードでCOM1を指定する場合とRaw FileモードでCOM1を指定する場合にどう違うのか疑問に思われる方もいらっしゃるかと思います。詳細は未確認ですが私としては、Raw Fileモードでホストからデータを送信する場合はVirtualBoxが定期的に指定ファイルの更新日付を監視し、更新を検出するたびにゲストOSへ送信することになる(つまりリアルタイム通信にならない)と想像しています。実際にRaw Fileモードで\\.\COM1など指定して通信してみたところ通信速度が猛烈に遅くなりましたので、物理シリアルポートを使う場合はHost Deviceモードを選択した方が良いことは間違い無いようです。