サイトを移転しました 5秒後に新しいサイトに移動します

新しいサイト

QEMUは、ユーザーモードでのネットワークの使用をサポートしています。ホストOSで、root権限もしくは、Administrator権限を持つユーザーでなくても、インターネットのホームページを見たり、ftp、sshといったソフトウェアを使うことができます。

-redirオプションを使って、ホストOSからゲストOSに接続する場合だけ、root権限もしくはAdministrator権限が必要です。

1. オプション

-netオプションは、ネットワークカードと情報の出入り口を指定することに使います。そのため、2つ以上の指定が必要です。
-net nic -net user
デフォルト。

-net nic,vlan=1 -net user,vlan=1
ネットワークをVLAN番号1で構成する。

-net nic,model=ne2k_pci -net user
-net nic,model=rtl8139 -net user
-net nic,model=pcnet -net user
PCIバスのネットワークカードを使う。ne2k_pciがデフォルトです。

-M isapc -net nic -net user
ISAバスのネットワークカードを使う。


2. ネットワークカード

NE2000 PCI、RTL8139、PCNET、NE2000 ISAカードというネットワークカードが利用可能です。
-net nic,modelというオプションで使いたいネットワークカードを指定します。ne2k_pciがデフォルトです。
-net nic,model=ne2k_pci -net user
-net nic,model=rtl8139 -net user
-net nic,model=pcnet -net user

もし、ISAカードを使いたいときは、-M isapcというオプションをつける必要があります。

-M isapc -net nic -net user
-M isapc -net nic,model=ne2k_isa -net user


3. NE2000 PCIカードのエミュレーション

3.1 自動設定

バージョン0.6.0から、NE2000 PCIカードがサポートされています。ゲストOSが、プラグアンドプレイをサポートしていれば、NE2000を自動的に見つけてくれると思います。また、DHCPクライアント機能を持っていれば、ネットワークは自動的に設定されて使えるようになると思います。

Windows for Workgroup 3.11、Windows NT 4、OS/2 warp 4をゲストOSとして使うときは、Realtek 8029のドライバを使ことができるそうです。他のOSでも同様かもしれません。NE2000のドライバは、使えないそうです。

もし、ゲストOSがLinuxで、NE2000が検出されなかった場合、次のことをしてみてください。

$ modprobe ne2k-pci
$ dhclient eth0      (or  $ dhcpcd eth0)

3.2 Morphix の例

MorphixをゲストOSに使ったときのネットワークは次のとおりです。
カーネルモジュールは、8390.oとne2k-pci.oが組み込まれています。

sh-2.05b# lsmod
Module                  Size  Used by    Not tainted
input                   3328   0  (autoclean)
pcmcia_core            43488   0 
translucency           61408   8 
af_packet              14568   0  (autoclean)
ne2k-pci                5504   1 
8390                    6576   0  [ne2k-pci]
apm                    10436   1 
rtc                     7356   0  (autoclean)
unix                   17064  16  (autoclean)
cloop                   8420   4 
irqは、9で、ioメモリのアドレスは、0xc100です。
sh-2.05b# cat /proc/interrupts
           CPU0       
  0:     218022          XT-PIC  timer
  1:        287          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  8:          1          XT-PIC  rtc
  9:         21          XT-PIC  eth0
 12:        240          XT-PIC  PS/2 Mouse
 15:       1333          XT-PIC  ide1
NMI:          0 
LOC:          0 
ERR:          0
MIS:          0

sh-2.05b# cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
0320-0323 : 
0350-0353 : 
0376-0376 : ide1
03c0-03df : vesafb
03f8-03ff : serial(auto)
0cf8-0cff : PCI conf1
c000-c00f : Intel Corp. 82371SB PIIX3 IDE [Natoma/Triton II]
c000-c007 : ide0
c008-c00f : ide1
c100-c1ff : Realtek Semiconductor Co., Ltd. RTL-8029(AS)
c100-c11f : ne2k-pci
ネットワークインターフェースNE2000のIPアドレスは、10.0.2.15になってました。
sh-2.05b# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:2004 (1.9 KiB)  TX bytes:1746 (1.7 KiB)
          Interrupt:9 Base address:0xc100 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:480 (480.0 b)  TX bytes:480 (480.0 b)
