2011年5月15日 星期日

Linux KVM - 高階管理命令

Linux KVM 的原生操作指令(kvmkvm-img ...)在使用上需要搭配許多參數,方能完成虛擬電腦的正常開機與運作,不管是硬碟檔案的建立、虛擬周邊裝置的指定甚至是網路的設定,均是如此,這些操作,若只是需要建立幾台虛擬電腦,倒還可以接受這樣一台一台輸入指令的操作模式,不過,目標若是一整個電腦教室,或是一整個完整的企業運作環境,這種一台一台設定的方式,大概會要了 IT 人員的老命吧,除此之外,每啟動一台虛擬電腦,就會多一個虛擬電腦的〝螢幕〞在視窗上,數目一多,除了看了眼花撩亂,也不能隨意關閉虛擬電腦的作業視窗因為一旦關閉,就代表虛擬電腦被你給關機了,而即使最小化到系統工具列,也不是一個最接且合理的管理模式,這些,就是 Linux KVM 原生命令使用上的最大缺點。


Linux KVM 的功能相比,利用這些原生指令來操作,似乎顯得有點使不上力,不只綁手綁腳的,也無法發揮 Linux KVM 應有的功能與表現,這時候,就需要加裝一組 Turbo 引擎,來發揮出 Linux KVM 所有的效能,而這邊所謂的 Turbo 引擎,指的就是 libvirt 這一套管理函式庫。


libvirt RedHat 公司所維護,也就是在 Linux 的領域中,大家所熟悉的小紅帽,雖然 libvirt 是由 RedHat 所維護,但由於是採用 Open Source 的授權方式運作,也儼然成為了虛擬系統管理與操作的標準,除了能用在 Linux KVM 之上,也能運用在如 Xen 這套虛擬系統之上,只要是利用這一套函式庫所撰寫的工具,均能管理與操作許多虛擬系統平台(目前尚未支援 Microsoft Hyprer-V)。


現在,就讓柚子教大家如何替 Linux KVM 加裝 libvirt 這一組 Turbo 引擎吧,開啟終端機,並在提示符號下輸入以下指令:


$ sudo apt-get install libvirt-bin


按下 Enter 鍵之後,若系統提示輸入密碼,請輸入管理者密碼,系統會顯示要安裝的套件與函式庫,並會提示是否要安裝以上套件,請輸入 y ,讓安裝程序可以順利安裝下去。


安裝完成之後,可不要就真的在終端機下輸入 libvirt 喔,這樣可是不會有任何反應的呦,別訝異,這並不是沒有安裝成功,還記得,上文有提到,libvirt 是一套函式庫,而實際的操作指令,則是 vitsh ,簡單來說,virsh 是由 libvirt 所提供的,裡面內建許多操作指令,除了建立、操作與管理本機上的虛擬電腦之外,甚至還可以管理遠端的虛擬電腦,功能很強大吧~


直接在終端機內輸入 virsh ,按下 Enter 鍵之後,會看到入下畫面:




這是 virsh 的互動模式終端機,當你輸入 help 時,可以完整看到所有 vitsh 的相關參數與說明,若要跳離這互動模式,輸入 quit 就可以離開了。


那麼,virsh 是如何建立與管理虛擬電腦呢?雖然 virsh 一樣也是命令模式來操作虛擬電腦,但是與 kvm 命令不同的地方,在於 kvm 是利用參數,來建立虛擬電腦的各個週逼裝置與啟動參數,但是 virsh 可就不一樣了,他是利用 xml 檔案來定義(載入)虛擬電腦與其周邊裝置,而重點就在這一個 xml 檔案,這裡面記載了虛擬電腦的各項裝置設定值,就像是虛擬電腦的身分證一樣,而這個 xml 檔案,也是日後快速大量部屬虛擬電腦與虛擬電腦遷移的重要關鍵檔案。


在這邊,柚子簡單的以一個小小的 xml 檔案與 FloppyFW(磁片型防火牆) 的搭配,來實作如何利用 virsh 來建立(定義)、啟動、關閉與刪除虛擬電腦,步驟如下:



下載系統映像檔


請到以下的位置,下載 FloppyFW 的映像檔,因為檔案很小,只有 1.44 MB 不到,所以很快就可以下載完畢:

http://www.zelow.no/floppyfw/download/floppyfw-3.0/floppyfw-3.0.14/floppyfw-3.0.14.img



