問為什么要用虛擬機來操作,就要先知道什么是虛擬機,在接下來我將會用一點時間來介紹什么是虛擬機。
虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統。在實體計算機中能夠完成的工作在虛擬機中都能夠實現。在計算機中創建虛擬機時,需要將實體機的部分硬盤和內存容量作為虛擬機的硬盤和內存容量。每個虛擬機都有獨立的CMOS、硬盤和操作系統,可以像使用實體機一樣對虛擬機進行操作。
流行的虛擬機軟件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它們都能在Windows系統上虛擬出多個計算機。
虛擬機分類
linux虛擬機
一種安裝在Windows上的虛擬linux操作環境,就被稱為linux虛擬機。它實際上只是個文件而已,是虛擬的linux環境,而非真正意義上的操作系統。但是它們的實際效果是一樣的。所以安裝在虛擬機上使用好。
windows XP虛擬機vmware下安裝Linux 我們在實際的Windows XP中(宿主計算機)再虛擬出一台電腦(虛擬機),並在上面安裝Linux系統,這樣,你就可以放心大膽地進行各種Linux練習而無須擔心操作不當導致宿主機系統崩潰了。並且你可以舉一反三,將一台電腦變成三台、四台,再分別安裝上其他的系統。(運行虛擬機軟件的操作系統叫Host OS,在虛擬機里運行的操作系統叫Guest OS)。
Java虛擬機
Java虛擬機(JVM)是Java Virtual Machine的縮寫,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能模擬來實現的。Java虛擬機有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。
※優點
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機后,Java語言在不同平台上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行字節碼時,把字節碼解釋成具體平台上的機器指令執行。
Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機的軟件人員,Java語言的編譯器作者以及要用硬件芯片實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果想擴展Java語言,或是把其它語言編譯成Java語言的字節碼,也需要深入地了解Java虛擬機。
※支持的數據類型
Java虛擬機支持Java語言的基本數據類型如下:
byte://1字節有符號整數的補碼
short://2字節有符號整數的補碼
int://4字節有符號整數的補碼
long://8字節有符號整數的補碼
float://4字節IEEE754單精度浮點數
double://8字節IEEE754雙精度浮點數
char://2字節無符號Unicode字符
幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在Java執行時不需要用硬件標記。操作這些原始數據類型數據的字節碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型別是int、long、float和double。虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令,包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。
虛擬機支持的其它數據類型包括:
object//對一個Javaobject(對象)的4字節引用
returnAddress//4字節,用於jsr/ret/jsr-w/ret-w指令
注:Java數組被當做object處理。
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的字節碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的字節碼程序。Java虛擬機由於字節碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把字節碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可移植性。
※體系結構
Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。
Java指令集
Java虛擬機支持大約248個字節碼。每個字節碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。
Java指令集中的指令包含一個單字節的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單字節的操作符構成。
虛擬機的內層循環的執行過程如下:
do{
取一個操作符字節;
根據操作符的值執行一個動作;
}while(程序未結束)
由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個字節大,那么它存儲的順序是高位字節優先。例如,一個16位的參數存放時占用兩個字節,其值為:
第一個字節*256+第二個字節字節碼指令流一般只是字節對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4字節邊界對齊。
寄存器
Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。
Java虛擬機的寄存器有四種: [
pc:Java程序計數器。
optop:指向操作數棧頂端的指針。
frame:指向當前執行方法的執行環境的指針。
vars:指向當前執行方法的局部變量區第一個變量的指針。
Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。
所有寄存器都是32位的。
棧
Java虛擬機的棧有三個區域:局部變量區、運行環境區、操作數區。
(1)局部變量區
每個Java方法使用一個固定大小的局部變量集。它們按照與vars寄存器的字偏移量來尋址。局部變量都是32位的。長整數和雙精度浮點數占據了兩個局部變量的空間,卻按照第一個局部變量的索引來尋址。(例如,一個具有索引n的局部變量,如果是一個雙精度浮點數,那么它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變量中的64位的值是64位對齊的。虛擬機提供了把局部變量中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變量的指令。
(2)運行環境區
在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。
·動態鏈接
運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變量時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變量訪問翻譯成與這些變量運行時的存儲結構相應的偏移地址。動態鏈接方法和變量使得方法中使用的其它類的變化不會影響到本程序的代碼。
·正常的方法返回
如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然后在調用者的執行環境中繼續執行下去。
·異常和錯誤傳播
異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用。
(3)操作數棧區機器指令只從操作數棧中取操作數,對它們進行操作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持操作的參數,並保存操作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到操作數棧中。
每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數只能被適用於其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由字節碼驗證器強制實行。但是,有少數操作(操作符dupe和swap),用於對運行時數據區進行操作時是不考慮類型的。
※無用單元收集堆
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集算法,可以根據系統的需求使用各種各樣的算法。
※方法區
方法區與傳統語言中的編譯后代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯后的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計划在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯后的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。
一些初學Linux運維的盆友認為,學習Linux就需要把自己的計算機安裝成Linux系統或需要有真實的服務器設備。其實,初學者可以通過利用虛擬機來學習Linux運維。
利用虛擬機軟件搭建Linux學習環境簡單,容易上手,重要的是利用虛擬機模擬出來的Linux與真實的Linux幾乎沒有區別。如果購買服務器,動則一兩萬元,不是一般的盆友所能承受的,而且聲音大、費電。如果用PC和筆記本電腦搭建Linux,那就完全是Linux環境了,不但加大了學習難度,也與實際工作環境相差甚遠,有點兒南轅北轍了,企業里運維人員的工作環境大多數是在Windows桌面系統下通過SSH工具遠程連接千百里之外的Linux服務器進行管理和維護的。因此,用虛擬機軟件來搭建環境是非常接近企業工作環境的。
如果用虛擬機學習,只要計算機配置高一點,就可以同時開啟多個Linux虛擬機,在上班、回家的路上,帶着筆記本電腦就能隨時學習。如果是多台真實計算機和服務器設備,就無法移動了。如果說是放機房里的話,那這個代價也太大了。大多數學習者是很難有這樣的資源的。
使用虛擬機系統環境,我們可以隨意對虛擬系統進行設置和更改操作,甚至可以格式化虛擬機系統硬盤,進行重新分區等操作,而且不用擔心會丟掉有用數據,因為虛擬機是系統上運行的一個虛擬軟件,對虛擬機系統的任何操作都相當於在操作虛擬機的虛擬機設備和系統,不會影響計算機上的真實數據。
所以,想要學習Linux運維,又在苦惱設備的話,踏實的用虛擬機學習吧,不要給自己設置太多障礙和門檻,那會影響學習進度的。在計算機上安裝虛擬機一樣可以搭建逼近工作環境的學習環境,當然如果有設備配合虛擬機學習,學習效果更佳。
安裝過程
下面通過例子,介紹使用VMware Workstation創建虛擬機的方法與步驟。
1.運行VMware Workstation 6,單擊“File→New→Virtual Machine”命令,進入創建虛擬機向導,或者直接按“Crtl+N”快捷鍵同樣進入創建虛擬機向導。
2.在彈出的歡迎頁中單擊“下一步”按鈕。
3.在“Virtual machine configuration”選項區域內選擇“Custom”單選按鈕。
4.在Choose the Virtual Machine Hardware Compatibility頁中,選擇虛擬機的硬件格式,可以在Hardware compatibility下拉列表框中,在VMware Workstation 6、VMware Workstation 5或VMware Workstation 4三者之間進行選擇。通常情況下選擇Workstation 6的格式,因為新的虛擬機硬件格式支持更多的功能,選擇好后單擊“下一步”按鈕。
5.在Select a Guest Operating System對話框中,選擇要創建虛擬機類型及要運行的操作系統,這里選擇Windows 2000 Professional操作系統,單擊“下一步”按鈕。
6.在Name the Virtual Machine對話框中,為新建的虛擬機命名並且選擇它的保存路徑。
7.在Processors選項區域中選擇虛擬機中CPU的數量,如果選擇Two,主機需要有兩個CPU或者是超線程的CPU。
8.在Memory for the Virtual Machine頁中,設置虛擬機使用的內存,通常情況下,對於Windows 98及其以下的系統,可以設置64MB;對於Windows 2000/XP,最少可以設置96MB;對於Windows 2003,最低為128MB;對於Windows Vista虛擬機,最低512MB。
9.在Network Type頁中選擇虛擬機網卡的“聯網類型”
選擇第一項,使用橋接網卡(VMnet0虛擬網卡),表示當前虛擬機與主機(指運行VMware Workstation軟件的計算機)在同一個網絡中。
選擇第二項,使用NAT網卡(VMnet8虛擬網卡),表示虛擬機通過主機單向訪問主機及主機之外的網絡,主機之外的網絡中的計算機,不能訪問該虛擬機。
選擇第三項,只使用本地網絡(VMnet1虛擬網卡),表示虛擬機只能訪問主機及所有使用VMnet1虛擬網卡的虛擬機。主機之外的網絡中的計算機不能訪問該虛擬機,也不能被該虛擬機所訪問。
選擇第四項,沒有網絡連接,表明該虛擬機與主機沒有網絡連接。
10.在Select I/O Adapter Type頁中,選擇虛擬機的SCSI卡的型號,通常選擇默認值即可。
11.在Select a Disk頁中,選擇Create a new virtual disk(創建一個新的虛擬硬盤)。
12.在Select a Disk Type頁中,選擇創建的虛擬硬盤的接口方式,通常選擇默認值即可。
13.在Specify Disk Capacity頁中設置虛擬磁盤大小,對於一般的使用來說,選擇默認值即可。
14.在Specify Disk File頁的Disk file選項區域內設置虛擬磁盤文件名稱,通常選擇默認值即可,然后單擊完成按鈕。
15.安裝VMware Tools:在虛擬機中安裝完操作系統之后,接下來需要安裝VMware Tools。VMware Tools相當於VMware虛擬機的主板芯片組驅動和顯卡驅動、鼠標驅動,在安裝VMware Tools后,可以極大提高虛擬機的性能,並且可以讓虛擬機分辨率以任意大小進行設置,還可以使用鼠標直接從虛擬機窗口中切換到主機中來。
從VM菜單下選擇安裝VMware Tools。
按照提示安裝,最后重新啟動虛擬機即可。
注意事項
在虛擬機中安裝操作系統,和在真實的計算機中安裝沒有什么區別,但在虛擬機中安裝操作系統,可以直接使用保存在主機上的安裝光盤鏡像(或者軟盤鏡像)作為虛擬機的光驅(或者軟驅)。
可以用打開前文創建的Windows 2000虛擬機配置文件,在Virtual Machine Settings頁中的Hardware選項卡中,選擇CD-ROM項,在Connection選項區域內選中Use ISO image單選按鈕,然后瀏覽選擇Windows 2000安裝光盤鏡像文件(ISO格式)。如果使用安裝光盤,則選擇Use physical drive並選擇安裝光盤所在光驅。
選擇光驅完成后,然后單擊工具欄上的播放按鈕,打開虛擬機的電源,用鼠標在虛擬機工作窗口中單擊一下,進入虛擬機。
如果想從虛擬機窗口中切換回主機,需要按下Ctrl+Alt熱鍵。
注:以上內容來自於網絡整理,如有侵權,立即刪除。