ルーティングテーブルは、次のとおりです。
sh-2.05b# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
ルータ10.0.2.2にpingできます。
sh-2.05b# ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=255 time=3.05 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=255 time=2.14 ms
64 bytes from 10.0.2.2: icmp_seq=3 ttl=255 time=2.76 ms
64 bytes from 10.0.2.2: icmp_seq=4 ttl=255 time=2.13 ms
64 bytes from 10.0.2.2: icmp_seq=5 ttl=255 time=2.15 ms
64 bytes from 10.0.2.2: icmp_seq=6 ttl=255 time=2.91 ms

--- 10.0.2.2 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5065ms
rtt min/avg/max/mdev = 2.139/2.529/3.059/0.394 ms

3.3 DNSサーバのアドレス

ルーターがDNSサーバの機能を持っていないときなど、ゲストOSからIPアドレスではインターネットを見れるけれど、http://fabrice.bellard.free.fr/などではブラウザが使えないことがあります。

そのときは、ゲストOSにDNSサーバーのアドレスを手動で設定してください。ゲストOSがLinuxのときは、/etc/resolve.confにプロバイダからもらったDNSサーバのアドレスを入れてください。

/etc/resolve.conf:

nameserver DNS server's address 1
nameserver DNS server's address 2

ゲストOSがWindowsのときは、ネットワークとダイアルアップ接続のNE2000のプロパティから設定します。



4. VLANの使い方

4.1 はじめに

バージョン0.8.0からネットワークオプションが変わりました。VLANという名前です。ゲストOSの間で、通信を行うことができます。使うのにAdministrator特権は必要ありません。

-net オプションが、データのインプット/アウトプットの端子を設定するのに使われます。NE2000の場合は、-net nicオプションになります。もし、2つ以上のNE2000を使う場合や、2つ以上のゲストOSを使う場合は、-net nic,macaddr=52:54:00:12:34:56のようにそれぞれの-net nicオプションにmacaddrを設定する必要があります。ユーザーモードのネットワークに対しては、-net userオプションが使われます。ゲストOSに1つNE2000をセットし、インターネットにつなぎたい場合は、オプションは、-net nic -net userになります。これがデフォルトです。

2つ以上のゲストOSを使いたい場合は、TCPを使う方法とUDPを使う方法があります。TCPは、-net socket,listenと-net socket,connectオプションによって使われます。UDPは、-net socket,mcastオプションによって使われます。-net socket,litenと-net socket,connectオプションが使われた場合は、ゲストOSのNE2000から出たデータは、TCPパケットにカプセル化され、他のゲストOSに送られます。-net socket,mcastオプションが使われたときは、それは、UDPパケットによって行われます。

-net socket,listenもしくは、-net socket,mcastオプションを使うには、Administrator権限が必要です。

以下にVLANのいくつかの使い方を示します。 Redhatのハードディスクイメージを3つコピーして用意しました。そして、3つの異なるコマンドプロンプトからプログラムを起動しました。ne2k-pciカーネルモジュールが、ロードされて、ifconfig -aで、ネットワークのインターフェースを見ることができる状態になっています。

全体的な注意点としては、
2つ目のOSでは、macaddrをセットする必要があります。
listenまたは、connectをセットするには、IPアドレスもしくは、localhostを使う必要があります。そうでなければ、0.0.0.0が使われます。
1つのハードディスクで2つQEMUを起動しないでください。これをやると、ハードディスクのイメージが壊れます。
これらの結果は、Linuxのホスト上でも同じです。

4.2 ゲストのみのネットワーク

     Redhat1 NE2000 --------------------------
                           |                 |
                           |                 |
                  Redhat2 NE2000    Redhat3 NE2000

コマンドラインのオプションは、
term1$ qemu -L ./pc-bios -hda redhat1.img -net nic
                  -net socket,listen=localhost:1234
term2$ qemu -L ./pc-bios -hda redhat2.img -net nic,macaddr=52:54:00:12:34:57
                   -net socket,connect=localhost:1234

ゲストOSのセッティングは、
Redhat1 guest>ifconfig eth0 10.0.2.16

Redhat2 guest>ifconfig eth0 10.0.2.17

QEMUモニターの情報は次のようになります。
Redhat1
(qemu) info network
VLAN 0 devices:
  ne2000 pci macaddr=52:54:00:12:34:56
  socket: connection from 127.0.0.1:1472

Redhat2
(qemu) info network
VLAN 0 devices:
  socket: connect to 127.0.0.1:1234
  ne2000 pci macaddr=52:54:00:12:34:57

