一、開發環境
- 系統:OSX 10.10.5
- vagrant版本:vagrant1.7.4
- 虛擬機器box:vagrant-centos-6-7.box
本人使用vagrant搭建了centOS6.7虛擬機器開發環境,用作web開發。mac電腦選用公司的網線上網,也就是使用網路卡“en0: 乙太網”。
但最近碰到一個棘手的問題。
注:關於vagrant搭建可以參考github:https://github.com/astaxie/Go…
二、問題描述
想選擇橋接模式讓虛擬機器上網,於是在mac端編輯Vagrantfile,新增 config.vm.network “public_network”,並將其他的network設定註釋掉。vagrant up啟動虛擬機器之後,看到如下的輸出:
Bringing machine `default` up with `virtualbox` provider...
==> default: Clearing any previously set network interfaces...
==> default: Available bridged network interfaces:
1) en0: 乙太網
2) en1: Wi-Fi (AirPort)
3) en2: Thunderbolt 1
4) en3: Thunderbolt 2
5) p2p0
6) awdl0
7) bridge0
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
default: Which interface should the network bridge to?
因本人使用網線上網,於是選擇了1) en0: 乙太網,選擇1之後看到如下輸出(後面還有很多報錯省略了):
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: bridged
/opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/util/subprocess.rb:28:in `encode`: "xE4" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/util/subprocess.rb:28:in `block in initialize`
from /opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/util/subprocess.rb:28:in `map`
三、解決問題
仔細檢視報錯資訊:
/opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/util/subprocess.rb:28:in `encode`: "xE4" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
– 1、看到上面的報錯我是崩潰的,在google和百度找了很久,沒找到答案。經過幾番測試,我發現只有選擇1) en0: 乙太網才會報類似的錯誤,選擇其他的選項時,雖然連不聯網,但是不會報這樣的錯。我懷疑可能是編碼問題!
- 2、仔細檢視第一行報錯“subprocess.rb:28:in `encode`: “xE4” from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)”。可以看出就是編碼轉換問題了。
- 3、按照報錯資訊,找到檔案/opt/vagrant/embedded/gems/gems/vagrant-1.7.4/lib/vagrant/util/subprocess.rb
- 4、vim這個檔案,找到第28行可以看到
@command = @command.map { |s| s.encode(Encoding.default_external) }
以上是Ruby語法,本人也不懂ruby,剛開始束手無策,google了一下ruby編碼轉換的問題,嘗試把上面這行改動了一下,改為以下內容:
@command = @command.map { |s| s.force_encoding(`UTF-8`) }
注意:不知道ruby對空格要求嚴不嚴格,改動後的程式碼兩邊的大括號保留了空格!
- 5、退出儲存,重新vagrant up啟動虛擬機器,再次選擇“1) en0: 乙太網”發現虛擬機器正常啟動!問題得到了解決
這個應該屬於vagrant的一枚bug!!