搭建Linux工做環境之VirtualBox

圖片描述

live with scope緩存

最近須要搭建多虛擬機模擬集羣來運行Spark平臺, 我又從新翻開了以前的VritualBox使用筆記, 從新整理後發了上來.安全

搭建虛擬機主要使用VirtualBoxVMware兩個軟件. 一般狀況, 若是創建服務器環境的虛擬機, 我使用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路徑

安裝VirtualBox

好吧, 這應該不算做一個問題, 在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獨享的功能. pauseresume則是暫停和恢復虛擬機. 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.1022端口. 這裏的--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並不重要, 可省略. nic1natpf1中是數字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. 你不必定有權限這樣作.

相關文章
相關標籤/搜索