結果は、次のようになります。
pingは、2つの間のゲストで動きます。
telnet, sshも同様に動きます。

注意:
3つ以上のゲストOSを使う場合は、connectを使ってください。macaddrは、違ったものを使ってください。
term3$ qemu -L ./pc-bios -hda redhat2.img -net nic,macaddr=52:54:00:12:34:58
                   -net socket,connect=localhost:1234
もし、Redhat1がクラッシュすると、Redhat2とRedhat3の間で通信ができなくなります。

4.3 UDPによるゲストのみのネットワーク

                --------------------------------------
                |                |                   |
                |                |                   |
     Redhat1 NE2000     Redhat2 NE2000     Redhat3 NE2000

コマンドラインのオプションは以下のとおりです。
term1$ qemu -L ./pc-bios -hda redhat1.img -net nic,macaddr=52:54:00:12:34:56
                   -net socket,mcast=230.0.0.1:1234
term2$ qemu -L ./pc-bios -hda redhat2.img -net nic,macaddr=52:54:00:12:34:57
                   -net socket,mcast=230.0.0.1:1234
term3$ qemu -L ./pc-bios -hda redhat3.img -net nic,macaddr=52:54:00:12:34:58
                   -net socket,mcast=230.0.0.1:1234

ゲストOSのセッティングは次のとおりです。
Redhat1 guest>ifconfig eth0 10.0.2.16

Redhat2 guest>ifconfig eth0 10.0.2.17

Redhat3 guest>ifconfig eth0 10.0.2.18

QEMUモニターの情報は次のとおりです。
Redhat1
(qemu) info network
VLAN 0 devices:
  socket: mcast=230.0.0.1:1234
  ne2000 pci macaddr=52:54:00:12:34:56

Redhat2
(qemu) info network
VLAN 0 devices:
  socket: mcast=230.0.0.1:1234
  ne2000 pci macaddr=52:54:00:12:34:57

Redhat3
(qemu) info network
VLAN 0 devices:
  socket: mcast=230.0.0.1:1234
  ne2000 pci macaddr=52:54:00:12:34:58

結果は、次のようになります。
pingは、2つのゲストの間で動作します。
telnet, sshも同様に動きます。

4.4 1つのゲストがユーザーモードでネットにつながり、異なったVLANバスで接続を待ち受け、もう1つのゲストが最初のゲストに接続

                       VLAN 1
     Redhat1 NE2000 --------------- USER -------------- Host & Internet
             NE2000 ---------
                             |  VLAN 2
                             | 
                   Redhat2 NE2000

コマンドラインオプションは、次のようになります。
term1$ qemu -L ./pc-bios -hda redhat1.img -net nic,vlan=1 -net user,vlan=1
                  -net nic,vlan=2,macaddr=52:54:00:12:34:57
                  -net socket,vlan=2,listen=localhost:1234
term2$ qemu -L ./pc-bios -hda redhat2.img
                   -net nic,vlan=2,macaddr=52:54:00:12:34:01
                   -net socket,vlan=2,connect=localhost:1234

ゲストOSのセッティングは次のようになります。
Redhat1 guest> dhcpcd eth0
   (もしくは、dhclinet eth0. もし、eth0のIPアドレスが既にセットされていれば、これをやる必要はありません。)
   (eth0 は、10.0.2.15 もしくは 10.0.2.16になります。)
2つめのNE2000は、IPアドレスを手動でセットする必要があります。
Redhat1 guest> ifconfig eth1 192.168.10.2

2つめのゲストOSは、DHCPサーバーを持っていないため、IPアドレスを手動でセットする必要があります。
Redhat2 guest> ifconfig eth0 192.168.10.3
Redhat2 guest> route add default gw 192.168.10.2 eth0

QEMUモニターの情報は次のとおりです。
Redhat1
(qemu) info network
VLAN 1 devices:
  user redirector
  ne2000 pci macaddr=52:54:00:12:34:56
VLAN 2 devices:
  ne2000 pci macaddr=52:54:00:12:34:57
  socket : connection from 127.0.0.1:1477

Redhat2
VLAN 2 devices:
  socket: connect to 127.0.0.1:1234
  ne2000 pci macaddr=52:54:00:12:34:01

結果は、次のようになります。
telnet と ssh は、2つのゲストの間で動きます。
lynx は、Redhat1上で動作します。
Redhat2からインターネットに接続するためには、Redhat1をルーターとして設定する必要があります。

