KVMの導入と基本的な使い方知って見るみるKVM(2)(2/3 ページ)

» 2009年04月15日 00時00分 公開
[まえだこうへいDebian JP Project]

ゲストOSの起動

 インストールが終わったら、仮想ハードディスクイメージを使ってブートします(-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

(snip)
Debian GNU/Linux squeeze/sid kvm-guest tty1
kvm-guest login:
$ cat /proc/cpuinfo
(snip)
model name      : QEMU Virtual CPU version 0.9.1
(snip)

 この状態で、ゲストOSはホストOSを介して外部ネットワークにアクセスすることができます。普通にKVMを使用するだけであれば、この起動方法だけを知っていれば十分でしょう。

 KVMの基本的な使い方は以上です。QEMUを知っている方であれば、ハードウェアの制限があること以外、使用方法はほぼまったく同じであることがお分かりになると思います。

使い方に応じたネットワーク構成

 これで動作は可能な状態になったわけですが、kvm/qemuではいろいろなネットワーク設定を行うことができます。中には、manマニュアルをよく読んでもなかなか分かりにくい部分があります。そこで、いくつかの使い方を想定し、ネットワークの設定方法について解説します。

 主に想定される使い方は以下のようなケースです。

  1. 基本的にクローズ環境でゲストOSを動かす
  2. ケース1の構成で、ホストOSやホストOSの外部端末からもゲストOSにアクセスできるようにする
  3. ケース1の構成で、複数のゲストOS同士で通信する
  4. サービス用のゲストOSを複数起動し、外部ノードからゲストOSに簡単にアクセスできるようにする

●ケース1:基本的にクローズ環境でゲストOSを動かす

 先に説明した手順で設定すれば、そのまま利用できます。この場合、デフォルト値の「-net user」オプションが指定されています。ネットワーク構成は図1のとおりです。

図1 クローズ環境で使用する 図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に対しネットワーク経由でアクセスすることはできません。

●ケース2:ケース1の構成で、ホスト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のとおりです。

図2 ホストOSやホストOSの外部端末からもゲストOSにアクセスできるようにする 図2 ホストOSやホストOSの外部端末からもゲストOSにアクセスできるようにする
$ ssh -p 2222 192.168.0.102
リモートPCからのアクセス
$ ssh -p 2222 localhost
または
$ ssh -p 2222 192.168.0.102
ホストOSからのアクセス

 公開するサービスごとにredirオプションで指定を行う必要があるため、一時的な利用にはよいのですが、サーバとして通常運用するには不便です。

●ケース3:ケース1の構成で、複数のゲストOS同士で通信する

 このケースでは「-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 1台目
 
ゲストOSの起動
$ kvm -hda sid1.img -boot c -m 384 -curses -net nic,macaddr=52:54:00:12:34:56 -net socket,listen=:1234

ゲストOS上での設定
# ifconfig eth0 192.168.1.101 netmask 255.255.255.0

 ホストOSのtcp/1234ポートで2台目のゲストOSからの通信を待ち受けます(-net socket,listen=:1234)。IPアドレスはゲストOS自体で192.168.1.101/24で設定します。

  • ゲストOS 2台目
 
ゲストOSの起動
$ kvm -hda sid2.img -boot c -m 384 -curses -net nic,macaddr=52:54:00:12:34:57 -net socket,connect=127.0.0.1:1234

ゲストOS上での設定
# ifconfig eth0 192.168.1.102 netmask 255.255.255.0

 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ソケットをトンネルとした通信を行えるようになります。

図3 複数のゲストOS同士で通信する 図3 複数のゲストOS同士で通信する
$ netstat -nat | grep 1234
tcp        0      0 0.0.0.0:1234        0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:50100     127.0.0.1:1234         ESTABLISHED
tcp        0      0 127.0.0.1:1234      127.0.0.1:50100        ESTABLISHED

 上記の例では、tcp/1234ポートがGeust1側、tcp/50100ポートがGuest2側です。Guest1、Guest2の間は、ICMP、TCP、UDPのいずれの通信も行えます。ただし、このケースでは外部との通信は一切行えないので、クローズ環境での疎通テストを行うケースなどで利用することになるでしょう。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。