在虚拟机上调试网络时要注意的内容

在虚拟机上调试网络时要注意的内容

 

对于习惯使用一种操作系统(例如Windows XP)的用户来说,虚拟机产品无疑是调试用于其它系统环境的软件的好工具。常见的个人用虚拟机产品主要是 VMware Workstation 和 Microsoft 从 Connectix 那里买来的 Virtual PC (所以Connectix VPC也算这个一类),高端的 GSX Server 和 Virtual Server 我没用过,但道理上应该是一样的。

在网络设置方面 VPC 和以前的版本比变化不大(还是一样的简陋),而 VMW 早先的版本是不象现在那样可以让用户自己设置那么多的(Virtual Network Manager 好像是 3.0 还是 4.0 才有的,我对 2.0 版本的印象太深所以记不清楚了),所以下面的内容主要针对 VMW 4.x 和 VPC 2004 SP1。

虚拟机客户系统的网卡模式

先从虚拟机上客户系统的网卡模式说起。这两种虚拟机上,客户系统可用的虚拟网卡模式都是三种:

  • 桥接:VMW 的选项叫 Bridged、VPC 上是那个真实网卡的名字;
  • 共享:VMW 是 NAT、VPC 上是 Shared;
  • 仅限宿主:两个都叫 Local only。

三种设置方式中,仅限宿主方式没什么好说,也用得不多,但是桥接和共享两种就值得根据实际需要来选择了。

桥接方式简单说可理解为虚拟机在逻辑上和宿主机为并列的关系,仿佛虚拟机是直接连接到宿主机所在的网络设备上一样,换句话说,虚拟机、宿主机、和宿主机网络里的其它电脑或网络设备三者是在同一个网络里。

共享方式,从与桥接相比较的角度来说,可理解为宿主机是虚拟机和外部网络之间的一个网关,宿主机的物理网卡和宿主机网络里的设备在一个网络里,宿主机上另外有个虚拟网卡和虚拟机则在另外一个网络里,虚拟机访问外部的网络时,宿主机从这个虚拟网卡上收到的请求进行 NAT 转换,再从物理网卡发到外部网络,反方向也是一样。

在进行 PPPoe 拨号时,必须将虚拟机网卡设为桥接的方式。如果设成共享方式再拨号——用个不准确的例子来比喻,就仿佛用自己的电脑去拨局域网上另一台机器上的 modem 那样——虽然想得很方便,但实际不行。

实际中,使用共享方式还是桥接方式都能使宿主机成为和外界网络相联系的网关,问题是看怎么配置。共享方式的便利是实现网关功能的服务提供者是虚拟机产品本身的组成部分,而桥接方式时这个功能就要由不属于虚拟机产品组成部分的其它软件或设备来提供了。如果仅仅是需要路由功能,通常宿主系统(例如 XP)能够满足需要,但是稍微复杂点的需要,例如 DHCP,XP 就不能满足了。所以通常情况下,建议为客户系统选共享方式。

VMW 的 NAT Service 和 DHCP Service

如果你在宿主机的外部网络上有个 DHCP 服务器,你就能发现这桥接和共享两种方式的区别了:桥接时虚拟机能直接从这个 DHCP 服务器上获得 IP 地址(通常是和宿主机物理网卡的 IP 地址在同一网段上),而共享时在正常情况下(指宿主机上没开 DHCP Relay 服务的话),虚拟机根本无法找到外部的 DHCP 服务器。

所以在共享方式时,要想使用 DHCP 为虚拟机提供 IP 配置,只有两个办法:一个是宿主上开 DHCP Relay,把虚拟机的 DHCP 请求转到外边的 DHCP 服务器上(注意,NAT 是不能转发 BOOTP 和 DHCP 请求的,NAT 对 ICMP、TCP、UDP 这样的协议管用,但是 BOOTP 不行,这时候虚拟机连 IP 地址都没有,还怎么 NAT ?);另一个办法就是在这个虚拟网络里设置一台 DHCP 服务器——VMW 和 VPC 就是这样,它们由自己的组件专门为这个虚拟网络提供 DHCP 服务。这就是安装 VMW 后系统服务里会在多出来个 VMware NAT Service 的同时还多出来个 VMware DHCP Service 的原因。在 VPC 里其实也有这两个东西,只不过不是作为系统服务来安装的。

忘了从那个版本起,VMW 的编辑菜单里有了那个 Virtual Network Settings 项,现在的版本还把启动这个 vmnetcfg 程序的快捷方式放在了程序组里(2.0 时用户可以编辑一个名字也差不多的文本文件来调整 DHCP 的配置)。这个改进实在是让 VMW 的网络方面的功能大大地强过 VPC 。用这个东西就可以配置 VMW 的 DHCP 和 NAT 服务。