注意:
VLAN のID は、ゲストの間で同じである必要はありません。ポート番号(この場合は1024)がどのバスが使われるかを決めます。

4.5 1つのゲストがユーザーモードでネットにつながり、同じVLANバスで接続を待ち受け、もう1つのゲストが最初のゲストに接続

     Redhat1  NE2000 -------------- USER --------- Host & Internet
                          | 
                          |
               Redhat2 NE2000
これは、うまく動きませんが、参考のために説明します。

コマンドラインは次のようになります。
term1$ qemu -L ./pc-bios -hda redhat1.img -net nic -net user
                  -net socket,listen=localhost:1234
term2$ qemu -L ./pc-bios -hda redhat2.img -net nic,macaddr=52:54:00:12:34:01
                  -net socket,connect=localhost:1234

ゲストOSのセッティングは次のとおりです。
Redhat1 guest> dhcpcd eth0
(もしくは dhclient eth0)

2つめのゲストOSは、DHCPサーバーを持っていないため、IPアドレスを手動でセットする必要があります。
Redhat2 guest> ifconfig eth0 10.0.2.17
Redhat2 guest> route add default gw 10.0.2.2 eth0

結果は、次のとおりです。
telnet は時々動きますが、接続を拒否されます。接続されるゲストで、telnetdが動作しているときは成功することがあります。

sshの場合は、RSAキーが最初セーブされますが、次のメッセージで失敗します。
Write failed: Connection reset by peer.

2度目以降は、次のメッセージで終了します。
ssh_exchange_identification:  read: Connection Reset by peer.

Redhat1とRedhat2の両方からインターネットに接続できます。

注意:
これは、うまく動きません。
Redhat2からインターネットに接続する場合でも、Redhat1をルーターとしてセットする必要はありません。

4.6 TCP vs. UDP

TCP (-net socket,listen and -net socket,connect)を使う利点は、信頼性にあります。UDP (-net socket,mcast)が使われるときは、ゲストOSのネットワークスタックがその役割を負います。

TCPを使う場合の欠点は、-net socket,listenをつかったゲストOSがクラッシュすると、残されたゲストOS同士で通信できなくなることです。-net socket,mcastを使った場合、その心配はありません。



5. オプション-M isapcを使ったネットワーク

バージョン0.8.0から、-isaオプションは、-M isapcオプションになりました。これを使ってISAカードのNE2000を使う場合は、ネットワークは自動では設定されませんので次のようにする必要があります。ここでは、次のOSを使用しました。

ホストOS: Fedora Core 1 もしくは、Windows2000
ゲストOS: Red Hat Linux 7.2

ゲストOSは、ネットワークサポートのみでインストールしました。X Window を入れなければ、CD-ROMを取り替える必要はないと思います。

バージョン0.8.0から、-user-netオプションは、-net nic -net userオプションに変更になりました。

$ qemu -L ./pc-bios -hda redhat72.img -net nic -net user

5.1 ネットワーク構成を手動で行う方法

5.1.1 ドライバーモジュールのロード

NE2000 ISAカードを使用する場合は、IRQとI/Oメモリーベースを手動で設定する必要があります。IRQは、9。I/Oは、0x300です。
ゲストOSでの作業はrootになって行う必要があります。
まず、NE2000用の
/lib/modules/2.4.x/kernel/driver/net/8390.o
/lib/modules/2.4.x/kernel/driver/net/ne.o
の2つのドライバーをロードします。

[Red Hat 7.2]$ su
Password: 
[Red Hat 7.2]# /sbin/insmod 8390
Using /lib/modules/2.4.9-13/kernel/drivers/net/8390.o
[Red Hat 7.2]# /sbin/insmod ne irq=9 io=0x300
Using /lib/modules/2.4.9-13/kernel/drivers/net/ne.o

確認は、次のようにします。

[Red Hat 7.2]# /sbin/lsmod
Module                  Size  Used by
ne                      7488   0  (unused)
8390                    6752   0  [ne]
ext3                   62480   1 
jbd                    41056   1  [ext3]

[Red Hat 7.2]# cat /proc/interrupts
           CPU0       
  0:      31580          XT-PIC  timer
  1:        406          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  8:          1          XT-PIC  rtc
  9:          0          XT-PIC  NE2000    <--- irq=9
 14:       5676          XT-PIC  ide0
 15:          1          XT-PIC  ide1
NMI:          0 
ERR:          0

