インストールが終わったら、仮想ハードディスクイメージを使ってブートします(-boot c)。今回、ゲストOSはX Window Systemを必要としない最小構成にしています。通常、QEMUはSDLを使ったVGAでの出力ですが、今回はテキストモードで起動します(-curses)。
実行するとそのまま仮想ターミナル上でゲストOSのブートが始まり、ブート後、ログインし/proc/cpuinfoを見ると、CPUの型が「QEMU Virtual CPU」となっていることが分かります。
$ kvm -hda sid.img -boot c -m 384 -curses |
この状態で、ゲストOSはホストOSを介して外部ネットワークにアクセスすることができます。普通にKVMを使用するだけであれば、この起動方法だけを知っていれば十分でしょう。
KVMの基本的な使い方は以上です。QEMUを知っている方であれば、ハードウェアの制限があること以外、使用方法はほぼまったく同じであることがお分かりになると思います。
これで動作は可能な状態になったわけですが、kvm/qemuではいろいろなネットワーク設定を行うことができます。中には、manマニュアルをよく読んでもなかなか分かりにくい部分があります。そこで、いくつかの使い方を想定し、ネットワークの設定方法について解説します。
主に想定される使い方は以下のようなケースです。
先に説明した手順で設定すれば、そのまま利用できます。この場合、デフォルト値の「-net user」オプションが指定されています。ネットワーク構成は図1のとおりです。
-net userオプションでは、デフォルトゲートウェイとしてDHCPサーバが組み込まれたQEMU FW/DHCP(10.0.2.2)が、DNSのリゾルバとしてQEMU DNS(10.0.2.3)が自動的に指定されます。ゲストOSは、QEMUを介して外部ネットワークにアクセスすることはできますが、10.0.2.2がファイアウォールとして機能するため、ホストOSの外部ノードはもちろん、ホストOSからも、ゲストOSに対しネットワーク経由でアクセスすることはできません。
ケース1で実行したコマンドに「-redir」オプションを加えて起動します。また、このケースでも-net userオプションが省略されています。
$ kvm -hda sid.img -boot c -m 384 -curses -redir tcp:2222::22 |
この例ではホストOSのtcp/2222ポートとゲストOSのtcp/22ポートをバインドします。ホストOSのtcp/2222にアクセスすると、ゲストOSのtcp/22ポート(ssh)にリダイレクトされるようになります。ネットワーク構成は図2のとおりです。
|
|
リモートPCからのアクセス |
|
|
ホストOSからのアクセス |
公開するサービスごとにredirオプションで指定を行う必要があるため、一時的な利用にはよいのですが、サーバとして通常運用するには不便です。
このケースでは「-net nic,macaddr」オプションと「-net socket」オプションを使用します。
前者ではMACアドレスを指定します。ゲストOSのMACアドレスは、デフォルトでは52:54:00:12:34:56が使用されますが、ゲストOS同士で通信させる場合、別のMACアドレスを指定する必要があります。またこのオプションを指定すると、-net userオプションにはあったQEMU FW/DHCPサーバや、QEMU DNSサーバはありませんので、ゲストOS起動後に手動でIPアドレスを設定する必要があります。
後者はTCPソケットを用いたゲストOS同士の通信の設定です。1台目のゲストOSは「-net socket,listen」オプションで待ち受け、2台目のゲストOSは「-net socket,connect」オプションで1台目に接続します。
|
ホストOSのtcp/1234ポートで2台目のゲストOSからの通信を待ち受けます(-net socket,listen=:1234)。IPアドレスはゲストOS自体で192.168.1.101/24で設定します。
|
1台目のゲストOSとは別のMACアドレスを指定します(-net nic,macaddr=52:54:00:12:34:57)。またホストOSの127.0.0.1 tcp/1234でLISTENしているポートに対し、TCPセッションを張ります(-net socket,connect=127.0.0.1:1234)。ゲストOS自体で1台目とは別のIPアドレス、192.168.1.102/24を設定します。
ネットワーク構成は図3のとおりです。上記のように起動すると、Guest1とGuest2の間で、ホストOSのloインターフェイスのtcp/1234ポートを介し、TCPソケットをトンネルとした通信を行えるようになります。
$ netstat -nat | grep 1234 |
上記の例では、tcp/1234ポートがGeust1側、tcp/50100ポートがGuest2側です。Guest1、Guest2の間は、ICMP、TCP、UDPのいずれの通信も行えます。ただし、このケースでは外部との通信は一切行えないので、クローズ環境での疎通テストを行うケースなどで利用することになるでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.