目前版本下这个 VM DHCP 服务其实没什么好配置的。需要的话可以变化一下各个虚拟网卡的子网、调整一下 DHCP 服务的 IP 地址范围(网段变不了,只能变主机部分)。

NAT 服务的设置倒是有时需要略微调整一下,例如有时可能需要为客户机上的服务加些 Port Forwarding,还有时需要在这里额外加上些互联网上的 DNS 服务器等等。具体的设置还是看 VMW 的帮助比较好。VPC负责DHCP Server功能的部分不允许自己设置DNS服务器,它的DNS服务器地址是直接使用绑定了Virtual Machine Network Service服务的那个物理网卡的IP配置中的DNS服务器地址,因此如果本地连接的IP地址是通过DHCP分配的,则要注意保证同时分配的域名服务器地址也是有效的,也可直接手工指定那个物理网卡IP配置中的域名服务器,否则可能导致在虚拟机里访问域名时解析失败(这个我自己遇到过好几次)。

在 VPC 上使用 VMware 的网络功能

VMW 至少在网络功能上无疑比 VPC 更强大,但是大多数时候我更喜欢用 VPC。它更快些,细节方面更便于使用,比如能方便地暂停虚拟机,VMW 要等半天;没装辅助工具时,VMW 在捕获键盘输入时也会捕获鼠标,必须要按 Ctrl-Alt 才能释放,VPC 就不用;还有 VPC 能方便地把客户机屏幕上的文本复制出来……所以这部分是为用着舒服写的。

同时安装了 VMW 和 VPC 时,打开宿主机的网络连接文件夹,在显示出的各个 VMnet 网卡的属性中钩选 Virtual Machine Network Service 那个服务,绑定后这个 VMnet 网卡就能出现在 VPC 的网卡菜单里了。VPC 其实是以桥接的方式来使用这个网卡的,所以真正的方式是由在 VM 虚拟网络配置中对这个网卡指定的工作方式来使用的。

我从 VMW 4.0 升级到 4.5 后发现 VPC 里找不到原来的 VMnet8 网卡了,后来才发现升级后原有的几个 VMnet 网卡的属性中都没有绑定 VPC 的网络服务,改了就好了。

不过有一点要注意,就是如果同时使用 VPC 和 VMW 的话(例如在用 Ghost 在两种虚拟机间复制硬盘时),应该分别为它们创建不同的 VMnet 虚拟网卡,不然两个会打架。

防火墙的问题

在虚拟机上调试网络应用时还要特别注意防火墙软件(XP SP2的Windows防火墙也算)的设置,无论是桥接方式还是共享方式。而且在配置防火墙时,更要耐心地注意每个物理的和虚拟的网卡上防火墙的设置。

除非特别必要,或者网络的逻辑结构实在复杂、而你需要集中精力去解决别的问题,否则无论什么情况,都不推荐完全关闭防火墙软件。

通常可以考虑选择地关闭虚拟机网卡的防火墙,再对本地连接和可能涉及的拨号连接分别适当地建立例外规则。一般情况采用这种步骤还是能兼顾安全性和方便性地解决防火墙造成的问题的。

总之除非特别需要,不要关闭防火墙或禁用本地连接上的防火墙,拨号连接更要谨慎。

关于虚拟机的其它方面的问题

虚拟机环境下网络的设置要注意的因素很多,但是没什么难懂的内容,遇到问题需要仔细分析。有时候虚拟机软件的版本升级也会会引起麻烦。

还一个例子是用 Ghost 在 VMW 和 VPC 之间复制虚拟机硬盘时,升级到 4.5 的总是出错,查了半天才发现因为升级到 4.5 后 VMW 的优先级设置被设为高优先级了,导致 VPC 老抢不到 CPU,从而造成没时间响应网络请求——这个例子的意思是有时候麻烦出在意想不到的地方。

关于Qemu

严格说,Qemu还没有复杂到能被算得上一个虚拟机宿主,而只是个仿真器,然而Qemu确实可以用来当虚拟机宿主用。

但是DJGPP的默认DPMI服务器CWSDPMI 0.9r5在目前的Qemu 0.8核心上似乎不能正确提供服务,在试图运行许多需要DPMI支持的程序时(例如Symantec Ghost,以及其它用DJGPP和DJGPP2编译的基于包驱动的TCP/IP应用程序),总是得到“Load error: no DPMI selectors”这样的错误,这种现象在VMW和VPC上没有出现过。不清楚导致该问题的具体原因,但EMM386这类内存仿真程序能在Qemu上仿真出多达190K的UMB来,我觉得这其中应该有一定联系。另外一个问题是如果在加载EMM386时使用HIGHSCAN参数会导致挂机,相信这两个问题都和Qemu核心的内存仿真部分有关。