[Red Hat 7.2]# cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
0300-031f : eth0         <--- io=0x300
0376-0376 : ide1
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(auto)

5.1.2 NE2000の設定

最初は、NE2000(eth0)は無効になっているので、"-a"オプションが無いと表示されません。

[Red Hat 7.2]# /sbin/ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:420 (420.0 b)  TX bytes:420 (420.0 b)

[Red Hat 7.2]# /sbin/ifconfig -a
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:9 Base address:0x300 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436 Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:420 (420.0 b)  TX bytes:420 (420.0 b)

eth0を10.0.2.16に設定します。

[Red Hat 7.2]# /sbin/ifconfig eth0 10.0.2.16

[Red Hat 7.2]# /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
          inet addr:10.0.2.16  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:9 Base address:0x300 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:420 (420.0 b)  TX bytes:420 (420.0 b)

5.1.3 ルーティングテーブルの設定

ルーティングテーブルを確認します。

[Red Hat 7.2]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.0.0.0       U        40 0          0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U        40 0          0 lo

デフォルトゲートウェイに10.0.2.2を指定します。

[Red Hat 7.2]# /sbin/route add -net 0.0.0.0 gw 10.0.2.2 eth0

[Red Hat 7.2]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.0.0.0       U        40 0          0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U        40 0          0 lo
0.0.0.0         10.0.2.2        0.0.0.0         UG       40 0          0 eth0

これで、10.x.x.x と 127.x.x.x を除く、すべてのパケットがeth0(NE2000)を通して、ゲートウェイ 10.0.2.2 へ送られます。

注意:3.1、3.2、3.3 の作業は、次のようにすることもできます。

[Red Hat 7.2]#/sbin/modprobe ne irq=9 io=0x300
[Red Hat 7.2]#/sbin/dhcpcd eth0

もし、ゲストOSがFedora Core 1なら、
[Guest OS is Fedora Core 1]#/sbin/dhclient eth0

DHCP サーバーからIPアドレスを得るのに時間がかかるかもしれません。

これにより、eth0 に 10.0.2.x のアドレスが割り当てられます。

5.1.4 仮想インターフェースの確認

仮想インターフェースが動作しているかどうかpingで確認します。

[Red Hat 7.2]# ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) from 10.0.2.16 : 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=0 ttl=255 time=26.471 msec
64 bytes from 10.0.2.2: icmp_seq=1 ttl=255 time=1.674 msec
64 bytes from 10.0.2.2: icmp_seq=2 ttl=255 time=1.579 msec

--- 10.0.2.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/mdev = 1.579/9.908/26.471/11.711 ms
[Red Hat 7.2]# ping 10.0.2.3
PING 10.0.2.3 (10.0.2.3) from 10.0.2.16 : 56(84) bytes of data.

--- 10.0.2.3 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss

ping 10.0.2.3 は、うまく動かないみたいですが、問題ありません。

5.1.5 ホストOSでの確認

私のホストのLinuxでは、ネットワークカードに192.168.100.2が割り当てられています。

[Fedora Core 1]$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:40:2B:XX:YY:ZZ  
          inet addr:192.168.100.2  Bcast:192.168.100.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1532 (1.4 Kb)  TX bytes:976 (976.0 b)
          Interrupt:5 Base address:0x3000 

また、sshd が動作していることを確認します。

[Fedora Core 1]$ ps ax |grep ssh
 3766 ?        S      0:00 /usr/sbin/sshd
 4048 ?        S      0:00 /usr/bin/ssh-agent /etc/X11/xinit/Xclients
11800 pts/4    S      0:00 grep ssh

Windows2000では、ipconfig で確認できます。

c:\> ipconfig

Windows 2000 IP Configuration

Ethernet adapter ローカル エリア接続:

	Connection-specific DNS Suffix  . :
	IP Address. . . . . . . . . . . . : 192.168.100.2
	Subnet Mask . . . . . . . . . . . : 255.255.255.0
	Default Gateway . . . . . . . . . : 192.168.100.1

Telnet サービスを、コントロールパネルから起動します。このとき、NTLM認証を無効にする必要があります。
Telnet サービスは、使用後必ず停止してください。セキュリティーホールになりえますので。

5.1.6 ソフトの使用

Linuxでは、sshを使ってホストに接続してみます。

