相信有很多鞋童和我一个样是一枚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的话, 那么更不爽事情也将会发生:所有你打开的vim都关闭了!!! 好了, 我就是这种情况, 虽然我用了tmux, 但还是很不爽每次休眠都要重连SSH. 出现这种情况的原因也比较显而易见: 睡眠后wifi将有可能自动关闭(休眠后wifi必然会断电关闭), 当你重新启动后wifi将重连, 虽然重连后的ip一般不会变, 但这个连接已经不是睡眠之前的连接了, 对于SSH,连接都变了, 自然是会罢工的.

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

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

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

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

虚拟机+桥接模式+Host-only模式 搭建完美的Windows下Linux开发环境的更多相关文章

  1. Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]

    Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2] 2015-07   北京海淀区  ...

  2. windows下STM32开发环境的搭建

    一.概述 1.说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改 ...

  3. windows下vue开发环境的搭建

    一 介绍: vue.js是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库 ...

  4. Windows 下 Ionic 开发环境搭建

    Ionic 介绍 首先,Ionic 是什么. Ionic 是一款基于 Cordova 及 Angular 开发 Hybrid/Web APP 的前端框架,类似的其他框架有:Intel XDK等. 简单 ...

  5. NDK在windows下的开发环境搭建及开发过程

    在Android应用的开发工程中,不管是游戏还是普通应用,都时常会用到.so即动态链接库,关于.so是什么玩意儿,有什么好处,这个大家可以在网上查一下,本人不做过多解释..so本是linux下的文件类 ...

  6. 环境搭建文档——Windows下的Python3环境搭建

    前言 背景介绍: 自己用Python开发了一些安卓性能自动化测试的脚本, 但是想要运行这些脚本的话, 本地需要Python的环境. 测试组的同事基本都没有安装Python环境, 于是乎, 我就想直接在 ...

  7. windows下android开发环境搭建

    JDK的安装和Java环境变量的设置 1 JDK下载地址 JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.h ...

  8. Windows下PHP开发环境搭建

    PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...

  9. windows下php开发环境的搭建

    环境搭建软件组合为:Apache2.2.9+mysql5.2.32+php5.2.6  下载地址如下 http://download.csdn.net/detail/xttxqjfg/5670455 ...

随机推荐

  1. Java web servers 间是如何实现 session 同步的

     Java web servers 间是如何实现 session 同步的 有一个多月的时间没有更新博客了,今天终于忙里偷闲,可以把近期的收获总结一下. 本文是关于Java web servers 之间 ...

  2. pip install python 如何快速安装模块

    之前python安装模块要在网络上下载,从python2.7.9之后,以及python3,python就自带pip 这个命令,能够快速的安装模块 1,  首先打开python的主文件夹 2.在主文件夹 ...

  3. 防止fixed元素遮挡其他元素的方法

    有多个页面,有的有固定的头部(设置了postion:fixed的元素),有的没有固定的头部,这时就有个问题,有固定头部的页面,头部会遮挡下面的内容,那怎么解决呢? <!DOCTYPE html& ...

  4. 转: 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用 ...

  5. Swing-setBounds()用法-入门

    先看API: public void setBounds(Rectangle r) 移动组件并调整其大小,使其符合新的有界矩形 r.由 r.x 和 r.y 指定组件的新位置,由 r.width 和 r ...

  6. java第十三次作业

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相内关容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  7. Junit4学习(三)Junit运行流程

    一,验证Junit测试方法的流程 1,在test/com.duo.util右键,新建测试类 2,生成后的代码: package com.duo.util; import static org.juni ...

  8. 生成/etc/shadow文件中的密码

    shadow文件的格式就不说了.就说说它的第二列--密码列. 通常,passwd直接为用户指定密码就ok了.但在某些情况下,要为待创建的用户事先指定密码,还要求是加密后的密码,例如kickstart文 ...

  9. 随便讲讲我对于svn和git的想法

    1.SVN是集中式版本管理工具,而Git是分布式版本管理工具,这是核心区别. 二者都有集中的库,只是git偏向于分布式,用户可以再自己电脑上克隆一份自己的库,即使在断网的情况下也能够查看版本,创建分支 ...

  10. Java 异常机制

    Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...