KVM是一個專題系列,建議按照順序閱讀這些文章,以便站在前文的基礎上去理解,專題鏈接如下:
前一篇文章中,我們通過圖形化界面,創建了第一個kvm虛擬機,在宿主機中查看虛擬機列表,如下
並且,我們知道,可以使用 virsh dominfo 命令查看kvm的概覽信息
上述信息只是一些概述信息,那么虛擬機的詳細信息在哪里呢?
虛擬機的詳細配置默認存放在宿主機的/etc/libvirt/qemu目錄中,進入此目錄中,查看所有文件,如下所示:
從上述信息中可以看出,此目錄中,有一個以kvm1虛擬機名為前綴的xml文件,這個kvm1.xml中存放的就是kvm1虛擬機的詳細配置,查看一下這個文件的內容,大致如下(如下示例省略了很多內容,以便展示):
聰明如你,一定已經看出來了,kvm1.xml其實就是kvm1這個虛擬機的配置文件,如果在宿主機上創建了多個虛擬機,那么在此路徑下,還能夠看到其他以對應虛擬機名開頭的.xml文件,如果我們想要查看kvm1的硬件配置,查看此文件准沒錯。
其實,如果想要修改kvm1虛擬機的硬件配置,只需要修改kvm1.xml中的內容就行了,修改成功后,當KVM再次加載此配置文件時,對應虛擬機的硬件配置就會發生改變,但是,需要注意的是,如果想要修改此配置文件的內容,不要直接通過編輯器(如Vim、Emacs、Nano等)打開此文件,因為直接通過編輯器修改的內容會被KVM覆蓋掉,如果想要修改虛擬機的硬件配置文件,需要使用一個專門的命令,這個命令就是 virsh edit
virsh edit 命令是專門用於修改虛擬機配置文件的命令,只需要使用此命令加上要修改的虛擬機的名稱,就可以編輯對應虛擬機的配置文件,比如,如果想要修改kvm1虛擬機的配置,只要執行如下命令即可
執行上述命令以后,你會發現,上述命令編輯的內容,其實就是/etc/libvirt/qemu/kvm1.xml這個配置文件中的內容,而且,細心如你肯定已經發現了,/etc/libvirt/qemu/kvm1.xml文件中早就給出了提示,這個文件的最上方有些注釋(注釋了一條WARNING信息),這條WARNING信息告訴我們,這個kvm1.xml文件是自動生成的(當我們創建虛擬機時,KVM會根據我們的設置自動生成此配置文件),不要直接編輯這個文件,因為如果直接編輯這個文件,更改的內容會被覆蓋、會丟失,如果想要修改虛擬機的配置,應該使用 virsh edit 命令。
當然,如果宿主機支持圖形化界面,通過virt-manager的圖形化界面去修改,是更加直觀的,不過這里描述的是一些原理,了解了這些原理以后,通過命令行,也可以修改對應的配置,最終的本質是一樣的。
如果只是想要查看配置文件的內容,不進行任何修改,其實也沒有必要使用virsh edit命令,也不用進入/etc/libvirt/qemu/目錄查看對應的配置文件,直接使用virsh dumpxml命令,加上虛擬機名,即可直接將配置文件的內容輸出到終端中,沒錯,virsh dumpxml命令就是用來導出備份虛擬機配置文件的,比如,想要查看kvm1虛擬機的配置,執行如下命令即可
從剛才的詳細配置文件中,可以看到如下<disk>
部分的代碼,如下代碼對應的是虛擬機硬盤的配置
從上述配置可以看出,虛擬機的磁盤鏡像路徑為/var/lib/libvirt/images/kvm1.qcow2
在通過KVM創建虛擬機時,如果沒有指定磁盤鏡像,那么磁盤鏡像默認存放在/var/lib/libvirt/images/目錄中,磁盤鏡像名以虛擬機名為前綴,以qcow2為后綴,qcow2是KVM默認使用的磁盤鏡像格式,它既是虛擬機的磁盤,又是虛擬機的鏡像,我們可以通過qcow2文件快速的實現虛擬機的遷移,如果你對vmware比較熟,可以類比着vmware默認的磁盤格式vmdk文件去理解。
查看一下/var/lib/libvirt/images/kvm1.qcow2文件的大小,如下
可以看到,kvm1.qcow2文件占用了宿主機21G的空間,這是因為我們在使用virt-manager的圖形化界面創建kvm1虛擬機時,指定了虛擬機的磁盤空間為20G,所以這個鏡像文件的大小就會20G起步,直接沾滿宿主機20G的空間,其實,在虛擬機中,是根本沒有使用到20G空間的,進入虛擬機,查看虛擬機的空間占用情況,如下
可以看到kvm1虛擬機中實際占用的空間不到2G,但是,宿主機中,空間直接就占用了20G,這種情況是非常不划算的,因為有的虛擬機如果沒有那么多數據,對應的磁盤空間就浪費了,只有一個虛擬機的情況下,這種浪費的情況可能不太明顯,但是如果創建了多個虛擬機,這種情況就比較明顯了。
我們知道,在使用vmware時,如果為虛擬機創建vmdk格式的磁盤,會有一個“立即分配所有磁盤空間”選項,如果勾選這個選項,虛擬機磁盤的大小就會被分配滿,反之則不會,比如,我們指定虛擬機的磁盤大小為50G,如果勾選了“立即分配所有磁盤空間”選項,虛擬機磁盤就會直接占用宿主機50G的空間,如果不勾選“立即分配所有磁盤空間”選項,那么虛擬機磁盤的初始大小可能只有4G到6G左右,之后會隨着虛擬機的實際使用,動態的分配更多空間,直到虛擬機真正使用了50G,磁盤文件才會占用宿主機50G空間,直接分配所有磁盤空間的磁盤效率更高,動態分配磁盤空間的方式效率稍低。
其實,qcow2格式的磁盤也能夠動態的分配磁盤空間,只不過,通過virt-manager的圖形化界面創建的磁盤默認就是立即分配所有磁盤空間的,如果想要創建一個動態分配磁盤空間的磁盤,需要使用命令提前創建好對應的磁盤,創建磁盤命令如下。
qemu-img命令是一個磁盤鏡像管理工具,上述命令表示創建一個格式為qcow2的磁盤(-f選項用於指定磁盤格式),磁盤名為testdisk1.qcow2,磁盤大小為50G,由於我沒有指定路徑,所以testdisk1.qcow2文件會在當前目錄下創建,除了qcow2格式,qemu-img還支持很多種其他的磁盤格式,支持的格式如下
使用qemu-img命令創建qcow2磁盤時,可以指定磁盤空間的預分配策略,當不指定空間預分配策略時,默認就是不會進行預分配空間的(也就是說,不會直接分配所有空間,默認是動態分配空間的),具體的空間預分配策略咱們后面再聊,先來看看默認創建的磁盤文件,占用了宿主機多大空間,如下
可以看到,文件剛剛被創建出來時,是很小的,如果我們想要在宿主機中查看這個磁盤最大能夠占用多少空間,可以使用qemu-img info命令查看,如下
可以看到,這個磁盤鏡像的virtual size為50G,目前只占用了宿主機196k的空間。
磁盤鏡像的話題就先粗略的聊到這里,現在聊聊怎樣通過命令行創建虛擬機,之前我們已經通過virt-manager圖形化界面創建了虛擬機,現在通過命令來試一試,virt-install命令可以直接在命令行創建虛擬機,示例如下
上述virt-install命令各個參數含義如下
–name=kvm2表示為創建的虛擬機命名為kvm2。
–vcpus=2表示設置虛擬機cpu有2個核心。
–memory=2048表示設置內存為2G。
–location=/data/iso/CentOS-7-x86_64-DVD-2009.iso表示使用本地iso鏡像安裝虛擬機。
–disk path=/var/lib/libvirt/images/kvm2.qcow2表示指定虛擬機的磁盤鏡像的路徑,示例中的路徑是我提前通過qemu-img命令創建出來的磁盤,咱們做實驗的時候需要自行創建好,如果不想提前創建好磁盤,也可以使用–disk size=50代替–disk path=/var/lib/libvirt/images/kvm2.qcow2,如果使用–disk size=50這個設置,virt-install命令會在/var/lib/libvirt/images/目錄中自動創建一個50G的qcow2磁盤,磁盤的前綴名和虛擬機名相同,這個磁盤是預分配所有磁盤空間的,也就是說,會直接占用宿主機50G的磁盤空間。
–network network=default表示使用kvm的默認網絡,默認網絡就是前一篇文章中提到的IP段為192.168.122.0/24的NAT網絡。
–graphics none表示我們安裝的過程中,需要使用的圖形化控制台,由於我們此處模擬的是純命令行安裝,所以圖形化控制台指定為none,表示不使用圖形化控制台安裝虛擬機。
–extra-args=’console=ttyS0’表示為創建的虛擬機指定內核啟動時的內核參數,此處為虛擬機內核添加的參數為console=ttyS0,也就是說,當安裝虛擬機時,分配一個ttyS0的虛擬終端,因為我們沒有使用圖形化控制台安裝,所以要分配一個命令行的虛擬終端,以便執行安裝操作和安裝完成后的登錄、執行命令等操作。
上述命令執行后,會卡在如下圖的位置,下面這個純文本的控制台布局是不是很眼熟,沒錯,下圖中的文本就是和圖形化中的配置選項位置對應的,具體的安裝操作,這里就不再贅述了,根據提示安裝即可,這里說明一下,在通過下圖中的命令行界面安裝centos7系統時,無法為虛擬機磁盤自定義分區,只能使用默認的分區方案,此處只是為了演示安裝的方法,我一般不會這樣安裝系統,而是將一個安裝好的虛擬機鏡像當做模板,通過模板快速的創建新的虛擬機,這些操作后面再聊。
剛才執行的virt-install命令時,只添加了必要參數,還有很多優化性能的參數沒有使用,所以創建出的虛擬機的磁盤性能和網絡性能都比較一般,此處只是為了方便演示,先理解,再慢慢的豐富這些參數。
當我們通過上述方式安裝完新的kvm2虛擬機以后,會自動連入到一個kvm2虛擬機的控制台,登錄后即可在虛擬機中執行命令,如果你想要退出這個控制台,按住 ctrl鍵 和 ]鍵 即可退出,如果想要在宿主機中,再次登錄kvm2虛擬機的控制台,只需要在宿主機中執行virsh console kvm2命令即可,這樣就能在無法遠程虛擬機時,通過宿主機登錄到虛擬機進行操作了,如下圖所示
上述virsh console命令只能對kvm2虛擬機生效,我們之前創建的kvm1虛擬機是無法通過此命令進行連接的,這是因為,我們在創建kvm2虛擬機時,就已經為kvm2的內核傳入了參數,在kvm2內核啟動時分配了一個終端,而在創建kvm1時,是使用圖形化界面創建的,默認沒有為kvm1的內核傳入任何參數,所以,kvm1內核啟動時,是不會分配虛擬終端的,我們可以通過圖形化的界面或者遠程ssh連接登錄到kvm1虛擬機內,修改內核參數,咱們示例中安裝的是centos7的虛擬機,所以可以在虛擬機中直接執行如下命令(不同的虛擬機系統方法可能所有差異,重要環境提前做好備份),修改所有內核的參數:
修改后重啟虛擬機,即可在宿主機中通過virsh console命令直連到虛擬機的控制台了。
這篇文章先總結到這里,之后咱們在聊。