[Red Hat 7.2]$ ssh 192.168.100.2
The authenticity of host '192.168.100.2 (192.168.100.2)' can't be established.
RSA key fingerprint is 66:aa:8d:42:bd:8a:0d:bf:98:d9:6a:f6:aa:bb:cc:dd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.2' (RSA) to the list of known hosts.
kazu@192.168.100.2's password: 

[Fedora Core 1]$ ls

[Fedora Core 1]$ exit
logout
Connection to 192.168.100.2 closed.

あとは、Lynxなどでインターネットを見ることができます。

[Red Hat 7.2]$ lynx http://fabrice.bellard.free.fr

Windows2000の場合は、telnet でホストに接続します。

[Red Hat 7.2]$ telnet 192.168.100.2

C:\>exit

バックスペースは、Ctrl-h になっています。

その他のプログラムも使えます。

5.2 スタートアップ時にネットワーク構成を自動で行う方法

5.2.1 ドライバーモジュールの設定

/etc/modules.conf に次のような項目を付け加えます。

alias eth0 ne
    options ne irq=9 io=0x300

5.2.2 ネットワークインターフェースの設定

/etc/sysconfig/network-scripts/ifcfg-eth0 に次のような内容のファイルを作ります。

# ISA NE2000
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=52:54:00:12:34:56
ONBOOT=yes
TYPE=ethernet
USERCTL=no
PEERDNS=no

5.2.3 再起動と確認

ゲストOSを再起動してスタートアップ時に次のような表示が出れば、OKです。

Bringing up interface   eth0:                 [  OK  ]

6. オプション-tftpによるファイルの転送

-tftpオプションをつけると、ゲストOSの中で、tftpクライアントを使うことでホストOSからゲストOSへファイルを転送することができます。

円記号'\'のかわりに、スラッシュ'/'をつかってください。
ファイルそれぞれについてディレクトリまで含めた名前を使う必要があります。
たとえば、C:\msys\1.0\home\kazuフォルダにある、ファイルC:\msys\1.0\home\kazu\test.txtを転送したい場合は、次のようにします。

[Dos Prompt] qemu.exe -L ./pc-bios -hda redhat.img -tftp /msys/1.0/home/kazu

guest OS$ tftp 10.0.2.2
guest OS$ tftp>binary
guest OS$ tftp>get /msys/1.0/home/kazu/test.txt

MS-DOSプロンプトでは、ルートディレクトリ'/'は、'C:\'を意味します。
MinGW/MSYSの環境では、ルートディレクトリ'/'は、'C:/msys/1.0'を意味し、'/tmp'は、'C:\DOCUME~1/kazu/LOCALS~1/Temp'を意味します。間違えやすいので注意してください。

注意:転送できるファイルの最大は、(32M - 512)バイトです。
   D:やE:など他のドライブにあるファイルは転送できません。
   ゲストOSからホストOSへファイルを転送することはできません。

7. オプション-redirによるホストOSからゲストOSへの接続

プログラムの起動時にIPアドレスを指定する必要があります。DHCPサーバからもらえるIPアドレスは、Windows 98では、10.0.2.15、Morphixでは、10.0.2.15、RedHat Linuxは、10.0.2.16です。一度確認する必要があります。

host OS$ qemu.exe -L ../pc-bios -hda redhat.img -redir tcp:5555:10.0.2.16:23

10.0.2.16は、ゲストOSのIPアドレス、5555はホストOSで待ち受けるポート番号、23がゲストOSが待ち受けるポート番号になります。23はtelnetサーバーの番号です。

もし、telnetとsshを同時に使いたい場合は、-redirを複数使うことができます。

host OS$ qemu.exe -L ../pc-bios -hda redhat.img -redir tcp:5555:10.0.2.16:23 -redir tcp:5556:10.0.2.16:22

sshdは22番になります。Linuxの場合は、/etc/servicesで各ソフトウェアの使うポート番号を確認することができます。

arpテーブルの設定に時間がかかるようです。
最初にホストからゲストに接続しようとした後、arpテーブルは次のようになります。

guest OS# arp -a
guest OS#? (10.0.2.3) at 52:54:00:12:35:03 [eth0] on eth0
guest OS#? (10.0.2.3) at 52:54:00:12:35:02 [eth0] on eth0

ゲストOS上では、なるべくIPアドレスは手動で設定しないでください。DHCPサーバからもらわないと、-redirオプションが動かないことがあります。
ゲストOSがWindows 98/Meのときは、winipcfg.exe、Windows 2000/XPがゲストでは、ipconfig /all、Linuxがゲストのときは、ifconfigにより調べられます。10.0.2.15もしくは10.0.2.16がもらえるはずです。プログラムのスタート時に、その値を設定する必要があります。
IPアドレスを手で入力するとルーティングテーブルは、

