KVM虛擬化
KVM全稱:Kernel-based Virtual machine
KVM內(nèi)存壓縮技術(shù): 相同的內(nèi)容只占用1份內(nèi)存,所以KVM虛擬機可以超邁,尤其是在做虛擬機克隆的時候。
環(huán)境要求:Centos7、4G 內(nèi)存、開啟CPU虛擬化
管理工具安裝:yum install libvirt virt-install qemu-kvm -y
libvirt作用:虛擬機的管理軟件
libvirt可管理:kvm、xen、qumu、lxc...
virt virt-install virt-clone 作用:虛擬機的安裝工具和克隆工具
qumu-kvm qumu-img(qcow2,raw)作用:管理虛擬機的虛擬磁盤
systemctl start libvirtd.service
systemctl enable libvirtd.service
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name c7 --memory 1024 --vcpus 1 --disk /opt/centos3.raw,format=raw,size=5 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
1.常用命令:
virsh list
virsh list --all 查看虛擬機
virsh reboot 重啟虛擬機
virsh shutdown 關(guān)機
virsh destroy 拔電關(guān)機
virsh start 開機
virsh undefine 刪除虛擬機
virsh define 導入虛擬機配置文件
virsh dumpxml 導出虛擬機的備份文件;舉例:virsh dumpxml centos7 >c7.xml
virsh edit 修改虛擬機配置文件,此命令帶語法檢查功能
virsh domrename 重命名虛擬機
virsh suspend 掛起虛擬機
virsh resume 掛起后,重新恢復虛擬機
virsh vncdisplay 查看虛擬機短端口號
virsh autostart 設(shè)置虛擬機為開機自啟,前提是服務(wù)器設(shè)置開機自啟systemctl status libvirtd.service
virsh console 使用console 方式連接虛擬機
#開機自啟,其實就是給虛擬機的配置文件設(shè)置軟連接,當刪除軟連接后開機自啟將失效,需要重新定義開機自啟,存放軟連接文件位置:/etc/libvirt/qemu/autostart
grubby --update-kernel=ALL --args="console=ttyS0,115200n8" #登錄虛擬機,輸入此修改內(nèi)核參數(shù)的命令,重啟虛擬機,使用virsh console 虛擬機名稱 連接到虛擬機。
2.虛擬機磁盤格式:
raw:裸格式,占用空間比較大,不支持快照功能,不方便傳輸,性能較好,總50G,占用50G
qcow2:cow(copy on write )占用空間小,支持快照,性能比raw差一點,方便傳輸,總50G 占用2G
#qcow2格式創(chuàng)建虛擬機:
#區(qū)別于raw格式創(chuàng)建虛擬機:--disk /opt/wb02.qcow2,format=qcow2,這兩個字段為qcow2,其他參數(shù)與raw格式創(chuàng)建虛擬機一樣。
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name wb02 --memory 1024 --vcpus 1 --disk /opt/wb02.qcow2,format=qcow2,size=5 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
3.磁盤工具常用命令:
#查看虛擬硬盤信息:qemu-img info
qemu-img info cengos7.raw
#創(chuàng)建虛擬硬盤:qemu-img create
創(chuàng)建qcow2格式磁盤(創(chuàng)建在當前路徑下): qemu-img create -f qcow2 centos7.qcow2 1G
創(chuàng)建raw格式磁盤(創(chuàng)建在當前路徑下): qemu-img create c7.raw 1G
#對虛擬硬盤擴容:qume-img resize
#qcow2格式的虛擬磁盤只能擴容,不能縮容,raw格式的虛擬磁盤支持縮容,但是一般不建議縮容。
將centos7.qcow2磁盤文件擴容4G:qemu-img resize centos7.qcow2 +4G
將centos7.qcow2磁盤文件擴容到6G:qemu-img resize centos7.qcow2 6G
擴容raw格式的的磁盤文件: qemu-img resize c7.raw 5G
縮容rwa格式的虛擬磁盤(原有5G):qemu-img resize c7.raw 1G
#轉(zhuǎn)換磁盤格式的命令 qemu-img convert
將raw格式的虛擬磁盤轉(zhuǎn)換為qcow2格式:qemu-img convert -f raw -O qcow2 c7.raw c7.qcow2
#虛擬磁盤格式轉(zhuǎn)換完成后,需要停機修改配置文件中的硬盤格式才能啟用轉(zhuǎn)換后的虛擬磁盤。
修改下面2行:
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
4.快照管理:
創(chuàng)建快照: virsh snapshot-create-as wb01 --name 基礎(chǔ)優(yōu)化_ok
查看快照:virsh snapshot-list wb01
還原快照:virsh snapshot-revert wb01 --snapshotname 基礎(chǔ)優(yōu)化_ok
刪除快照:virsh snapshot-delete wb01 test_ces
#raw不支持做快照,qcow2支持做快照,并且快照保存在qcow2的磁盤文件中。
5.完整克?。?/h2>
自動克?。簐irt-clone -o wb01 -n lb01 --auto-clone
手動克?。?#克隆的虛擬機不要有快照,直接cp過去的虛擬機如果有快照的話,無法啟動。
cp lb01.qcow2 lb01-clone.qcow2
virsh dumpxml lb01 >lb01-clone.xml
mv lb01-clone.xml /etc/libvirt/qemu
vim /etc/libvirt/qemu/lb01-clone.xml
#修改虛擬機名字
#刪除虛擬機uuid
#刪除mac地址
#修改磁盤路徑
virsh define lb01-clone.xml
virsh start lb01-clone
6.鏈接克隆:
#生成虛擬機磁盤文件
qemu-img create -f qcow2 -b /opt/wb01.qcow2 /opt/wb02.qcow2
cp /etc/libvirt/qemu/wb01.xml /etc/libvirt/qemu/wb02.xml
vim /etc/libvirt/qemu/wb02.xml
#修改虛擬機名字
#刪除虛擬機uuid
#刪除mac地址
#修改磁盤路徑
virsh define wb02.xml
virsh list --all
virsh start wb02
[root@node01 /etc/libvirt/qemu]# virsh dumpxml wb01 | grep "qcow2"
<driver name='qemu' type='qcow2'/>
<source file='/opt/wb01.qcow2'/>
[root@node01 /etc/libvirt/qemu]# virsh dumpxml wb02 | grep "qcow2"
<driver name='qemu' type='qcow2'/>
<source file='/opt/wb02.qcow2'/>
<source file='/opt/wb01.qcow2'/> #基于wb01磁盤進行克隆。
[root@node01 /etc/libvirt/qemu]#
7.自動鏈接克隆腳本
#!/bin/bash
#new_kvm=$2
#old_kvm=$1
read -p "請輸入被克隆的虛擬機名稱:" old_kvm
read -p "請輸入新的虛擬機名稱:" new_kvm
old_kvm_disk=`virsh dumpxml wb01 | sed -r -n "s#(<source file=.)(.*)(./>)#\2#p" |tr -d " "`
old_kvm_disk_path=`dirname $old_kvm_disk`
qemu-img create -f qcow2 -b $old_kvm_disk $old_kvm_disk_path/${new_kvm}.qcow2
virsh dumpxml $old_kvm>/tmp/${new_kvm}.xml
#修改kv名稱
sed -ri "s#(<name>)(.*)(</name>)#\1${new_kvm}\3#g" /tmp/${new_kvm}.xml
#刪除虛擬機uuid
sed -i '/uuid/d' /tmp/${new_kvm}.xml
#刪除mac地址
sed -ri '/mac address/d' /tmp/${new_kvm}.xml
#修改磁盤路徑
sed -ri "s#(<source file=.)(.*)(./>)#\1/opt/${new_kvm}.qcow2\3#g" /tmp/${new_kvm}.xml
virsh define /tmp/${new_kvm}.xml
virsh start ${new_kvm}
8.kvm橋接模式
自動克?。簐irt-clone -o wb01 -n lb01 --auto-clone
手動克?。?#克隆的虛擬機不要有快照,直接cp過去的虛擬機如果有快照的話,無法啟動。
cp lb01.qcow2 lb01-clone.qcow2
virsh dumpxml lb01 >lb01-clone.xml
mv lb01-clone.xml /etc/libvirt/qemu
vim /etc/libvirt/qemu/lb01-clone.xml
#修改虛擬機名字
#刪除虛擬機uuid
#刪除mac地址
#修改磁盤路徑
virsh define lb01-clone.xml
virsh start lb01-clone
#生成虛擬機磁盤文件
qemu-img create -f qcow2 -b /opt/wb01.qcow2 /opt/wb02.qcow2
cp /etc/libvirt/qemu/wb01.xml /etc/libvirt/qemu/wb02.xml
vim /etc/libvirt/qemu/wb02.xml
#修改虛擬機名字
#刪除虛擬機uuid
#刪除mac地址
#修改磁盤路徑
virsh define wb02.xml
virsh list --all
virsh start wb02
[root@node01 /etc/libvirt/qemu]# virsh dumpxml wb01 | grep "qcow2"
<driver name='qemu' type='qcow2'/>
<source file='/opt/wb01.qcow2'/>
[root@node01 /etc/libvirt/qemu]# virsh dumpxml wb02 | grep "qcow2"
<driver name='qemu' type='qcow2'/>
<source file='/opt/wb02.qcow2'/>
<source file='/opt/wb01.qcow2'/> #基于wb01磁盤進行克隆。
[root@node01 /etc/libvirt/qemu]#
#!/bin/bash
#new_kvm=$2
#old_kvm=$1
read -p "請輸入被克隆的虛擬機名稱:" old_kvm
read -p "請輸入新的虛擬機名稱:" new_kvm
old_kvm_disk=`virsh dumpxml wb01 | sed -r -n "s#(<source file=.)(.*)(./>)#\2#p" |tr -d " "`
old_kvm_disk_path=`dirname $old_kvm_disk`
qemu-img create -f qcow2 -b $old_kvm_disk $old_kvm_disk_path/${new_kvm}.qcow2
virsh dumpxml $old_kvm>/tmp/${new_kvm}.xml
#修改kv名稱
sed -ri "s#(<name>)(.*)(</name>)#\1${new_kvm}\3#g" /tmp/${new_kvm}.xml
#刪除虛擬機uuid
sed -i '/uuid/d' /tmp/${new_kvm}.xml
#刪除mac地址
sed -ri '/mac address/d' /tmp/${new_kvm}.xml
#修改磁盤路徑
sed -ri "s#(<source file=.)(.*)(./>)#\1/opt/${new_kvm}.qcow2\3#g" /tmp/${new_kvm}.xml
virsh define /tmp/${new_kvm}.xml
virsh start ${new_kvm}
默認kvm虛擬機不支持橋接模式
#創(chuàng)建橋接網(wǎng)卡的命令
virsh iface-bridge eth0 br0
修改虛擬機配置文件
<interface type='bridge'>
<source network='br0'/>
#取消橋接網(wǎng)卡的命令
virsh iface-unbridge br0
9.虛擬機網(wǎng)絡(luò)模式
9.1新建虛擬機使用橋接模式
默認NAT模式(network )
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name c7 --memory 1024 --vcpus 1 --disk /opt/centos3.raw,format=raw,size=5 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
橋接模式(bridge)
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name c7 --memory 1024 --vcpus 1 --disk /opt/centos3.raw,format=raw,size=5 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
9.2 將已有的虛擬機配置改為橋接模式
a.創(chuàng)建橋接網(wǎng)路
b.virsh edit lb01
修改下面兩行
<interface type='bridge'>
<source network='br0'/>
c.重啟kvm虛擬機
d.重啟kvm虛擬機后還獲取不到就重啟網(wǎng)卡或者用dhclint 命令重新獲取dhcp地址
10.熱添加硬盤和擴容
10.1熱添加一塊硬盤
a.創(chuàng)建一塊硬盤
qemu-img create -f qcow2 /opt/wb01_add.qcow2 2G
b.將硬盤添加給kvm;默認是以raw格式添加磁盤,所以在擴容qcow2的磁盤時,需要指明磁盤類型
virsh attach-disk wb01 /opt/wb01_add.qcow2 vdb
#完整添加磁盤命令
virsh attach-disk wb01 /opt/wb01_add.qcow2 vdb --subdriver qcow2
#擴容硬盤命令后面需要跟3個參數(shù) :virsh attach-disk 虛擬機名稱 磁盤格式 目標盤符
root@node01 /opt]# virsh attach-disk
錯誤:命令 'attach-disk' 需要 <domain> 選項 #虛擬機名稱
錯誤:命令 'attach-disk' 需要 <source> 選項 #磁盤文件
錯誤:命令 'attach-disk' 需要 <target> 選項 #目標盤符
c.剝離硬盤
virsh detach-disk wb01 vdb
10.2硬盤擴容
擴容操作需要規(guī)范化操作!?。?/em>
a.卸載分區(qū)(虛擬機中的中操作)
[root@localhost.localdomain /add_disk]# umount /dev/vdb
b.剝離硬盤(宿主機中操作)
[root@node01 /opt]# virsh detach-disk wb01 vdb
c.擴容硬盤容量(宿主機中操作)
[root@node01 /opt]# qemu-img resize wb01_add.qcow2 4G
d.添加磁盤(宿主機中操作)
[root@node01 /opt]# virsh attach-disk wb01 /opt/wb01_add.qcow2 vdb --subdriver qcow2
e.掛載分區(qū)(虛擬機中操作)
[root@localhost.localdomain ~]# mount /dev/vdb /add_disk/
f.更新硬盤信息(虛擬機中操作)
[root@localhost.localdomain ~]# xfs_growfs /dev/vdb
g.查看硬盤更新情況
[root@localhost.localdomain ~]# df -h
10.3 以上添加硬盤\刪除硬盤都是臨時生效,想要永久生效需要添加 --config 參數(shù),如果需要臨時生效+永久生效,需要執(zhí)行兩條命令。
virsh attach-disk wb01 /opt/wb01_add.qcow2 vdb --subdriver qcow2
virsh attach-disk wb01 /opt/wb01_add.qcow2 vdb --subdriver qcow2 --config
11.熱添加網(wǎng)卡
#給lb01添加一塊橋接模式的網(wǎng)卡
virsh attach-interface lb01 bridge br0
#給lb01添加一塊NAT模式的網(wǎng)卡
virsh attach-interface lb01 network default
# --model virtio 指定網(wǎng)卡類型,添加后的網(wǎng)卡名稱為eth0\eth1
virsh attach-interface lb01 network default --model virtio
#刪除網(wǎng)卡需要指定網(wǎng)絡(luò)類型
virsh detach-interface lb01 netwokr
11.1當一臺虛擬機有多個相同類型的網(wǎng)卡時,需要指明mac地址 才能刪除對應(yīng)的網(wǎng)卡
[root@kvm01 ~]# virsh detach-interface lb01 netwokr --mac 52:54:00:51:b8:91
錯誤:No interface found whose type is netwokr
錯誤:分離接口失敗
[root@kvm01 ~]# virsh detach-interface lb01 network
錯誤:域有 2 個接口。請使用 --mac 指定要分離的接口。
錯誤:分離接口失敗
[root@kvm01 ~]# virsh detach-interface lb01 network --mac 52:54:00:51:b8:91
成功分離接口
[root@kvm01 ~]#
11.2想要修改網(wǎng)卡的原有類型,只能刪除網(wǎng)卡后再重新添加網(wǎng)卡,在添加網(wǎng)卡時聲明所需要的網(wǎng)絡(luò)類型。
11.3 以上添加\刪除網(wǎng)卡,都是臨時生效,需要永久生效需要 加--config 參數(shù),如果需要臨時生效+永久生效,需要執(zhí)行兩條命令(如果添加網(wǎng)卡的時候使用的--config參數(shù),那么刪除的時候也需要添加--config 才能永久刪除,同理立即刪除+永久刪除需要執(zhí)行兩條刪除命令)。
#臨時+永久添加網(wǎng)卡
virsh attach-interface lb01 network default --model virtio
virsh attach-interface lb01 network default --model virtio --config
#臨時+永久刪除網(wǎng)卡
virsh detach-interface lb01 network --mac 52:54:00:51:b8:91
virsh detach-interface lb01 network --mac 52:54:00:51:b8:91 --config
## 12.熱添加內(nèi)存
#### 12.1擴容\縮容內(nèi)存
```shell
virsh setmem lb01 --size 256M #臨時修改虛擬機的內(nèi)存大小
virsh setmem lb01 --size 1024M --config #永久修改虛擬機內(nèi)存
#虛擬機的內(nèi)存調(diào)整,不得大于最大值(下面第一行),如果必須要調(diào)整,需要修改配置文件中的最大值(下面第一行,建議使用命令修改。)
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
virsh setmaxmem lb01 --size 4096M #臨時修改虛擬機的最大值(必須使用destroy 關(guān)機才能修改,永久修改)
12.2 內(nèi)存擴容\縮容注意事項
a.內(nèi)存縮容最小不得小于128M(最小也要滿足內(nèi)容運行的所需內(nèi)存)
b.想要修改內(nèi)存最大值,需要使用destroy 命令關(guān)機后,才能修改內(nèi)存最大值。(配置文件)
c.內(nèi)存最大值不可以超過宿主機內(nèi)存,否則開機時會出現(xiàn)如下報錯。
[root@kvm01 ~]# virsh start lb01
錯誤:internal error: process exited while connecting to monitor: Cannot set up guest memory 'pc.ram': Cannot allocate memory
d. 虛擬機擴容內(nèi)存時不得超過虛擬機剩余內(nèi)存,否則虛擬機會卡死。
13.熱添加CPU
virsh setvcpus lb01 --maximum 4 --config #設(shè)置虛擬機CPU最大核心數(shù)(需要關(guān)機重啟,才能生效,永久修改)
virsh setvcpus lb01 2 #設(shè)置cpu的核心數(shù),(臨時添加)
virsh setvcpu #設(shè)置CPU屬性,是否支持虛擬化,幾乎用不到。
14.kvm虛擬機冷遷移
冷遷移:關(guān)機后遷移,其實就是scp 虛擬機的配置文件和磁盤文件。
首先找一臺與原來環(huán)境一樣的機器。
然后將KVM虛擬機的配置文件+磁盤文件copy到與原機器相同的路徑下(根據(jù)kvm 的配置文件中的磁盤和配置的路徑遷移)
執(zhí)行virsh virsh define @@@.xml
最后執(zhí)行 virsh start @@@
遷移時,如果遷移的是鏈接克隆的虛擬機,一定要把基礎(chǔ)磁盤一并遷移走才可以起來,否則就會出現(xiàn)如下報錯
error: Failed to start domain web02
error: Cannot access backing file '/opt/web01.qcow2' of storage file '/opt/web02.qcow2' (as uid:107, gid:107): No such file or directory
15.kvm虛擬機熱遷移
熱遷移:虛擬機在運行狀態(tài)完成宿主機之間的遷移
思考:虛擬機的遷移主要是遷移那個文件? 如何保證磁盤文件能夠快速遷移?
KVM虛擬機的遷移其實就是遷移配置文件和磁盤文件,虛擬機的配置文件比較小,可以做到秒遷移,磁盤文件一般來說比較大,如果做到秒遷移呢? 這里就要用到網(wǎng)絡(luò)文件存儲,也就是NFS(network file system ),將磁盤文件存儲到NFS目錄下,就解決了磁盤文件的遷移問題,當然也可以采用Glusterfs集群文件系統(tǒng)來實現(xiàn)。
#臨時熱遷移
[root@kvm01 ]# virsh migrate --live --verbose lb01 qemu+ssh://10.0.0.6/system --unsafe
#永久熱遷移
[root@kvm01 ]# virsh migrate --live --verbose wb01 qemu+ssh://10.0.0.6/system --unsafe --persistent --undefinesource