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

对于习惯使用一种操作系统(例如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变量,则表示是在真实电脑或其它类型的虚拟机上运行。

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

  1. linux虚拟机上不了王,虚拟机上安装Linux时出现的问题及解决方法

    虚拟机上安装Linux时出现的问题及解决方法 1.在VMWare Workstation中RedHat Error: no usable disks had been found! 原来一般Linux ...

  2. 虚拟机上安装Linux时出现的问题及解决方法

    虚拟机上安装Linux时出现的问题及解决方法 1.在VMWare Workstation中RedHat Error: no usable disks had been found! 原来一般Linux ...

  3. 虚拟机上安装Ubuntu时遇到SQUASHFS错误解决办法:QUASHFS error: squashfsread_data failed to read block 0x3773d14e

    在虚拟机上安装Ubuntu20.04系统时,感觉已经安装的差不多了,但是屏幕上一直刷屏SQUASHFS error: squashfsread_data failed to read block 0x ...

  4. 在VMware虚拟机上使用网络测试命令找出虚拟机的IP地址

    第一种方式输入命令:ifconfig -a,然后回车,或者去掉 -a 也是可以的 第二种方式我们输入ip查询命名 ip addr 发现ens33 没有inet 这个属性,那么就没法通过IP地址连接虚拟 ...

  5. 如何安装虚拟机的集成服务器,如何在虚拟机上安装Hyper-V集成服务?

    提升虚拟机性能最简单的一种方式就是使用最新版本的微软Hyper-V集成服务.集成服务是功能与驱动的集合,允许客户操作系统使用虚拟硬件.对于虚拟化管理员来说,了解什么是集成服务,集成服务能做什么以及什么 ...

  6. [转]VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

    转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1985084.html VMWare提供了三种工作模式,它们是brid ...

  7. VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  8. vmware efi linux,图文详解在vmware11虚拟机上安装以EFI启动模式的win 10 technical preview系统-网络教程与技术 -亦是美网络...

    微软发布win10技术预览版后,很多同学都想尝试win10带来的新体验和新功能,但又苦于win10目前还是测试预览版本,在稳定性.兼容性方面还有待改进,即使我们愿意去当微软的小白鼠,但也不能用测试评估 ...

  9. 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配

    在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态. 网上有文章指出,解决这个问题的方法是在设备管理器中启动"Microsoft托管网络虚拟 ...

最新文章

  1. windows平台实现dll远程注入的简单例子
  2. requests 两种传参方式
  3. excel图表交互联动_如何使用高大上的多级联动交互式图表来分析人员结构?
  4. 深入浅出 JavaScript 内存管理,垃圾回收
  5. java基础——枚举
  6. HDU6168 Numbers
  7. 固态硬盘开卡软件_有一种软件号称能让固态硬盘速度飞起,到底靠不靠谱?
  8. Ev Dekorasyonu
  9. linux内核3,升级linux内核到3.10
  10. uniapp实现电子签名
  11. matlab 电路频率响应_频率响应法与matlab指令计算
  12. 数据结构习题及解析二
  13. XML与java对象互转文档
  14. antd 阿里图标库扩展a-icon 图标
  15. select函数使用方法
  16. 【ARMv8】异常级别的定义EL0、EL1、EL2、EL3
  17. 每日刷题记录 (十七)
  18. WIn 10 企业版激活
  19. 企业上云之服务器硬件篇(五)
  20. python变成拍照搜题软件_2020年中国大学MOOC的APP用Python玩转数据作业答案

热门文章

  1. 从共识算法开谈 - 硬盘性能的最大几个误解
  2. 每个程序员书柜必有的编程书籍
  3. html5 左边图片自动更换 右边字幕,☆视频片尾制作☆如何制作电影片尾,左边是彩蛋视频,右边是至下向上的滚动字幕...
  4. 5.29 C语言练习(计算数字个数:从键盘输入一串字符,输出字符串里的数字字符数。)
  5. 基于单片机的多功能电子密码锁系统设计
  6. css怎么设置图片卷角效果,CSS3 带分隔线卷角贴纸效果
  7. java文字手写识别_【手写文字识别】-JavaAPI示例代码
  8. (转)一位计算机牛人的心得,谈到计算机和数学,很实用
  9. 评联想收购IBM PC
  10. 人大金仓数据库添加substring_index函数