guest OS# Destination Genmask
guest OS# 10.0.0.0 255.0.0.0

DHCPだと、

guest OS# 10.0.2.0 255.255.255.0

上だと動きません。

もし、手で設定したい場合、

guest OS# modprobe ne2k-pci
guest OS# ifconfig eth0 10.0.2.16 netmask 255.255.255.0
guest OS# route add default gw 10.0.2.2 eth0

とします。
最初に接続する場合に、時間がかかることがあります。

ゲストOSでIPアドレスとルーティングテーブルが設定できていることを確認し、xinetdが稼動していることを確認します。

guest OS# ifconfig
guest OS# netstat -rn
guest OS# ps ax |grep xinetd

ホストOSから次のように打ち込みます。
注意:ホストがLinux (Fedora Core 4)の場合は、localhostのかわりにホストのネットワークカードのアドレスを使ってください。

host OS$ telnet localhost 5555
もしくは、
host OS$ telnet 192.168.0.2 5555

少し待つとtelnetのLoginプロンプトが現れると思います。

もし、ftpを使いたいときは、passiveモードを使ってください。

host OS$ qemu.exe -L ../pc-bios -hda redhat.img -tcp:5558:10.0.2.16:21

21番がftpの制御用ポートです。

ゲストOSのネットワークを設定した後、次のようにします。

host OS$ ftp
host OS$ ftp>open localhost 5558
host OS$ Name:
host OS$ Password:
host OS$ ftp>passive
host OS$ passive mode on.
host OS$ ftp>ls

ポートの設定のできないftpクライアントソフトがあります。ftpサーバに接続するのに時間がかかります。

sshのポートは-pオプションで設定できます。
注意:ホストがLinux (Fedora Core 4)の場合は、localhostのかわりにホストのネットワークカードのアドレスを使ってください。

host OS$ ssh localhost -p 5556
もしくは、
host OS$ ssh 192.168.0.2 -p 5556

UDPのポートを番号を変換することもできます。-redir udp:5560:10.0.2.16:117とか。

8. 注意

ホストOSで、インターネットを見れるかどうか確認してください。
使用できるソフトは、TCP/IP、UDP/IPをベースとしたソフトウェアです。ping、tracerouteといったソフトは、インターネットには使えません。
ゲストOSは、-redirオプションを使わなければ外部から侵入されることはありませんが、メールやブラウザを通して、ウイルスに感染する危険性はあります。OSを最新の状態に保ち、アンチウイルスソフトなどを使ってください。

9. ネットワークが動かないとき

9.1 インターフェースカードのチェック

ユーザーモードでのネットワークをサポートするQEMUは、ホストOSにとっては、単純なクライアントプログラムです。QEMU内のDHCPサーバーをもつ仮想ネットワークは、ホストのネットワークの構成とは関係がありません(DNSサーバーのアドレスを除いて)。

まず、NE2000ネットワークカードとQEMU内部のネットワークの動作をチェックするためゲストOSで仮想ルータにpingします。

[guest OS]$ ping 10.0.2.2

もし、反応が返ってこなければ、NE2000のIPアドレスを10.0.2.16に手動で設定して、もう一度pingをやってみてください。もし動けば、NE2000とドライバは正常です。
DHCPサーバからのIPアドレスの自動取得に問題があります。
プロバイダからもらったDNSサーバのアドレスを手動で設定してください。

もし、それでも動かない場合は、NE2000のドライバが合っていないかもしれません。QEMUを-isaオプションをつけて動かしてみてください。

[host OS] C:\qemu.exe -L ./pc-bios -hda linux.img -isa

それでも動かない場合、Realtek 8029のドライバで動くことがあります。

9.2 ホストOSがLinuxのとき

もし、ゲストOSがLinuxで、DHCPサーバーからdhcpcdやdhclientにより10.0.2.x というIPアドレスを受け取ることができていたら、問題は、パケットがQEMUから送れていないか、受け取れていないことです。

もし、ホストOSでrootになってtcpdumpを使えたら、次のようにチェックすることができます。
[host OS]# tcpdump -i eth0
もしくは
[host OS]# tcpdump -i eth1 (もし、2つネットワークカードを持っていたら)
もしくは、ホストーゲストネットワークを使う場合
[host OS]# tcpdump -i lo

