你的位置:首页 > 操作系统

[操作系统]虚拟机+桥接模式+Host

      相信有很多鞋童和我一个样是一枚Linux码农(我现在还是嵌入式方向). 做Linux开发势必需要一个Linux环境, 大多数开发者会首先选择一个Linux发行版, 其中Ubuntu LTS版本应该是选取最多的一个了, 原因也很简单,  该发行版简单易用的同时足够稳定和普及. 选择完发行版就要选择怎么安装了, 一批人会选择将linux系统直接安装在开发主机上来产生一个纯的Linux环境. 这种环境的优点是纯净和速度快, 不过也有一个明显的缺点:就是Windows上大多数好用的东西都与你无缘了. 为了充分利用windows和liunx两大系统各自的优势, 我想肯定会很有多人和我一样, 最终的选择是Win10(或Win7)主机+Virtualbox(或Vmware)虚拟机的搭配来实现双系统共用, 这种搭配在几年前有一个弊端是虚拟机的性能太差而导致有些人无法接受. 不过这个缺点在近几年已经没有了, 因为在 i5+固态盘+8G内存配置满天飞的今天, 硬件速度已经不再是问题, 加上CPU的虚拟化的支持以及虚拟机在3D方面的强化(安装增强工具包), 只要你不做linux游戏开发, 我想再说虚拟机速度慢就算是个人偏见问题了.

      使用windows+虚拟机搭配的一个小问题是在两个系统间切换并不那么的方便自然, 因为你每次进入虚拟机后键盘就被虚拟机独占了, 想要切回windows主机, 你得先按下一个切换键盘控制权的快捷键(virtualbox里是右边的Ctrl键). 像我这种嵌入式的linux开发人员几乎所有开发活动都是在终端里完成, 为了更加方便在windows和linux之间切换程序(同时也为了使用windows下我看着最顺眼的字体: Microsoft YaHei Mono, 小小的广告一下), 一个很自然选择便是通过 Xshell/Putty/SecureCRT 这类SSH登录软件来在windows上透过网络来登录虚拟机中的Ubuntu.

      用到了SSH, 那就必须配置好虚拟机的网络模式, 怎么配置虚拟机的网络模式就是今天主题了. Net模式肯定是不能用的(单通), 我想大多数小伙伴和我之前一样, 一直使用的模式肯定是桥接模式, 这种模式最大的优点是他的外在表现几乎和实际的网卡没有什么区别, 结果是虚拟机看起来就像是一台完全独立的PC主机插在了同一个路由器上一样. 不过这种模式还是有一些缺点, 其中最关键的缺点就是桥接模式的通畅与否取决于外部的路由是否通畅. 也就是说, 如果你的电脑的有线或无线网络没能正常的连接网络, 那么你的windows主机和Linux虚拟机将没法联通, 结果就是没有外网SSH就无法正常使用, 这也意味着如果你用笔记本在一个没有网络的环境中干活, 你将不能使用SSH登录虚拟机! 另一个缺点也是由这个关键的缺点引起的,  如果你的开发环境在一台笔记本上, 同时联网方式是wifi, 你正常的开了几个SSH连接来做开发, 中午吃饭或者晚上睡觉时, 你的想法将会是:不关机了吧, 一会来又要开机打开一堆软件, 麻烦! 于是你很开心的让电脑睡眠或休眠了, 下午或第二天开机唤醒你的老朋友时一个不太happy的事情可能会发生: 所有SSH连接都断开了, 于是你不得不一个一个的将SSH连接重新关闭再重新打开, 如果你没有用tmux的话, 那么更不爽事情也将会发生:所有你终端上所有打开的软件都关闭了!!! 好了, 我就是这种情况, 虽然我用了tmux, 但还是很不爽每次休眠都要重连SSH. 出现这种情况的原因也比较显而易见: 睡眠后wifi将有可能自动关闭(休眠后wifi必然会关闭), 当你重新启动后wifi将重连, 虽然重连后的ip一般不会变, 但这个连接已经不是睡眠之前的连接了, 对于SSH来说, 连接都变了, 它自然是会罢工的.

       这个问题我忍受了很久, 直接今天闲来无事, 想看看有没有解决办法, 在尝试了几次之后, 还真的找到了一个比较完美的解决办法:

  不论是virtualbox还是vmware, 都有一个网络模式叫Host-only, 这个模式特点是他自己在主机中虚拟一个网卡, 如果你安装了virtualbox, 那么"网络连接"中多出来的"VritalBox Host-only Network" 网卡就是它虚拟出来的网卡, 如果我们在虚拟机中配置使用host-only模式, 则虚拟机中网络将会连接到这个块虚拟的网卡上, 他的IP也将由这个虚拟网卡自动分配, 默认情况下这个host-only虚拟网卡主机IP地址是192.168.56.1, 分配给第一个虚拟机的地址一般是192.168.56.101. 由于虚拟网卡的存在, 在默认情况下的如果通过192.168.56.101去SSH连接虚拟机, 即便主机没有外网连接, 主机和虚拟机之间也总是互通的, 这就解决了上面提到了第一问题, 实现了在没有外网的情况下正常使用SSH登录虚拟机. 怎么样是不是小开心了一下, 更加令人兴奋的是由于该网卡是虚拟的, 因此即便是休眠也不会出现唤醒后断开网络重连的问题, 人家根本不会断开!!! 这又解决了上面提到了第二个问题!

  喔, 我想你肯定会问这个看起来IP比较独特的网卡应该没有外网连接能力吧, 没错, 这货的确不能直接连接外网! 但是, 有两个方法可解决这个问题: 第一个方法是如果你主机的真实网卡是有线网络, 那么可以过在网卡的属性中设置共享网络来解决. 不过这个方法对wifi网卡无效. 第二个方法就比较通用了, 也是像我这种使用笔记本+wifi的唯一解决方法: 在你虚拟机配置项中额外勾选增加第二个网卡, 将其设置为桥接模式! 这样一来启动虚拟机之后Ubuntu将拥有两个连接, 一个是host-only获得的IP,它几乎是固定的192.168.56.101, 另一个则是在外网通畅的情况下外网路由器DHCP分配的IP. 这两个IP都很有用, 192.168.56.101可以用来实现无论何时Windows都可以通过SSH连接虚拟机的需求, 同时由于这个ip比较固定, 因此的SSH软件完全可以写死配置中的IP地址为192.168.56.101, 另外由于这个网卡只和本地主机有关, 因此访问速度永远都是杠杠滴. 第二个IP是从路由器那里得来IP, 用处就和单独的桥接网络一样了, 你访问外网将自动使用这个IP, 同一个路由器局下的域网络中的设备对虚拟机主机访问也可以通过这个IP来实现, 因此, 诸如 FTP/NFS等嵌入式开发需要用到的常用开发方法都是可以正常进行的.

  怎么样, 大声的告诉我, 这个方案完不完美?!