`
isiqi
  • 浏览: 16084906 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

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

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

分享到:
评论

相关推荐

    vs2012 x64远程调试工具

    5> [配置属性]à[调试]选项中:[要启动的调试器]为远程Windows调试器;[远程命令]为可执行文件路径;[工作目录]为可执行文件所在目录;[远程服务器名称]为远程计算机名或IP地址;[连接]为不带身份验证的远程访问。 ...

    LogicLog Adb.exe

    就只有在虚拟机上安装的时候用过 logcat adb logcat 捕获设备的日志信息,但是,直接使用logcat将会捕获到很多无关的信息,可以通过 adb logcat -s Unity 来专门获得Unity相关的日志,注意,命令区分大小写的,...

    海蜘蛛软路由宽带叠加双倍网速

    由于虚拟机使用桥连模式和主系统连接,相当于主系统和虚拟机的网卡都接在同一 HUB 下面,故只要把主系统的 IP 地址改为和路由在同一网段即可,默认路由系统的局域网IP为 192.168.0.1,则将本地网络的IP地址改为 192....

    VS2008开发WinCE6.0应用(组件) -Part1/5

    VS2008开发WinCE上的应用时,只能先到Windows Mobile 5.0, 而无法选到Windows Mobile 6.0, 找了些资料,为便于自己以后使用资源做个记录 我的环境 Win7(Enterpise en) + VS2008(CHS) + VS2008 SP1(不用VS2008中文版...

    android系统原理及开发要点详解_韩超_梁泉 4

     第14章“Android应用程序的主要方面”,介绍Android应用程序层开发的各个方面,基本上是横向内容,包括应用程序的基本控制、各种UI元素的使用、图形API使用3个方面的内容。  第15章“Android应用程序的设计思想”...

    android系统原理及开发要点详解_韩超_梁泉 1

     第14章“Android应用程序的主要方面”,介绍Android应用程序层开发的各个方面,基本上是横向内容,包括应用程序的基本控制、各种UI元素的使用、图形API使用3个方面的内容。  第15章“Android应用程序的设计思想”...

    新版Android开发教程.rar

    � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...

    ARM 嵌入式LINUX 系统构建与驱动开发

    买板子可以把注意力集中在软件开发上,软件开发(尤其是驱动)可以不必担心自己硬件上的问题,我就是以便调试一边写驱动和程序,每次写驱动前就要先确认硬件没问题。 另外,买板子更省钱和时间,我自己做的板子,...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    Android应用程序开发教程PDF电子书完整版、Android开发学习教程

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    在IT项目管理、软件开发、系统管理和网络管理方面都有非常丰富的实践经验。曾发表过多篇计算机专业论文,并翻译过多部计算机专业技术书籍。  李文娟,中国石油大学(华东)硕士,现供职于国家行政学院,工作后一直...

    计算机网络安全技术:使用Phpstudy搭建php运行环境.pdf

     到官方网站上下载使用phpstudy ,根据计算机的配置情况,虚拟机的系统, 选择合适的版本。 Phpstudy 2018版本比较省硬件资源,同时内置了多个版本的php 和web服 务器可以直接使用,无须再去联网下载,如果使用...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    安卓(Android)程序开发初级教程技术文档【视频+教程+源码】

     + Application framework: 可重用的和可替换的组件部分,在这个层面上,所有的软件都是平等的。  + Dalvik virtul machine: 一个基于Linux的虚拟机。  + Integrated browser: 一个基于开源的WebKit引擎的浏览器...

    Android高级编程--源代码

     ◆与电话和网络硬件相关的所有内容,如电话api、sms和网络管理等  ◆高级开发主题,包括安全、ipc以及一些高级图形和用户界面技术  读者对象  本书面向希望在android手机平台上创建应用程序的所有人员。不管是...

    Tcl_TK编程权威指南pdf

    尽管它是个商用软件包,但你也可以在Internet上找到它(见第VII页),而且可以在自己的应用程序中自由使用这个软件包。Tcl解释器已经从Unix平台移植到了DOS、Windows、OS/2、NT以及Macintosh环境中,而TK工具包也从X ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    除在保密期内的保密论文和在技术保护期限内的论文外,允许论文被查阅和借阅,可以公布(包括以电子信息形式刊登)论文的全部内容或中、英文摘要等部分内容。论文的公布(包括以电子信息形式刊登)授权东南大学研究生...

    c#学习笔记.txt

    (但是请注意:两个不同但结构上等效的委托类型的实例可能会比较为相等),准确地说,两个具有相同参数列表、签名和返回类型的不同的委托类型被认为是不同的委托类型。委托实例所封装的方法集合称为调用列表。 5, ...

    寒江独钓-Windows内核安全编程(高清完整版).part1

    1.2.3 在虚拟机中运行 9 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows XP 调试执行 10 1.3.3 设置Vista调试执行 11 1.3.4 设置VMWare的管道虚拟串口 11 1.3.5 设置Windows内核符号表 13 1.3.6 ...

    寒江独钓-Windows内核安全编程(高清完整版).part7

    1.2.3 在虚拟机中运行 9 1.3 调试内核模块 9 1.3.1 下载和安装WinDbg 9 1.3.2 设置Windows XP 调试执行 10 1.3.3 设置Vista调试执行 11 1.3.4 设置VMWare的管道虚拟串口 11 1.3.5 设置Windows内核符号表 13 1.3.6 ...

Global site tag (gtag.js) - Google Analytics