Vagrant Tutorial(2)跟著流浪漢把玩虛擬機 by William Yeh | CodeData
top

Vagrant Tutorial(2)跟著流浪漢把玩虛擬機

分享:

Vagrant Tutorial(1)雲端研發人員,你也需要虛擬機! << 前情

前情提要

研發者用的本機電腦,與真正上線服務的電腦,兩者的作業系統及相關組態,甚至連本性都很不一樣。研發者需要一種方法,能在本機模擬出那些電腦叢集,越像越好。

虛擬機技術,就是一帖解藥。不只是上線環境的伺服器需要,不只是伺服器維運人員需要;就連研發者手邊的開發機,也需要。

虛擬機是什麼?

虛擬機軟體,讓你將任何一台電腦模擬出另外 N 台電腦;這些被模擬出來的虛擬機 (virtual machine),某種程度上相當於一部完整電腦,有自己的 CPU、記憶體、磁碟和 I/O 裝置,又可以像真實裸機 (bare metal machine) 一樣,灌任何一種開機用的作業系統進去。灌好之後,在虛擬機軟體裡面把它「開機」起來,並將視窗放大到全螢幕,拿給不知情的第三者看,他可能根本不知道這是虛擬機呢。

因此,藉由免費且開源的 VirtualBox,你可以在 Windows 上,跑一個 Linux 虛擬機來玩玩;也可以在 Mac 上,跑一個 Windows 虛擬機應付一些被 Internet Explorer 綁定的骨灰級網頁。像下圖就是我在 Mac 上,透過 VirtualBox 同時啟動兩個虛擬機,一個 Ubuntu Linux 14.04,一個 Windows 7:

Running 2 VM instances on Mac

 

Running 2 VM instances on Mac

Running 2 VM instances on Mac

如果你不滿意 VirtualBox 的性能,還可以購買 VMware WorkstationVMware FusionParallels Desktop 等更強悍的虛擬機軟體。

如上圖所示範的,只要實體機夠力:CPU 夠快,記憶體夠大,同一時間可以開啟多台異質虛擬機。如果你會設定的話,這些虛擬機之間,亦可透過網路模擬層彼此互連。因此,虛擬機是分散式系統研發者的好幫手,讓你只用一台實體機(當然啦,前提是,實體機與 hypervisor 的性能不能太差),就能在某種程度上模擬出多台互連的異質電腦叢集。

為了行文方便,以下我稱本機電腦用以開機的作業系統為 host OS,虛擬機所跑的則稱為 guest OS

虛擬機的 Wish List

主流的虛擬機軟體,都提供易於上手的 GUI 介面。可是,對軟體研發者來說,更需要的是可程式化的介面,以便將虛擬機納入軟體開發工具鏈中。譬如:

  1. 能不能下一些可程式化的指令,就自動安裝一台或多台指定版本的 guest OS 虛擬機供我使用,即使是最陽春的 Linux 也無妨?雖然已經有像 VirtualBoxImages.com 這樣的網站,讓你手動下載免費的 guest OS 裝在 VirtualBox 上,但我們要的是可程式化
  2. 能不能下一些可程式化的指令,就自動設定好這些虛擬機叢集的組態?最好也能與上線主機共用同一套組態管理機制(ChefPuppetAnsibleSalt⋯⋯),“infrastructure as code” 一以貫之。
  3. 能不能下一些可程式化的指令,就自動儲存現有狀態(所謂的 “snapshot” 快照),供日後快速複製增生一模一樣的虛擬機,或是重建犯罪現場重現歷史狀態以便偵錯?
  4. 在軟體層次,我們有 yumapt 之類的套件管理系統;程式語言層次,則有 ComposerCPANgemMavannpmNuGetpip 之類的套件管理系統。同理,虛擬機層次,能不能也有類似的 repository 中央儲存庫?

雖然就連免費且開源的 VirtualBox 都有提供 VBoxManage 之類的命令列工具,但這些工具仍過於陽春,很難做到上述種種需求。想一步到位?有請本系列文章的主角 “Vagrant” 正式登場⋯⋯

歡迎流浪漢 Vagrant 的加入!

根據韋氏字典,“vagrant” 這個英文字的本意是:

va·grant noun \ˈvā-grənt\
: a person who has no place to live and no job and who asks people for money
— Merriam-Webster.com

