相信有很多鞋童和我一個樣是一枚Linux碼農(我現在還是嵌入式方向). 做Linux開發勢必需要一個Linux環境, 大多數開發者會首先選擇一個Linux發行版, 其中Ubuntu LTS版本應該是選取最多的一個了, 原因也很簡單, 該發行版簡單易用的同時足夠穩定和普及. 選擇完發行版就要選擇怎麼安 ...
相信有很多鞋童和我一個樣是一枚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等嵌入式開發需要用到的常用開發方法都是可以正常進行的.
怎麼樣, 大聲的告訴我, 這個方案完不完美?!