そうしておいて、ゲストOSで何かプログラムを使います。
[guest OS]$ lynx http://----example-----/

接続状態が正常ならば、tcpdumpの何らかの出力を見ることができます。

9.3 ホストOSがWindowsのとき

ホストOSがWindowsのときは、ネットワークをチェックする簡単な方法は、pingを使う方法です。 ホストOSのネットワークカードのアドレスが192.168.100.2のとき、つぎのようにします。

[guest OS]$ ping 192.168.100.2

ICMP ping は、UDP パケットに変換されてホストOSのポート82 (XFER UTILITY) に送られます。 Linux はそれに応答しませんが、Windows はホストOSのときだけ応答します。ping は、インターネットには使うことができません。リモートホストは、通常応答しないからです。

10. 仮想ネットワークの内部

10.1 SLiRPのデバッグ

仮想ネットワークは、SLiRPとして知られているコードを使っています。もともとは、BSDで作られたもののようです。QEMUでは、ゲストOSから送られてきたパケットをIPパケットヘッダ、TCPパケットヘッダ、データのように分解し、ホストOSに通常のクライアントプログラムとして送ることで、ユーザーモードのネットワークを実現しています。ホストOSから受け取ったパケットは、逆に構成しなおしてゲストOSに送られます。

デバッグログは、slirp/slirp.cのslirp_init()で、

    //    debug_init("/tmp/slirp.log", DEBUG_DEFAULT);
のコメントアウトをはずすことで、c:\tmp\slirp.logにデバッグログが出力されます。
TCP/IPの通信が正常な場合、soreadでホストからパケットを受け取り、sbappendでパケットをホストに送っています。この2つが記録されているはずです。

10.2 送受信の流れ

TCP/IPの通信がゲストOSで始まると、
ne2000_ioport_write
qemu_send_packet
slirp_send_packet
slirp_input
ip_input
tcp_input
tcp_fconnect
の順番で関数が呼ばれ、ソケットが作られます。ソケットは非同期モード(FIONBIO)に設定されるため、select()関数を用いて、データが送信可能か受信可能かを判断してデータがあればsend()もしくはrecv()することになります。

main_loop() in vl.c 内でslirp_select_fill(),select(), slirp_select_poll()を呼ぶことにより、定期的にチェックされます。

データの送信は、
slirp_select_poll in slirp.c
tcp_input in slirp_select_poll() in slirp.c
sbappend in tcp_input.c:574
send in sbappend() in sbuf.c

データの受信は、
slirp_select_poll in slirp.c
soread in slirp_select_poll() in slirp.c
recv in soread() in socket.c
によってなされます。

データの受信があると、
tcp_output in slirp_select_poll() in slirp.c
ip_output
if_output
if_encap
slirp_output
slirp_fd_read
ne2000_receive
により、NE2000にデータが送られます。QEMUへのデータの入力なのですが、SLiRPから見るとデータのアウトプットになっているみたいです。

ソケットを閉じるのは、
tcp_close in tcp_subr.c
が呼ばれます。

struct socket in socket.h にソケットディスクリプタや状態(so_state)など、定義されていて、送受信の状態を保持しています。

UDP/IPの場合は、もう少し簡単です。TCP/IPが動けば多分動きます。パケットのヘッダがTCPかUDPかによって処理が異なるだけです。

その他、タイマーが用意されて、時間がくるとデータの送受信をしたりしてます。

-redirオプションが使われたときは、solisten、udp_listenという関数が使われてサーバーとして動作します。

11. WindowsゲストとWindowsホスト間でのファイル共有

1. ホストOSで、Explore内で共有したいフォルダ上で右クリックします。プロパティーを選び、共有というタブを選びます。
ネットワーク上でこのフォルダを共有する(S)というチェックボックスにチェックを入れ、ネットワークユーザーによるファイルの変更を許可する(W)というチェックボックスにチェックを入れます。共有名にはtmpなどと入力します。

2. ゲストOSで、Explore内でマイネットワーク上で右クリックします。ネットワークドライブの割り当て(I)を選びます。ドライブ名、たとえばE:を入力し、フォルダには、\\10.0.2.2\tmpと入力します。”tmp”というのは、ホストOSで設定したフォルダの共有名です。これで、ホストOSのフォルダがゲストOS上でドライブE:として使うことができます。

ホーム