而從 Vagrant 擺在 GitHub 的歷史紀錄來看,Mitchell Hashimoto 於 2010 年 3 月 8 日首次釋出 Vagrant 0.1.0 版,當時它的 slogan 是:

Vagrant is a tool for building and distributing virtualized development environments.

關鍵字:

  • building:協助你安裝、設定虛擬機。
  • distributing:不只打造,還協助你儲存、散佈。
  • virtualized development environments:專為研發者量身打造的,以虛擬機為中心的研發環境。

或許作者想讓這個工具的使用者,能像流浪漢、游民一樣,浪跡天涯,隨遇而安;不受限於機器的實體位置,能在任何一台電腦上,模擬出任何一種遠端主機的可程式化環境,讓研發人員的日子更好過。

當時它是這麼描述自己的:

By providing automated creation and provisioning of virtual machines using Sun’s VirtualBox, Vagrant provides the tools to create and configure lightweight, reproducible, and portable virtual environments.

關鍵字:

  • automated:自動化,可程式化。
  • creation and provisioning:打造,設定,安裝,啟動,開通。
  • Sun’s VirtualBox:呃,當年 Sun 還沒賣給 Oracle 呢⋯⋯
  • lightweight:輕量無負擔,無需大幅改變自身習慣。
  • reproducible:可再現,infrastructure as code。
  • portable:通吃,不挑食。

最初 Vagrant 是站在 VirtualBox 的基礎上,用 Ruby 加工,寫的一套可程式化介面。四年半下來,Vagrant 已有明顯改進,以下只提兩則與安裝 Vagrant 有關的部分,畢竟,軟體再怎麼好,也要先降低安裝門檻,才利於推廣:

  1. Vagrant 不再限定只能搭配 VirtualBox,前面提過的各種主流虛擬機軟體已經全部都能支援。當然啦,Vagrant 一族仍然最愛用既開源又免費的 VirtualBox,因此,本系列文章會假設你已經先安裝好 VirtualBox 了。
  2. 早期,你的電腦必須先安裝 Ruby,才能用 Ruby 的 gem 套件管理系統安裝 Vagrant。想當年,為了在我的 Windows 上安裝 Ruby 環境,可真是吃足了苦頭。所幸,Vagrant 從 1.1 版開始,將 Ruby 相關事物包裝起來,你的電腦不再需要先有 Ruby 才能安裝 Vagrant 了(箇中經過,請見 Abandoning RubyGems 一文)。

所以今天,你只要去 Vagrant 官網的下載頁,直接下載 dmg、msi、deb、rpm 這些標準的安裝檔,就能無痛安裝。

安裝步驟

