#為什麼要折騰 KVM 虛擬機器
最近因為公司的事情,沒有太多時間寫作,就用一篇技術類的文章來湊數吧。
事情是這樣的,我們公司有一個小東西是基於嵌入式的系統開發的,不屬於 Android 也不屬於 iOS 平台。嗯,這意味著什麼呢?這意味著發展這個小東西的語言是 C 語言,而不是 Java, Objective-C 抑或是 Swift。所以我們需要一個 Cross Compiler,也就是俗稱的交叉編譯環境來編譯這個程式碼。
其實 Xcode 編譯出來的 iOS App 也屬於交叉編譯的範疇。
然而,這個交叉編譯環境竟然只有 Windows 平台的!其實,好像除了 GCC 之外,好用的交叉編譯環境都是 Windows 下面的。估計很多玩嵌入式的同學應該都知道,現在業界用比較多的也就是 Keil 和 IAR 系列了。而及其不幸的是,兩者都是 Windows 特供的,沒有 macOS 或 Linux 版本。
為什麼 Windows 會讓我這麼不爽呢?因為平常為了更好的提高工作效率,除了不得不使用的行業應用軟體必須要跑在 Windows 下的時候,我們只用 Mac 不用 Windows。所以,我們基本上沒有閒置和富裕的 Windows 主機,不!是壓根就沒有,沒有什麼「基本沒有」一說。
而在伺服器端,更不要跟我說什麼 Windows Server 雲端雲端的。身為一個 macOS 和 Ubuntu 的腦殘用戶,我是不可能在 Bare metal 上跑一個 Windows Server 的。伺服器我們只跑 Linux,別的沒興趣。
那麼問題來了,我們有一套自動化編譯系統,也就是大家所熟知的CI 體系(Continuous integration),用的是Atlassian 的全家桶:Bitbucket、Bamboo、JIRA 還有Confluence 什麼的,全部跑在Linux 平台的Docker 虛擬化容器中。
現在我們想把這個小東西也自動化編譯器來,以便更好地把人力釋放出來,也方便未來追蹤和管理每一次 Release 的內容。而第一個要解決的問題就是:我們沒有 Windows 的伺服器。
既然現在虛擬化這麼流行,那我們就利用現有的 Ubuntu 伺服器虛擬化一個 Windows 好啦,走起!
啥是 KVM
KVM 的全名是:Kernel-based Virtual Machine,簡單一句話概括,就是一個基於 Linux 核心的虛擬化管理系統。
從 Linux 核心 2.6.20 版本開始就已經整合了這個功能。簡單理解 Docker 是在應用層的虛擬化,而 KVM 是在系統層的虛擬化。
差別就是,Docker 虛擬化的內容,必須跟 Host 主機共享內核,也就意味著只能跑 Linux 類別系統。
而 KVM 是整個主機虛擬,所以可以安裝不同的作業系統,而不限於 Linux 本身。等我過段時間抽風的時候,看看能不能在 Ubuntu 上虛擬化個 macOS 出來。這樣就不用再再弄個 Mac 主機來自動化編譯 iOS App 了。
安裝 KVM
#我這裡使用的是 Ubuntu 16.04 LTS 版本,考慮長期使用和穩定性,基本上只選 LTS 版本,其他版本差異也不太大,參考著做就好了。
首先是安裝 KVM 相關的套件文件,因為我的伺服器都是命令列,沒有安裝 X 桌面,所以我加了 --no-install-recommends 參數。不然的話它會安裝 virt-viewer 之類的包,而它們的依賴關係中又有 X11 和很多圖形圖像庫,而這些都用不上。但是如果你開啟了桌面系統,那麼也可以不加該參數。
$ sudo apt-get install --no-install-recommends qemu-kvm qemu-utils libvirt-bin virtinst cpu-checker
讓我們來驗證一下是不是一切 OK
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
很好,一切順利,我們再來弄個橋接網路。其實這個也不是必須的,看你的使用場景。
KVM 會自己創建一個 virbr0 的橋接網絡,但是這個是一個 NAT 的網絡,沒有辦法跟局域網內的其他主機進行通信,所以還是別偷懶,自己建一個橋接網絡吧。
參考配置如下:
#$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
## The bridged network interface
auto br0
iface br0 inet static
#address 1.2.3.4
netmask 255.255.255.0
#gateway 1.2.3.1
dns-nameservers 1.2.3.1
bridge_ports enp9s0
bridge_stop off
bridge_fd 0
bridge_maxwait 0
重啟網絡,並驗證一下橋接狀態:
#$ sudo systemctl restart networking
$ sudo brctl show
bridge name bridge id STP enabled interfaces
br0 8000.f079593874d9 no enp9s0
virbr0 8000.525400087ef2 yes virbr0-nic
OK,一切正常,可以開始建立虛擬主機了。
建立虛擬主機
#KVM 只是完成了第一步,我們還需要建立虛擬主機才可以繼續往下走。在開始之前,我們要準備好幾個東西:
1.Windows 安裝映像
2.Virtio ISO 和軟碟鏡像
3.VNC 用戶端(macOS 自帶)
我這裡使用的是 Virtio 0.1.126-2 版本。作業系統版本是:Ubuntu 16.04.1 LTS。
一切準備就緒,使用 virt-install 指令來協助建立虛擬機器:
virt-install \
--name win10 \
--memory 2048 \
--vcpus sockets=1,cores=1,threads=2 \
--cdrom=/path/to/windows_10.iso \
--os-variant=win8.1 \
--disk /path/to/win10/win10.qcow2,bus=virtio,size=40 \
--disk /path/to/virtio/virtio-win-0.1.126_amd64.vfd,device=floppy \#--network bridge=br0,model=virtio \
--graphics vnc,password=Passw0rd,port=5910 \
--hvm \
--virt-type kvm
基本上配置資訊都在上面了,虛擬資訊機配置如下:
#2G 記憶體1 個 CPU,1 個核,2 個執行緒
1 個 CDROM(Windows 安裝光碟)
40G 硬碟(系統磁碟)
1 軟碟機(Virtio 驅動程式)
在 5910 埠開放一個 VNC 遠端桌面
如果你的指令輸入的正確,應該會得到類似的回饋訊息:
Starting install...
Creating domain...
Domain installation still in progress. Waiting for installation to complete.
簡單來說,就是虛擬機器已經創建好了,但是因為沒有映像介面,所以沒有辦法下一步了。當我們連接了 VNC 以後,就可以繼續往下走了。這個提示只會出現一次,安裝好系統以後,不會有這個啟動等待的狀況。
安裝 Windows 10
#雖然我們在創建虛擬機器的時候,指明了使用 5910 連接埠來提供 VNC 遠端桌面。但是這個連接埠是不能直接存取的,因為它預設綁定在 127.0.0.1 上,也就是只有本地才能存取。我們需要先把遠端的本地端口,映射成本地的端口。ssh -L 5910:127.0.0.1:5910 server
然後在 macOS 下,⌘ Space 打電話出 Spotlight,然後輸入:
vnc://127.0.0.1:5910
在彈出的視窗中輸入密碼:Passw0rd
然後就可以愉快的安裝 Windows 系統了,如果不能識別硬碟,需要手動加載一下驅動,選擇 A 盤和對應的 Windows 目錄就可以了。同樣的,如果網卡沒有驅動,也是如法炮製。
###附上已安裝完成的螢幕截圖一張:### ##########以上是在Ubuntu的KVM中設定和安裝Windows作業系統的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!