QEMUは、ユーザーモードでのネットワークの使用をサポートしています。ホストOSで、root権限もしくは、Administrator権限を持つユーザーでなくても、インターネットのホームページを見たり、ftp、sshといったソフトウェアを使うことができます。
-redirオプションを使って、ホストOSからゲストOSに接続する場合だけ、root権限もしくはAdministrator権限が必要です。
-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バスのネットワークカードを使う。
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
バージョン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)
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 4irqは、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
ルーターが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のプロパティから設定します。
バージョン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のホスト上でも同じです。
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
Redhat1 guest>ifconfig eth0 10.0.2.16 Redhat2 guest>ifconfig eth0 10.0.2.17
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
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の間で通信ができなくなります。
--------------------------------------
| | |
| | |
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
Redhat1 guest>ifconfig eth0 10.0.2.16 Redhat2 guest>ifconfig eth0 10.0.2.17 Redhat3 guest>ifconfig eth0 10.0.2.18
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
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
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
Redhat2 guest> ifconfig eth0 192.168.10.3 Redhat2 guest> route add default gw 192.168.10.2 eth0
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
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
Redhat1 guest> dhcpcd eth0 (もしくは dhclient eth0)
Redhat2 guest> ifconfig eth0 10.0.2.17 Redhat2 guest> route add default gw 10.0.2.2 eth0
Write failed: Connection reset by peer.
ssh_exchange_identification: read: Connection Reset by peer.
TCP (-net socket,listen and -net socket,connect)を使う利点は、信頼性にあります。UDP (-net socket,mcast)が使われるときは、ゲストOSのネットワークスタックがその役割を負います。
TCPを使う場合の欠点は、-net socket,listenをつかったゲストOSがクラッシュすると、残されたゲストOS同士で通信できなくなることです。-net socket,mcastを使った場合、その心配はありません。
バージョン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
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)
最初は、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)
ルーティングテーブルを確認します。
[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 のアドレスが割り当てられます。
仮想インターフェースが動作しているかどうか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 は、うまく動かないみたいですが、問題ありません。
私のホストの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 サービスは、使用後必ず停止してください。セキュリティーホールになりえますので。
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 になっています。
その他のプログラムも使えます。
/etc/modules.conf に次のような項目を付け加えます。
alias eth0 ne
options ne irq=9 io=0x300
/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
ゲストOSを再起動してスタートアップ時に次のような表示が出れば、OKです。
Bringing up interface eth0: [ OK ]
-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へファイルを転送することはできません。
プログラムの起動時に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とか。
ホストOSで、インターネットを見れるかどうか確認してください。
使用できるソフトは、TCP/IP、UDP/IPをベースとしたソフトウェアです。ping、tracerouteといったソフトは、インターネットには使えません。
ゲストOSは、-redirオプションを使わなければ外部から侵入されることはありませんが、メールやブラウザを通して、ウイルスに感染する危険性はあります。OSを最新の状態に保ち、アンチウイルスソフトなどを使ってください。
ユーザーモードでのネットワークをサポートする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のドライバで動くことがあります。
もし、ゲスト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の何らかの出力を見ることができます。
ホスト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 は、インターネットには使うことができません。リモートホストは、通常応答しないからです。
仮想ネットワークは、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の通信がゲスト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という関数が使われてサーバーとして動作します。
1. ホストOSで、Explore内で共有したいフォルダ上で右クリックします。プロパティーを選び、共有というタブを選びます。
ネットワーク上でこのフォルダを共有する(S)というチェックボックスにチェックを入れ、ネットワークユーザーによるファイルの変更を許可する(W)というチェックボックスにチェックを入れます。共有名にはtmpなどと入力します。
2. ゲストOSで、Explore内でマイネットワーク上で右クリックします。ネットワークドライブの割り当て(I)を選びます。ドライブ名、たとえばE:を入力し、フォルダには、\\10.0.2.2\tmpと入力します。”tmp”というのは、ホストOSで設定したフォルダの共有名です。これで、ホストOSのフォルダがゲストOS上でドライブE:として使うことができます。