為了順利進行本系列文章的操作,請先依照以下步驟安裝 Vagrant 及 VirtualBox:

  1. 去 Vagrant 官網的下載頁 (http://www.vagrantup.com/downloads.html),下載適合的安裝檔,執行之。
  2. 去 VirtualBox 官網的下載頁 (http://www.virtualbox.org/wiki/Downloads),下載兩個安裝檔:
    • VirtualBox platform packages
    • VirtualBox Extension Pack

    並依序執行之。

    下載必要的 VirtualBox 安裝檔案

    下載必要的 VirtualBox 安裝檔案

以下文章皆以 Vagrant 1.6.0 以上版本為準(我用的是 1.6.3),如果你曾經安裝過舊版本,請先升級。

作業系統注意事項

如果你是 Ubuntu 用戶,可以在 Software Center 下載更量身打造的 VirtualBox。

如果你是 Mac OS X 用戶,想用 Homebrew Cask 機制安裝 VirtualBox + Vagrant 的話:

$ brew cask install vagrant    --appdir=/Applications
$ brew cask install virtualbox --appdir=/Applications

如果你是 Windows 用戶,嗯,在 Windows 上,命令列是次等公民,得多花一點心思排除問題。辛苦你了⋯⋯

在 Windows 上安裝 VirtualBox 時,如果遇到以下錯誤:

找不到指定的檔案

請先切換到放置下載檔案的目錄,找出剛剛下載回來的安裝檔名(以我的例子:VirtualBox-4.3.14-95030-Win.exe),再依序執行以下命令:

$ VirtualBox-4.3.14-95030-Win  -extract
$ cd VirtualBox
$ dir

你應該會看到一個 msi 類型的安裝檔,請執行它。

最後,為了運作順暢,你還需要一個「純命令列的 ssh 程式」。如果你堅持要用 PuTTYPieTTY可攜版,可能會在某些進階步驟踩到地雷,請不要自找麻煩,乖乖安裝一個「純命令列的 ssh 程式」吧。以下是一些輕量級的 ssh.exe 選項:

安裝後,記得要去【控制台】把 ssh.exe 路徑加到 PATH 環境變數。

或者,乾脆安裝整套 MinGWCygwin 算了⋯⋯

生出一個虛擬機,只要兩道指令!

以下快速示範一些簡單步驟,讓你體會一下,只要兩道指令,就能生出一個虛擬機!

首先,請先選定一個工作目錄,供 Vagrant 運作時寫入相關資料之用。假設我們選定的目錄名稱為 demo-1

$ mkdir demo-1
$ cd demo-1

接著,請選定你想要安裝哪一個 guest OS。

Vagrant 發明人創辦的 HashiCorp 公司,經營一個 Vagrant Cloud 服務,作為 Vagrant 虛擬機(在 Vagrant 術語裡稱為 box)的 repository 中央儲存庫。你可以去搜尋屬意的 box 來安裝:

Discover Vagrant boxes

Discover Vagrant boxes

或是試試以下幾個我常用的 box:

這次我們就以 ubuntu/trusty64 為例吧。請輸入以下指令:

$ vagrant init ubuntu/trusty64
$ vagrant up

有兩種可能的情況:

  • 如果你是第一次在這個 host OS 上嘗試建立 ubuntu/trusty64 這個 box,那麼,在 vagrant up 這個步驟執行時,Vagrant 會先向 Vagrant Cloud 查詢並下載這個 box 檔案。檔案小則 100 MB,大則數百 MB,請稍待片刻。
  • 如果你以前曾在這個 host OS 上安裝過 ubuntu/trusty64,且這個 box 不需升級新版,那麼,vagrant up 就會直接抓取本機電腦裡面存放的 box 檔案來增生虛擬機。

兩者的差別,請見我做的實況錄影,全長約 9 分鐘: http://asciinema.org/a/11428

OK,就這麼兩道指令,你已經在本機生出一台虛擬機了!

你可以 ssh 進去這台虛擬機,就像你以前 ssh 進去遠端主機一樣:

$ vagrant ssh

vagrant$

注意到了沒?系統提示符號改變了,提醒你你已經從 host OS 踏入 Vagrant 所管理的 guest OS 了。

你可以看看這個 guest OS 是否真的為 Ubuntu 14.04 LTS (Trusty Tahr) 64-bit:

vagrant$  lsb_release -a

玩累了,你可以先登出,回到 host OS:

vagrant$  exit

$

只要位於同一個工作目錄,你隨時可以再 ssh 登入:

$ vagrant ssh

登出後,可以暫時將虛擬機關機,將 CPU 及記憶體等資源歸還給 host OS 主機:

$ vagrant halt

小結

VirtualBox、VMware Workstation、VMware Fusion、Parallels Desktop 等虛擬機軟體,讓你將任何一台電腦模擬成其他作業系統;Vagrant 則進一步將這些虛擬機納入管控,讓軟體研發流程更順暢、更有彈性。

「Vagrant + VirtualBox 組合技」的成功,啓迪了許多人,原來虛擬機也可以這麼玩!像 boot2docker 就師法這種方式,用「boot2docker + VirtualBox 組合技」讓非 Linux 的電腦上也能跑 Docker,更衍生出 yungsang/boot2dockerparallels/boot2docker 這些 Vagrant + Docker + VirtualBox/Parallels Desktop 大混血的玩法⋯⋯呃,等我開 Docker Tutorial 專欄時,再慢慢談好了。

OK,今天 Vagrant 課程就先上到這裡。下回會再仔細解釋前面那些指令背後到底做了什麼。

後續 >> Vagrant Tutorial(3)細說虛擬機生滅狀態

分享:
按讚!加入 CodeData Facebook 粉絲群

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

擔任過許多職場角色:程式設計師、技術團隊領班、技術作家及譯者、教授、顧問、技術佈道者,但目前最喜歡的身份,還是「軟體架構師」。

熱門論壇文章

熱門技術文章