作为权宜的方法,可以使用HX DOS Extender中的HDPMI32代替CWSDPMI为应用程序提供DPMI服务。可以在Qemu上用命令行

loadhigh HDPMI32.exe -r

将HDPMI32加载在UMB中(Qemu提供的UMB那么大,确实有好用的地方)。这样解决后就可以象在其它环境中一样运行这些需要DPMI支持的程序了。

如何在批处理文件中检测出上述几种虚拟机宿主?

我的办法是用下面这个文件,它利用pciscan检测虚拟机的PCI控制器返回的cpu、pci控制器及虚拟显卡几个基本上不会缺少或变化的部件的信息来判断是哪种虚拟机宿主。要注意的是,这只能对付模拟了pci控制器的虚拟机宿主环境,对没有pci控制器(例如仅模拟ISA架构的qemu配置)则无效。再有就是如果某台真正的电脑的cpu、pci控制器和显卡完全和某种虚拟机上的型号一致,那就会搞错。因此这个方法仅供参考:

@if .%debug%==. echo off
if .%ramdrive%==. goto _no_ramdrive
for %%f in (%path%) do if exist %%f/pciscan.exe goto _ok_pciscan
echo %0: requires pciscan.exe in path.
goto _eof

:_ok_pciscan
for %%f in (%path%) do if exist %%f/xgrep.com goto _ok_xgrep
echo %0: requires xgrep.com in path.
goto _eof

:_no_ramdrive
echo %0: RAMDRIVE variable has not been set.
goto _eof

:_ok_xgrep
for %%f in (%path%) do if exist %%f/lmod.com goto _ok_lmod
echo %0: requires lmod.com in path.
goto _eof

:_ok_lmod
set $=%ramdrive%/$
pciscan -v>%$%
echo @echo off>%$%.bat
: data for vpc
xgrep -cy "8086 7192 .+CPU/PCI" %$%|lmod /l1 set vm1cpu=[]>>%$%.bat
xgrep -cy "8086 7110 .+PCI/ISA" %$%|lmod /l1 set vm1pci=[]>>%$%.bat
xgrep -cy "5333 8811 .+VGA" %$%|lmod /l1 set vm1vid=[]>>%$%.bat
: data for vmw
xgrep -cy "8086 7190 .+CPU/PCI" %$%|lmod /l1 set vm2cpu=[]>>%$%.bat
xgrep -cy "8086 7191 .+PCI/PCI" %$%|lmod /l1 set vm2pci=[]>>%$%.bat
xgrep -cy "15AD 0405 .+VGA" %$%|lmod /l1 set vm2vid=[]>>%$%.bat
: data for qemu
xgrep -cy "8086 1237 .+CPU/PCI" %$%|lmod /l1 set vm3cpu=[]>>%$%.bat
xgrep -cy "8086 7000 .+PCI/ISA" %$%|lmod /l1 set vm3pci=[]>>%$%.bat
xgrep -cy "1013 00B8 .+VGA" %$%|lmod /l1 set vm3vid=[]>>%$%.bat
:
if exist %$%.bat call %$%.bat
for %%f in (%$% %$%.bat) do if exist %%f del %%f
set vmhost=
if not .%vm1cpu%==.0 if not .%vm1pci%==.0 if not .%vm1vid%==.0 set vmhost=VPC
set vm1cpu=
set vm1pci=
set vm1vid=
if not .%vm2cpu%==.0 if not .%vm2pci%==.0 if not .%vm2vid%==.0 set vmhost=VMW
set vm2cpu=
set vm2pci=
set vm2vid=
if not .%vm3cpu%==.0 if not .%vm3pci%==.0 if not .%vm3vid%==.0 set vmhost=QEMU
set vm3cpu=
set vm3pci=
set vm3vid=
if not .%vmhost%==. echo Virtual Machine type is %vmhost%.

:_eof
set $=

把它保存为vmdetect.bat,并且保证路径中能访问pciscan.exe、lmod.com和xgrep.com这几个工具程序,需要测试时call vmdetect,然后检查vmhost环境变量的值即可(要注意大小写)。这里是用VMW、VPC、QEMU分别表示VMware Workstation、Microsoft Virtual PC 2004和Qemu,如果调用该批处理后没有设置vmhost变量,则表示是在真实电脑或其它类型的虚拟机上运行。 

你可能感兴趣的:(在虚拟机上调试网络时要注意的内容)