下載 xml 檔案


下載 floppyfw.xml.zip 檔案(點選就可以連結下載),下載之後,將檔案解壓縮,放到家目錄之下即可。



修改 xml 檔案


floppyfw.xml 檔案解壓縮之後,請用任一編輯器(記事本)開啟此檔案,並修改兩個地方:

1、修改顯示名稱:這主要是顯示在 virsh 主控台中,代表此虛擬電腦的名稱,也是日後操作虛擬

電腦的指定名稱,如下圖紅色框框內的黑色字串:



2、修改硬碟檔路徑:這主要是指定硬碟檔案的實際路徑,在這邊指的是 floppyfw-3.0.14.img

案的所在位置,如下圖紅色框框內,單引號內的紅色字串:





定義虛擬電腦


開啟終端機,先輸入以下指令:


$ sudo virsh list --all


這指令主要的目的,是為了確認目前虛擬系統之內,虛擬電腦的數量、名稱與狀態,如下圖所示,一般來說,若是新安裝 Linux KVM libvirt 的使用者,應該是沒有任何資訊在裡面的:




那要如何建立虛擬電腦呢?在這邊先要跟之前的 kvm 指令做一點區隔,對 virsh 來說,因為所有周邊裝置的指定,都寫在 xml 檔案之內,而 virsh 只是將此 xml 檔案登入在 virsh 的管理平台之內,類似註冊的動作,所以在這邊就比較傾向說明是定義虛擬電腦;請輸入以下指令,來定義一台新的虛擬電腦:


sudo virsh define floppyfw.xml


若沒有任何問題,系統會回應 floppyfw 定義完成的訊息,如下圖:




確認之後,可以再次執行以下指令,來確定剛剛新定義的虛擬電腦(FloppyFW),是否已經載入虛擬系統(Linux KVM)之中:


$ sudo virsh list --all


若看到以下訊息就表示虛擬電腦已經正確載入虛擬系統之中了:




在這邊就可以看到,名稱為 FloppyFW 的虛擬電腦,而這個顯示的名稱,也就是剛剛修改 xml 檔案時,所設定的虛擬電腦名稱。



啟動虛擬電腦


但要怎樣啟動這台虛擬電腦呢?很簡單,只需要輸入以下指令即可,要注意喔,虛擬電腦的名稱可不要打錯喔:


$ sudo virsh start FloppyFW


按下 Enter 鍵之後,系統會回應系統已經啟動的訊息,如下圖:




一樣,可以利用〝sudo virsh liat --all〞,查看虛擬電腦的啟動狀況,如下圖:




不過,雖然看到虛擬電腦已經啟動,但眼前畫面一樣沒變,還是實體電腦的作業系統,完全看不到,也摸不到虛擬電腦的系統,那到底要怎樣進入與使用虛擬電腦呢?在這邊先簡單說明一下,當使用 virsh 來啟動虛擬電腦時,虛擬電腦整個其實是在背景執行當中,與最初 kvm 的指令不同,並不會跳出一個虛擬電腦的作業視窗,也由於在背景執行,並無法得知虛擬電腦的基本訊息,如網路 IP 等,因為最初在啟動時,也沒有額外設定,所以即使網路環境有 DHCP Server 存在,也於事無補,根本無從連線到虛擬電腦之內,這樣聽起來,還倒不如使用 kvm 的指令,至少還有畫面可以操作。


其實,這樣說並不完全正確,的確,若單純只利用 virsh 的指令來操作虛擬電腦,的確是不會有虛擬電腦的作業視窗可以操作,這需要搭配一些 GUI 的套件(如 virt-manager),才能輔助開啟虛擬電腦的畫面,另外,一般的作業系統,再最初安裝之後,若沒有進行任何設定(如 IP 設定,或是 SSH 套件的安裝等),也沒有 GUI 套件的輔助,的確是沒有辦法連線到虛擬電腦之內,但也並不是所有的虛擬電腦都無法利用 virsh 的指令與參數來進行連線,如上述範例所使用的 FloppyFW,其本身就有提供 console 連線的功能,這其實就與一般網路設備或是伺服器一樣,可以在本機前,直接連線到機器之內,進行維護的動作是相同的道理,而 virsh 的參數之中,就有提供 console 的連線模式,可以直接由實體電腦,利用 console 的模式連線到虛擬電腦之內,連線方式如下,請在終端機直接輸入以下指令:


