live with scope緩存
最近須要搭建多虛擬機模擬集羣來運行Spark平臺, 我又從新翻開了以前的VritualBox使用筆記, 從新整理後發了上來.安全
搭建虛擬機主要使用VirtualBox
和VMware
兩個軟件. 一般狀況, 若是創建服務器環境的虛擬機, 我使用VirtualBox
, 不然使用VMware
. bash
考慮到任務主要是運行Spark
平臺, 並不須要桌面環境, 要儘量節省資源. 又考慮到VirtualBox
的開源, 免費, 跨平臺以及提供命令行管理, 我選擇使用VirtualBox
來搭建須要的虛擬機集羣.但就個人使用體驗來看, VMware
創建的虛擬機每每擁有更好的性能和更強的功能, 服務器
這裏除了創建第一個虛擬機的過程須要使用圖形化, 其他過程所有使用命令行. 主要考慮到真實的工做可能並無桌面環境.網絡
這裏也不是搭建大數據平臺的教程, 只是在過程當中如何使用VirtualBox
命令行來管理虛擬機.oracle
需求: 5個虛擬機, 其中2個master
, 3個worker
.less
由於要創建5個虛擬機, 不可能將安裝鏡像重複性的安裝5次, 能夠考慮將一個安裝徹底後, 經過克隆來複製成5個. 但這樣的作法並不適合將創建的虛擬機傳給別人. 這裏使用虛擬機的導出和導入.ssh
新虛擬機的創建不細說, 但有幾點注意:tcp
用戶名和密碼請設置爲hadoop
工具
將相關軟件存儲在/opt
目錄
在/etc/bash.bashrc
文件設置相關環境變量和PATH
路徑
好吧, 這應該不算做一個問題, 在Windows
平臺上. 但若是宿主機是Linux
, 特別是Ubuntu
時, Oracle
提供有PPA
方便安裝.
添加deb http://download.virtualbox.org/virtualbox/debian trusty contrib
到軟件源文件, 或者在/etc/apt/sources.list.d
目錄下新建文件寫入.
獲取官方的軟件源校驗密鑰wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
更新本地緩存並安裝sudo apt-get update && sudo apt-get install virtualbox-5.0
默認狀況下, VirtualBox
創建的虛擬機網絡默認NAT
. 虛擬機之間沒法溝通, 虛擬機能鏈接主機和外部網絡, 但主機不能訪問虛擬機(能夠經過端口轉發來訪問虛擬機). 對於大數據平臺, 虛擬機以前的數據傳遞是必要的, 所以不能使用NAT
.
別的網絡選項, 如Bridged networking
, 橋接網絡, 會將虛擬機添加到主機所在的局域網. 很差的是, 外部網絡也能鏈接到虛擬機, 對虛擬機的安全不利. 而Host-only
, 主機網絡, 則是虛擬機只能與主機彼此鏈接, 但不能訪問外部網絡. 虛擬機更新和安裝軟件, 總有連網的需求.
VirtualBox
提供了實驗性質的NAT Service
, 虛擬機之間能夠彼此鏈接, 虛擬機能夠訪問外部網絡, 但主機要經過端口轉發來訪問虛擬機.
添加NAT
服務網絡:
vboxmanage natnetwork add --netname big_data --network "192.168.2.0/24" --enable
添加選項--dhcp on
能夠開啓DHCP
動態IP分配. 但虛擬機之間因爲要配置主機名到IP的映射, DHCP
可能會改變虛擬機的IP(大部分狀況下不會). 所以, 這裏並不開啓DHCP
.
對NAT
服務網絡的操做:
vboxmanage natnetwork [start|stop|remove] --netname big_data
如今假設創建的虛擬機名爲spark
, 更改其網絡設置爲natnetwork
.
vboxmanage modifyvm spark --nic1 natnetwork --nat-network1 big_data #關機執行 vboxmanage modifyvm spark --nic1 nat vboxmanage controlvm spark nic1 natnetwork --nat-network big_data #開機執行 vboxmanage controlvm spark nic1 nat
這裏是最無語的地方. 也請記住, modifyvm
子命令只能在關機狀態下執行, 而controlvm
則只能在開機狀態下執行. 像更換網絡和設置端口轉發, 在GUI
界面是一樣的操做, 在命令行下就不一樣了. 蛋疼!!!
導出這個基本配置完成的虛擬機:
vboxmanage export spark -o spark.ova --ovf20 --options manifest, nomacs --vsys 0 --product "enalix's spark vm" --version "1.0"
ovf
是一種虛擬機共享協議, 用於將虛擬機導出生成多個文件, --ovf20
最新的標準. ova
文件格式其實是對ovf
的多個文件以tar
打包成單個文件以方便傳輸. 一個ova
文件能夠包含多個虛擬機, 所以, 若是要添加虛擬機的產品名和版本等別的額外信息, 須要指定針對哪一個虛擬機, 由--vsys n
來指定. 從0索引. manifest
用於導出文件在導入時檢驗. nomacs
是除去虛擬機的mac
地址信息. 在正常的導出和克隆時, mac
是不變的, 在同一網絡中, 相同mac
的虛擬機是沒法通訊的. 所以這裏選擇除去mac
信息, 在導入時會自動生成新的不一樣的地址.
生成ova
格式的文件就能夠進行傳輸了. 其實建立虛擬機也有命令行vboxmanage createvm
, 再加上一些選擇來控制. 但虛擬機的安裝過程, 須要選擇語言, 地區, 鍵盤, 用戶等等, 這些可使用Ubuntu Preseeding
文件來預先寫上答案來自動化安裝. 這是另外一篇文章的內容了, 如何自動化安裝系統. 這裏能夠在一臺桌面環境的系統安裝配置完成後, 導出生成ova
文件, 再傳輸到別的電腦上導入.
導入虛擬機:
vboxmanage import spark.ova -n #列出可更改選項 vboxmanage import spark.ova --vsys 0 --vmname spark_master1 --memory 1024 --unit xx --disk path
導入時還有更多的控制選項, 如禁用聲卡, 磁盤控制器, CPU數等. 但更主要的是, 虛擬機名, 和磁盤路徑. 這裏的--vsys 0
同上相同. 虛擬機由不一樣的單元組成, --unit xx
指定用於改變哪一個單元. 你可能須要導入屢次來創建多個虛擬機名.
啓動虛擬機:
vboxmanage startvm vm1 vm2 ... --type headless
能夠同時啓動多個虛擬機. VirtualBox
提供有多種啓動方式, 因爲是非桌面環境, 所以可使用headless
來無窗口地啓動. 換句話說, 虛擬機確實啓動了, 你能夠從主機ssh
登陸, 但並不會有某個窗口在運行虛擬機.
VirtualBox
提供了虛擬機組管理機制, 你能夠將相關的虛擬機添加到一個組中.
vboxmanage modify spark_master1 --group "/bigdata" #入組 vboxmanage modify spark_master1 --group "" #退組
可是無語的是, 雖然GUI
界面的VirtualBox
提供有組啓動, 但命令行並無. 你只能在一條啓動命令中列出要啓動的多個虛擬機名. 另外一個無語的是, 沒法一條命令將多個虛擬機添加到同一組. 真不明白這種簡單方便的選項怎麼沒提供.
除了啓動外, 你還有更多的控制:
VBoxManage controlvm vmname [poweroff|reset|pause|resume|acpipowerbutton|acpisleepbutton|savestate]
這裏面有一些區別. poweroff
實際上至關於拔電源, reset
至關於硬件的重置. 而acpipowerbutton
纔是系統的關機, acpisleepbutton
則是系統的休眠. 注意, 休眠應該是Windows
獨享的功能. pause
和resume
則是暫停和恢復虛擬機. savestate
會保存當前狀態並關機.
因爲是無窗口的啓動虛擬機, 所以在主機經過ssh
登陸管理系統則是很是必要的. 這裏經過端口轉發來完成.
vboxmanage natnetwork modify --netname bigdata --port-forward-4 "master1:tcp:[]:2010:[192.168.2.10]:22" vboxmanage natnetwork modify --netname bigdata --port-forward-4 delete master1
此處創建了一條端口轉發的規則master1
, 協議tcp
, 從主機2010
端口到虛擬機192.168.2.10
的22
端口. 這裏的--port-forward-4
是指IPv4
版本的.
有意思的是, 不管是添加nat
服務網絡, 而是添加服務網絡的端口轉發, 都只能在命令行中進行. GUI
是不提供此功能的. 而事實上, GUI
的管理工具只提供些簡化的功能, 若是要徹底掌握VirtualBox
, 仍然須要探索命令行.
對於通常的NAT
網絡來講, 也能夠設置端口轉發:
vboxmanage modifyvm spark_master1 --natpf1 "master1,tcp,,2222,,22" #關機執行 vboxmanage modifyvm spark_master1 --natpf1 delete master1 vboxmanage controlvm spark_master1 nic1 nat --natpf1 "master1,tcp,,2222,,22" vboxmanage controlvm spark_master1 nic1 nat --natpf1 delete master1
設置中, 連續的兩個,
表示此處爲空. 在NAT
網絡下, 虛擬機只和主機相連, 所以主機的IP和虛擬機的IP並不重要, 可省略. nic1
和natpf1
中是數字1, 表示多網卡狀況下對網卡的選擇. 即便只有單一網卡, 也要寫1.
好了, 你能夠從主機登陸虛擬機進行管理了, 設置好正確的/etc/hostname
, /etc/hosts
, /etc/network/interface
等文件. 並生成ssh
密鑰以實現無密碼登陸, 等等. 這是另外一篇內容了, 如何搭建spark平臺
.
建立快照: VBoxManage snapshot vmname take snapname [--description desc] [--live]
,有--live
參數,快照建立過程當中不會中止虛擬機.
刪除快照: VBoxManage snapshot vmname delete snapname
恢復快照: VBoxManage snapshot vmname restore snapname
恢復到當前快照: VBoxManage snapshot vmname restorecurrent
列出快照: VBoxManage snapshot vmname list [--details]
編輯快照: VBoxManage snapshot vmname edit snapname [--name <newname>] [--description <newdesc>]
列出全部(運行)的虛擬機: vboxmanage list vms|runningvms
列出支持的虛擬系統類型: vboxmanage list ostypes
顯示虛擬機的詳細信息: vboxmanage showvminfo vm_name
給虛擬機重命名: vboxmanage modifyvm vm_name --name new_name
快照管理: vboxmanage snapshot vm_name take/delete/restore snap_name
, 建立/刪除/恢復快照.
刪除虛擬機及相關文件: VBoxManage unregistervm test --delete
最開始我是計劃使用vagrant
, 若是你讀過以前的介紹vagrant
的文章, 應該知道它能夠生成一個box
格式的文件, 很方便再生成新的虛擬機. 但有幾點讓我不舒服.
1, vagrant
彷佛不能改變虛擬機名, 默認的虛擬機名是字串加上隨機數字. 這也就意味着你不能經過虛擬機名來管理虛擬機. 只能不斷切換目錄, 用vagrant
命令. 但命令相比vboxmanage
提供的功能太少.
2, vagrant
創建的虛擬機, 並無配置選項能夠將網絡設置成natnetwork
. 而由前所述, 要創建集羣, 虛擬機間的通訊是必要的.
3, box
格式並非通用的格式, 這意味着, 若是用box
來傳輸, 在對方計算機上也要安裝vagrant
. 你不必定有權限這樣作.