kvm總結(2) : 配置文件和磁盤


KVM是一個專題系列,建議按照順序閱讀這些文章,以便站在前文的基礎上去理解,專題鏈接如下:

https://www.zsythink.net/archives/tag/kvm

前一篇文章中,我們通過圖形化界面,創建了第一個kvm虛擬機,在宿主機中查看虛擬機列表,如下

[root@cos7 ~]# virsh list --all
Id Name State
----------------------------------------------------
1 kvm1 running

並且,我們知道,可以使用 virsh dominfo 命令查看kvm的概覽信息

[root@cos7 ~]# virsh dominfo kvm1
Id: 1
Name: kvm1
UUID: e79f8f39-9257-4138-a061-fe8b905e6a7b
OS Type: hvm
State: running
CPU(s): 2
CPU time: 157.6s
Max memory: 2097152 KiB
Used memory: 2097152 KiB
Persistent: yes
Autostart: enable
Managed save: no
Security model: none
Security DOI: 0

上述信息只是一些概述信息,那么虛擬機的詳細信息在哪里呢?
虛擬機的詳細配置默認存放在宿主機的/etc/libvirt/qemu目錄中,進入此目錄中,查看所有文件,如下所示:

[root@cos7 ~]# cd /etc/libvirt/qemu
[root@cos7 qemu]# ls -l
total 8
drwxr-xr-x 2 root root 22 Sep 28 17:57 autostart
-rw------- 1 root root 4568 Sep 28 14:44 kvm1.xml
drwx------ 3 root root 42 Sep 26 19:31 networks

從上述信息中可以看出,此目錄中,有一個以kvm1虛擬機名為前綴的xml文件,這個kvm1.xml中存放的就是kvm1虛擬機的詳細配置,查看一下這個文件的內容,大致如下(如下示例省略了很多內容,以便展示):

[root@cos7 qemu]# cat kvm1.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit kvm1
or other application using the libvirt API.
-->
 
<domain type='kvm'>
<name>kvm1</name>
<uuid>e79f8f39-9257-4138-a061-fe8b905e6a7b</uuid>
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
······
<cpu mode='host-model' check='partial'>
<model fallback='allow'/>
</cpu>
······
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/kvm1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
······
<interface type='network'>
<mac address='52:54:00:a4:35:b2'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
······
</devices>
</domain>

聰明如你,一定已經看出來了,kvm1.xml其實就是kvm1這個虛擬機的配置文件,如果在宿主機上創建了多個虛擬機,那么在此路徑下,還能夠看到其他以對應虛擬機名開頭的.xml文件,如果我們想要查看kvm1的硬件配置,查看此文件准沒錯。
其實,如果想要修改kvm1虛擬機的硬件配置,只需要修改kvm1.xml中的內容就行了,修改成功后,當KVM再次加載此配置文件時,對應虛擬機的硬件配置就會發生改變,但是,需要注意的是,如果想要修改此配置文件的內容,不要直接通過編輯器(如Vim、Emacs、Nano等)打開此文件,因為直接通過編輯器修改的內容會被KVM覆蓋掉,如果想要修改虛擬機的硬件配置文件,需要使用一個專門的命令,這個命令就是 virsh edit

virsh edit 命令是專門用於修改虛擬機配置文件的命令,只需要使用此命令加上要修改的虛擬機的名稱,就可以編輯對應虛擬機的配置文件,比如,如果想要修改kvm1虛擬機的配置,只要執行如下命令即可

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虛擬機的配置,執行如下命令即可

virsh dumpxml kvm1

從剛才的詳細配置文件中,可以看到如下<disk>部分的代碼,如下代碼對應的是虛擬機硬盤的配置

<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/kvm1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</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文件的大小,如下

[root@cos7 opt]# ll -h /var/lib/libvirt/images/kvm1.qcow2
-rw------- 1 qemu qemu 21G Oct 9 13:03 /var/lib/libvirt/images/kvm1.qcow2

可以看到,kvm1.qcow2文件占用了宿主機21G的空間,這是因為我們在使用virt-manager的圖形化界面創建kvm1虛擬機時,指定了虛擬機的磁盤空間為20G,所以這個鏡像文件的大小就會20G起步,直接沾滿宿主機20G的空間,其實,在虛擬機中,是根本沒有使用到20G空間的,進入虛擬機,查看虛擬機的空間占用情況,如下