$ sudo virsh console FloppyFW


按下 Enter 鍵之後,會看到以下的畫面:




不過,到此之後,就沒有看到系統有任何的反應,是當機了嗎?當然不是,只要在按一下 Enter 鍵,就可以進入虛擬電腦之內了( FloppyFW 預設登入帳號為 root ,而預設密碼為空白),這時就可以利用一般 Linux 的指令,才操作 FloppyFW 了,很特別吧!






那要怎麼離開 console 呢?exist 嗎?不行耶,那 quit 呢?也沒反應,那...是要直接把終端機視窗關掉嗎?這是其中一個方法,其實一般來說,只要利用組合鍵,〝Ctrl+]〞就可以離開 console 了。



關閉虛擬電腦


一般來說,正規關機的方式,就是直接在虛擬電腦內關機,或是下達關機的指令,不過,既然是虛擬電腦,若不是正在提供重要的服務,或是執行重要的運算時,其實可以利用 virsh 的指令,直接就把虛擬電腦關機,直接且快速,指令如下:


$ sudo virsh destroy FloppyFW


很訝異吧,關機的指令,居然不是〝stop〞,而是〝destroy〞,這實在蠻難讓人直接聯想到,不過,virsh 就是這樣設定,就多擔待吧,執行之後,若看到以下回應,就表示虛擬電腦已經關閉了:




什麼!虛擬電腦已經被刪除了!那剛剛不就白做工了,嘿嘿,別緊張,這只是中文翻譯的關係,若還不放心,一樣,可以執行〝sudo virsh liat --all〞,查看虛擬電腦的狀態:





刪除虛擬電腦


先簡單說明一下,這邊所謂的刪除,並不是實際將虛擬電腦,也就是硬碟檔刪除,所謂的刪除,只勢將虛擬電腦,由 virsh 的管理平台給移除,類似取消註冊的含意,或者類似 windows 平台中,刪除帳號一樣,若沒有特別指令,帳號下的家目錄還是會存在的,刪除虛擬電腦的指令如下:


$ sudo virsh undefine FloppyFW


這就比較好聯想了吧,定義虛擬電腦是〝define〞,而解除定義則是〝undefine〞,執行之後,會看到以下訊息,也可以再利用 〝sudo virsh liat --all〞,查看虛擬電腦是否還存在:




以上,就是 Linux KVM 進階管理命令, virsh 的基本操作,不過,就這樣看來,virsh 指令好像也沒有比原生的 kvm 指令好用到哪,其實不然,在基本操作的模式下,這兩者的確是看不出差異在哪,但若好好搭配 xml 檔案與適當的 script ,就可以看到 virsh 指令強大的功能了,如快速部屬與建置大量虛擬電腦,這後續會慢慢介紹,所以在實際面上, virsh 還是命令模式的操作方式,但這就不少人來說,其實是會蠻不習慣的,話雖如此,其實還是有不少視窗管理工具,讓使用者可以快速上手!


6 則留言:

  1. Nice blog ,
    目前正在實作OpenStack,很高興有這個研究試blog

    我想請問一個問題,
    root@ubuntu3:/tmp# virsh console instance-00000157
    Connected to domain instance-00000157
    Escape character is ^]
    error: internal error character device (null) is not using a PTY

    關於這個error 是否有經驗呢??

    Cheers
    Hugo Kuo

    回覆刪除
  2. 你的虛擬系統必須設定 ttyS0 裝置, 以 Ubuntu 為例, 步驟如下 :


    $ sudo nano /etc/init/ttyS0.conf
    # ttyS0 - getty
    #
    # This service maintains a getty on ttyS0 from the point the system is
    # started until it is shut down again.

    start on stopped rc RUNLEVEL=[2345]
    stop on runlevel [!2345]

    respawn
    exec /sbin/getty -L 115200 ttyS0 xterm

    $ sudo start ttyS0

    回覆刪除
  3. KVM
    Thanks for your help :>

    Hugo Kuo

    回覆刪除
  4. 下 virsh start 虛擬主機名稱 之後,
    再下 virsh console 虛擬主機名稱 就出現以下訊息
    ,可是一直按Enter還是無法進去虛擬主機的console端??

    Escape character is ^]

    回覆刪除
    回覆
    1. 我也遇到了同样的问题 请问你已经解决掉这个问题了么?

      刪除
  5. 請問你的虛擬主機使用那個作業系統 ?

    回覆刪除