本帖最后由 風(fēng)影刃 于 2013-07-09 17:37 編輯
這是讓KVM飛系列的第三篇,
在KVM的管理與使用的時候,接觸最多的可能就是虛擬機(jī)的虛擬磁盤,因為只有它是具象的,其他資源都是抽象的。如何靈活的操作KVM的虛擬磁盤,對于管理虛擬機(jī)來說是至關(guān)重要的。下面要介紹的是我認(rèn)為可以在KVM中稱王稱霸稱王八的瑞士軍刀級別的工具——libguestfs 為了方便,使用yum安裝: 使用-a 參數(shù)添加一個虛擬磁盤,用guestfish掛載 進(jìn)入到一個shell中,輸入 run 回車,進(jìn)行加載,加載需要的時間與虛擬磁盤的大小有關(guān)。此處無返回信息。然后通過內(nèi)部命令 mount 掛載虛擬機(jī)的分區(qū)到掛載點(diǎn)上。 注:此處進(jìn)入到另一個Shell的終端,所以與我們本地的命名空間是不同的,所以這里掛載的根并不是操作系統(tǒng)上的根。 你也可以使用更便捷的方式。直接加入-i參數(shù),它會自動的掛載分區(qū)。 值得留意的是,在我使用-i自動掛載的時候,有一個vdb找不到文件,因為在我虛擬機(jī)內(nèi)部的fstab是有vdb1這個分區(qū)的掛在信息的,由此可以判定,加入-i參數(shù)是,會跟去fstab掛載指定的分區(qū)。 上邊的命令就是我通過內(nèi)部shell直接執(zhí)行的cat,獲取的虛擬機(jī)內(nèi)部的文件信息。 亦可以使用其他命令,操作與正常的Shell無明顯差別。 只是這樣掛載使用還是略有些不方便,所以,基于guestfish開發(fā)出一些腳本和命令工具。 比如掛載虛擬機(jī)磁盤文件,我們可以使用guestmount: 之后我們就可以和對一個正常的文件系統(tǒng)處理操作了。比如我們想在虛擬機(jī)創(chuàng)建之前對其做初始化操作,配置ip、域名、或者配置一些環(huán)境變量之類的,都可以通過這種方式掛載注入。 而且,此方法并不區(qū)別qcow2還是raw…… 不過如果你認(rèn)為僅僅如此的話呢,就大錯特錯了……
你可以用 安裝基于guestfish一系列的工具。 可以直接查詢虛擬機(jī)磁盤的使用狀態(tài)。 -d參數(shù)可以加domain,返回虛擬機(jī)內(nèi)所有磁盤的掛載和使用情況 - virt-cat -a root.img /etc/sysconfig/network-scripts/ifcfg-eth0
復(fù)制代碼
可以直接查看虛擬磁盤內(nèi)部某個文件的內(nèi)容 - virt-edit root.img /etc/sysconfig/network-scripts/ifcfg-eth0
復(fù)制代碼
可以直接編輯虛擬機(jī)磁盤內(nèi)部的某個文件的內(nèi)容 virt-resize 可以離線修改虛擬機(jī)分區(qū)大小(后邊的情景分析會用到) virt-what 可以獲取虛擬機(jī)上層的Hypervisor信息。在Host上執(zhí)行沒有返回值,在虛擬機(jī)內(nèi)執(zhí)行則會返回虛擬機(jī)Hyper的名稱。 (這個命令是比較有趣的,很多時候我們在使用云主機(jī)或者vps的時候,作為一個虛擬化的使用者,老是想弄清對方用的是什么Hypervisor,網(wǎng)上有一些通過查看/proc下的文件來查看的,也有其他方法,但對于全虛擬化,很難從虛擬機(jī)中找到蛛絲馬跡可以判定,virt-what封裝了一個C程序,獲取cpu內(nèi)部一個保留的字段,通過此方法辨別使用的是哪種Hypervisor,感興趣的可以嘗試下)
可以獲取guest內(nèi)部的詳細(xì)信息,包括虛擬機(jī)具體的OS版本,和以安裝軟件包信息。 更多內(nèi)容,可以自行嘗試。這里只做一個拋磚引玉的過程。
情景分析:學(xué)以致用——如何增加磁盤或分區(qū)容量 虛擬化帶來的并不僅僅是更少的硬件支出,更低的功耗,更高的使用率,還有更多的擴(kuò)展能力。下面為大家介紹幾種磁盤擴(kuò)展的解決方法。 在生產(chǎn)環(huán)境中,因為規(guī)劃問題或者臨時數(shù)據(jù),有很大可能遇到磁盤容量無法滿足需求的情況。在虛擬化的環(huán)境中,資源是彈性的,當(dāng)磁盤不夠用,我們可以從宿主機(jī)上劃一塊區(qū)域供虛擬機(jī)使用。 1 添加磁盤 對于宿主機(jī)來說,虛擬機(jī)的磁盤只不過是一個鏡像文件。我們可以通過qemu-img的命令創(chuàng)建個要添加大小的文件,添加到虛擬機(jī)的xml配置中,然后重啟虛擬機(jī),重新加載配置文件即可。 可對于有些業(yè)務(wù)是不允許停機(jī),或者盡量避免停機(jī)的,那此時可以選擇動態(tài)添加磁盤。 同樣先創(chuàng)建一個虛擬機(jī)磁盤文件,使用命令 - virsh attach-disk domain_name /path/to/disk.img vdb --cache=none
復(fù)制代碼
但是這種方式只允許添加支持熱插拔的scsi接口的磁盤,在宿主機(jī)上的表現(xiàn)是virtio的磁盤。 這里默認(rèn)是使用的raw格式的磁盤,如果使用的是qcow2,在參數(shù)中不指明會導(dǎo)致添加成功后,虛擬機(jī)內(nèi)無法識別。 - virsh attach-disk domain_name /path/to/disk.img vdb --cache= none --subdirver=qcow2
復(fù)制代碼
這種添加方式對于libvirt管理的虛擬機(jī)是臨時的,我們還需要通過 - virsh dumpxml domain_name
復(fù)制代碼
將磁盤對應(yīng)的xml部分,復(fù)制,通過edit 編輯虛擬機(jī)的配置,粘貼到磁盤位置,等下次重啟的時候,仍會保證添加的磁盤存在。 2 添加磁盤分區(qū) 大部分情況,添加磁盤并不能滿足我們的需求,我們需要對原有的磁盤做操作,添加磁盤容量或者分區(qū)容量。 首先使用qemu-img resize 靜態(tài)的增加磁盤容量(所謂的靜態(tài),就是將虛擬機(jī)關(guān)閉,然后做操作) 查看磁盤信息 - qemu-img info domain_disk
復(fù)制代碼
啟動虛擬機(jī)查看是否在原有的分區(qū)上有多余的容量,創(chuàng)建分區(qū),格式化,掛載。 但是這種操作的意義不大,真心不大,因為在虛擬機(jī)上的磁盤不是像物理盤磁盤,增加分區(qū),不如添加磁盤來得實在。而且,不要講雞蛋放到一個籃子里的道理我們都懂。 經(jīng)常遇到的情況可能是增加分區(qū)的容量,也就是說我們的根分區(qū)不夠了,要增加根分區(qū)的容量,亦或是我們的data分區(qū)太小了,需要擴(kuò)容。 下面針對兩種情況對磁盤進(jìn)行操作。 如果你使用的是LVM,那指直接把視線上移,因為LVM自己的擴(kuò)容能力是非常強(qiáng)大的,可以拿新的磁盤空間,多余的分區(qū)也好,磁盤也好,創(chuàng)建pv,添加到vg,擴(kuò)展lv,然后resize2fs 一下即可。 如果不是LVM的話,只是稍微麻煩一點(diǎn),在虛擬機(jī)的目錄下創(chuàng)建一個新的磁盤,大小為你想擴(kuò)展的大小,比如我原先的磁盤是10G,現(xiàn)在想擴(kuò)展為20G。則創(chuàng)建一個20G 的新磁盤,然后使用libguestfish提供的工具virt-resize - qemu-img create new.img 20G
- virt-resize --expand /dev/sda1 old.img new.img
復(fù)制代碼
注:之前的帖子可以了解到guestfish對磁盤操作時使用的是獨(dú)立的命名空間,所以此處值得sda1 并不是宿主機(jī)上的sda1 而是虛擬磁盤中的第一個分區(qū)。
如果哪位朋友有針對于libguestfs更好的應(yīng)用思路,可以回復(fù),一起討論學(xué)習(xí)……
|