[root@kvm1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.6M 911M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/vda3 19G 1.4G 18G 8% /
/dev/vda1 497M 135M 362M 28% /boot
tmpfs 184M 0 184M 0% /run/user/0

可以看到kvm1虛擬機中實際占用的空間不到2G,但是,宿主機中,空間直接就占用了20G,這種情況是非常不划算的,因為有的虛擬機如果沒有那么多數據,對應的磁盤空間就浪費了,只有一個虛擬機的情況下,這種浪費的情況可能不太明顯,但是如果創建了多個虛擬機,這種情況就比較明顯了。

我們知道,在使用vmware時,如果為虛擬機創建vmdk格式的磁盤,會有一個“立即分配所有磁盤空間”選項,如果勾選這個選項,虛擬機磁盤的大小就會被分配滿,反之則不會,比如,我們指定虛擬機的磁盤大小為50G,如果勾選了“立即分配所有磁盤空間”選項,虛擬機磁盤就會直接占用宿主機50G的空間,如果不勾選“立即分配所有磁盤空間”選項,那么虛擬機磁盤的初始大小可能只有4G到6G左右,之后會隨着虛擬機的實際使用,動態的分配更多空間,直到虛擬機真正使用了50G,磁盤文件才會占用宿主機50G空間,直接分配所有磁盤空間的磁盤效率更高,動態分配磁盤空間的方式效率稍低。

其實,qcow2格式的磁盤也能夠動態的分配磁盤空間,只不過,通過virt-manager的圖形化界面創建的磁盤默認就是立即分配所有磁盤空間的,如果想要創建一個動態分配磁盤空間的磁盤,需要使用命令提前創建好對應的磁盤,創建磁盤命令如下。

qemu-img create -f qcow2 testdisk1.qcow2 50G

qemu-img命令是一個磁盤鏡像管理工具,上述命令表示創建一個格式為qcow2的磁盤(-f選項用於指定磁盤格式),磁盤名為testdisk1.qcow2,磁盤大小為50G,由於我沒有指定路徑,所以testdisk1.qcow2文件會在當前目錄下創建,除了qcow2格式,qemu-img還支持很多種其他的磁盤格式,支持的格式如下

[root@cos7 opt]# qemu-img -h | grep Supported
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

使用qemu-img命令創建qcow2磁盤時,可以指定磁盤空間的預分配策略,當不指定空間預分配策略時,默認就是不會進行預分配空間的(也就是說,不會直接分配所有空間,默認是動態分配空間的),具體的空間預分配策略咱們后面再聊,先來看看默認創建的磁盤文件,占用了宿主機多大空間,如下

[root@cos7 opt]# ll -h testdisk1.qcow2
-rw-r--r-- 1 root root 193K Oct 9 15:07 testdisk1.qcow2

可以看到,文件剛剛被創建出來時,是很小的,如果我們想要在宿主機中查看這個磁盤最大能夠占用多少空間,可以使用qemu-img info命令查看,如下

[root@cos7 opt]# qemu-img info testdisk1.qcow2
image: testdisk1.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false

可以看到,這個磁盤鏡像的virtual size為50G,目前只占用了宿主機196k的空間。

磁盤鏡像的話題就先粗略的聊到這里,現在聊聊怎樣通過命令行創建虛擬機,之前我們已經通過virt-manager圖形化界面創建了虛擬機,現在通過命令來試一試,virt-install命令可以直接在命令行創建虛擬機,示例如下

virt-install --name=kvm2 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2 --network network=default --graphics none --extra-args='console=ttyS0'

上述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的虛擬機,所以可以在虛擬機中直接執行如下命令(不同的虛擬機系統方法可能所有差異,重要環境提前做好備份),修改所有內核的參數:

grubby --update-kernel=ALL --args="console=ttyS0"

修改后重啟虛擬機,即可在宿主機中通過virsh console命令直連到虛擬機的控制台了。

這篇文章先總結到這里,之后咱們在聊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM