フリーのエミュレータQEMUを使おう |
||
YAMAMORI Takenori ●yamamori |
QEMUのネットワークには,ユーザモードネットワーク(-user-net)と, TUN/TAPを使ったネットワークの2種類があります. TUN/TAPの設定スクリプトが存在しない場合は,デフォルトで-user-netになります.
ユーザモードネットワーク(-user-net)の構成を下図に示します. このように,-user-netは,QEMU内部に仮想のNAT/DHCPサーバやDNSサーバなどが 自動的に用意される,非常に便利なモードです. ゲストOSは,単にDHCPクライアントとして動作させるだけでよく, そのままLANやインターネットにアクセスすることができます.
しかし,-user-netでは,ゲストOS側のネットワークが,ホストOS側からは 直接見えません.このため,ホストOS(またはLAN上のほかのホスト)から ゲストOSにアクセスしたい場合は,QEMUの起動時に-redirオプションを付け, TCPやUDPのポート単位でのリダイレクト(ポートフォワード)が必要になります. たとえば,ゲストOS内のWebサーバにアクセスできるようにするには, 「-redir tcp:8080::80」というオプションを付けてQEMUを起動し, ゲストOSの80番ポートの代わりにホストOSの8080番ポートにアクセスするように しなければなりません.
このことが問題になる場合は,次項のTUN/TAPを使ったネットワークを 使う必要があります.
・図 ユーザモードネットワーク(-user-net) --- +------------(ホストOS)-----------------------------------+ | +-------------+ +-------------+ +-------------+ | | | | | | | | | | | ゲストOS | | DNSサーバ | | Sambaサーバ | | | | | | | | | | | +------+------+ +------+------+ +------+------+ | | |eth0(10.0.2.15) |10.0.2.3 |10.0.2.4 | | +------------------+------------------+ | | |10.0.2.2 | | +-------------+ +------+------+ | | | | | NAT | | | | ホストOS本体| | DHCPサーバ | | | | | | | | | +------+------+ +------+------+ | | | | | | +----+-------------+ | +-------------|-------------------------------------------+ |eth0(例:192.168.1.2) | |===============+=================================================| LANおよびインターネット
TUN/TAPを使ったネットワークでは,ゲストOSとホストOSの間が TUN/TAPデバイスによる仮想ネットワークで接続されます(下図). これは,-user-netとは違って,ホストOSからゲストOSへ向かう インターフェイスがtun0として見え,ホストOSからポートフォワードなしに, ゲストOSにアクセスすることができます.
ただし,-user-netにはあったNAT/DHCPサーバやDNSサーバはQEMU側では用意されず, 必要に応じてNATやDNSやIPフォワーディングなどの設定を 別途行なわなければなりません.
・図 TUN/TAPを使ったネットワーク --- +--------(ホストOS)-------------+ | +-------------+ | | | | | | | ゲストOS | | | | | | | +------+------+ | | |eth0(例:10.0.0.2)| | | | | |tun0(例:10.0.0.1)| | +------+------+ | | | | | | | ホストOS本体| | | | | | | +------+------+ | +-------------|-----------------+ |eth0(例:192.168.1.2) | |===============+===========================| LANおよびインターネット
TUN/TAPを使うには,まず下図のようにtunモジュールをカーネルにロードします. この時,デバイスファイルの/dev/net/tunがない場合は作成し, これを自分のユーザ権限でアクセスできるよう, パーミッションやグループを設定します.
・図 デバイスファイルの作成とtunモジュールのロード ---- # cd /dev; ./MAKEDEV net ←/dev/net/tunがなければ作る # chmod 660 /dev/net/tun ← 自分のユーザ権限でアクセスできるパーミッション # chgrp mygroup /dev/net/tun に設定する # modprobe tun ← tunモジュールをロードする ----
次に,QEMUの起動時に呼び出される,/etc/qemu-ifupというシェルスクリプトを 下のリストのように記述します.この中には,ホストOS側のtun0に設定する IPアドレスを書いておきます.なお,リスト中の"$1"は,実際にはtun0から 順にインターフェイス名に展開されます.
・リスト /etc/qemu-ifup ---- #!/bin/sh sudo /sbin/ifconfig "$1" 10.0.0.1 ----
さらに,qemu-ifup内でsudoを使用しているため,/etc/sudoersに下のリストのような 記述を追加し,自分自身のユーザ権限でsudoが使えるようにします. usernameのところは自分のユーザ名を記述します.
・リスト /etc/sudoers ---- username ALL=(ALL) ALL ----
以上のホストOS側の設定後,ゲストOSを起動し, 今度はゲストOS内でネットワークの設定を行ないます. ゲストOSがLinuxの場合は,下図のように NE2000 PCIのモジュールであるne2k-pciをロードし, ifconfigでIPアドレスを割り当てればOKです.
・図 ゲストOS側のネットワークの立ち上げ ---- # modprobe ne2k-pci ← モジュールがロードされていなければロードする # ifconfig eth0 10.0.0.2 ← ゲストOS側のIPアドレスを割り当てる ----