在虚拟机上调试网络时要注意的内容
对于习惯使用一种操作系统(例如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 服务。
目前版本下这个 VMDHCP 服务其实没什么好配置的。需要的话可以变化一下各个虚拟网卡的子网、调整一下 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变量,则表示是在真实电脑或其它类型的虚拟机上运行。
分享到:
相关推荐
在使用AGPVirtualKD0.3进行双机调试时,开发者需要注意以下几点: - **兼容性检查**:确保工具与目标TX游戏兼容,并且能成功在虚拟机环境中运行。 - **安全风险评估**:虽然工具可能有助于调试,但绕过游戏的安全...
在IT行业中,西门子的TIA博途(Totally Integrated Automation Portal)是一款广泛使用的集成自动化软件,用于设计、编程和调试西门子...在实际操作中,务必注意网络设置的准确性,以及虚拟机软件和驱动程序的兼容性。
这种虚拟机软件允许用户在Windows操作系统上运行Android系统,从而实现对Android应用的调试、测试、学习或娱乐目的。这尤其适合那些没有Android设备或者需要同时处理多个Android版本的开发者。 描述中的“安卓系统...
在IT领域,尤其是网络管理和虚拟化技术中,有时我们需要更改虚拟机的MAC地址,这可能是为了避免IP地址冲突,或是为了进行网络设备的测试与调试。下面将详细介绍如何修改虚拟机的MAC地址,而无需重新绑定IP地址。 ##...
值得注意的是,调试过程中可能需要对Windows的安全设置进行调整,例如开启调试模式,以及在虚拟机的BIOS设置中启用串行端口模拟,以便在需要时使用备用的调试方式。 总结起来,VirtualKD-3.0是Windows开发和维护...
这个"ROS3.2 虚拟机版"是ROS在虚拟机环境中的一个预配置版本,特别适合那些想要快速进入ROS开发而不想在本地系统上进行复杂安装的人。 VMware Workstation是一款流行的虚拟机软件,它允许用户在一台物理计算机上...
在实现可逆调试的具体技术手段中,虚拟机的日志记录通常包括以下内容:程序计数器(PC)值、内存内容、寄存器状态、I/O操作、系统调用参数、中断处理记录等。这些信息被定时或按特定事件触发记录下来。回放时,...
Ubuntu虚拟机是一种在Ubuntu操作系统上运行的虚拟环境,它允许用户在同一台计算机上同时运行多个操作系统实例。这里我们将详细介绍如何安装和配置Ubuntu虚拟机,以及如何利用Samba服务在Windows和Ubuntu之间共享文件...
虚拟机技术是现代计算机科学中的一个重要组成部分,它允许我们在一台物理机器上运行多个独立的、完整的操作系统实例。在本文中,我们将重点讨论标题为“虚拟机 win10 可用”以及标签为“VPC”的虚拟机软件。该软件...
### 超详细双机调试环境...此外,需要注意的是,在实际操作过程中可能会遇到各种问题,比如网络连接不稳定、调试器不响应等,这时需要根据具体错误信息进行排查。同时,也可以参考官方文档或社区资源来获取更多支持。
它通过利用VMware平台创建了一个预装有TIA博途软件的虚拟机镜像,使得用户能够在任何支持VMware的平台上轻松地安装和使用博途软件进行编程、调试等工作。 ### 虚拟机制作环境与兼容性 1. **制作环境**:该虚拟机是...
### Vmware虚拟机进入BIOS方法 在虚拟化技术中,Vmware是一款非常流行的工具,它可以帮助用户在一台物理机器上运行多个操作系统作为独立的...在日常维护虚拟机或进行系统调试时,掌握这些技巧能够大大节省时间和精力。
在使用虚拟机时,用户需要注意以下几点: 1. 硬件要求:虚拟机需要足够的硬件资源,包括CPU、内存和磁盘空间。Vista本身是一个资源消耗较大的系统,因此在Vista上运行虚拟机需要更高的硬件配置。 2. 性能调整:...
通常,它会包含设置虚拟机、安装操作系统、配置网络、挂载设备以及部署和调试应用程序的步骤。遵循这些说明是成功进行虚拟机嵌入式开发的关键。 5. **开发流程**: - **环境配置**:安装虚拟机软件,导入或创建...
- **仅主机模式**适用于需要将虚拟机与外部网络隔离,进行特殊网络调试的场景。 理解并正确选择合适的网络模式对于虚拟机的有效使用至关重要。无论是开发、测试还是学习,正确的网络配置都能显著提高工作效率。
使用SocketTest进行网络编程调试时,有几个关键步骤需要注意: 1. **配置连接**:首先,你需要设置SocketTest为客户端模式,指定目标服务器的IP地址和端口号。如果要测试服务器端代码,可以将SocketTest设置为...
对于需要跨平台开发的程序员来说,Cygwin提供了一种在Windows系统上测试和调试Linux代码的途径。同时,它也适合那些习惯了Linux命令行界面但又必须在Windows环境下工作的用户。通过Cygwin,用户可以利用Windows的...
### 虚拟机(Linux)与ARM开发板网卡通信技术详解 #### 一、概述 本文将详细介绍如何在...这对于在开发环境中测试和调试网络应用具有重要意义。此外,本文提供的配置方法也为未来类似的网络设置提供了一种参考模板。
在进行软件开发的过程中,有时候我们需要在特定的操作系统上进行编程或调试。特别是在处理一些较早的系统时,比如DOS,由于其特殊性,直接在现代硬件上运行可能会面临诸多困难。本文将详细介绍如何在VMware虚拟机...