KVM虛擬化
## [1、 kvm虛擬化管理軟件的安裝](#1) ## ## [2、安裝一台KVM虛擬機](#2) ## ## [3、虛擬機virsh的日常管理和配置](#3) ## ## [4、KVM虛擬機開機自啟和console控制台登錄](#4) ## ## [5、kvm虛擬磁盤創建及格式轉換](#5) ## ## [6、快照管理](#6) ## ## [7、KVM虛擬機克隆](#7) ## ## [8、kvm虛擬機的橋接網絡](#8) ## ## [9、熱添加技術](#9) ## ## [10、KVM熱遷移](#10) ##
**KVM全稱:Kernel-based Virtual Machine ( 基於內核的虛擬機 ) **
前提:
1. 查看是否開啟CPU虛擬化
在宿主機下輸入: dmesg | grep kvm,輸出為:kvm: no hardware support 表示未開啟CPU虛擬化,需要在物理 機上打鈎,即執行步驟2
2. 在關機狀態下,啟用cpu虛擬化
編輯虛擬機設置 --> 處理器 --> 將 虛擬化Inter VT -xEPT 或 AMD-V/RVI(V) 選項打鈎
3. 開啟CPU虛擬化服務
開啟:modprobe kvm
檢查:cat /proc/cpuinfo |grep vmx # 查看是否有“vmx”,有則表示開啟成功
4. 加載KVM內核模塊
執行:modprobe kvm-intel
檢查:lsmod | grep kvm
結果如下,則表示加載成功:
[root@kvm ~]# lsmod | grep kvm
kvm_intel 183737 0
kvm 615914 1 kvm_intel
irqbypass 13503 1 kvm
1、 kvm虛擬化管理軟件的安裝
yum install libvirt virt-install qemu-kvm -y
安裝說明:
libvirt:虛擬機的管理軟件,可以管理KVM、xen、qemu、lxc...
virt-instal: 虛擬機的安裝工具和克隆工具
qemu-kvm qemu-img (qcow2,raw):管理虛擬機的虛擬磁盤
各種虛擬化軟件:
qemu 軟件純模擬全虛擬化軟件,特別慢!AIX,兼容性好!
xen(半) 性能特別好,需要使用專門修改之后的內核,兼容性差! redhat 5.5 xen
KVM(linux) 全虛擬機,它有硬件支持cpu,基於內核,而且不需要使用專門的內核,性能較好,兼容較好
2、安裝一台KVM虛擬機
准備:
本地:分發軟件TightVNC或者VNC Viewer 4.exe
宿主機: vnc 遠程的桌面管理工具 # 宿主機就是虛擬機所依賴的主機,我的宿主機IP:10.0.0.200
啟動虛擬機管理軟件 :systemctl start libvirtd.service
啟動:systemctl start libvirtd.service
停止:systemctl stop libvirtd.service
查看:systemctl status libvirtd.service
開機自啟動:systemctl enable libvirtd.service
上傳鏡像:
/opt/CentOS-7-x86_64-DVD-1810.iso
### 這是我設置的路徑,其他路徑也可以,但建議不要放在root下,防止訪問時權限不夠而出現 Permission denied
安裝KVM:( 建議虛擬機內存不要低於1024M,否則安裝系統特別慢!)
執行:
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
參數說明:
--virt-type kvm 虛擬化的類型(qemu)
--os-type=linux 系統類型
--os-variant rhel7 系統版本
--name centos7 虛擬機的名字
--memory 1024 虛擬機的內存
--vcpus 1 虛擬cpu的核數
--disk /opt/centos2.raw,format=raw,size=10 硬盤位置,存儲格式,硬盤大小
--cdrom /opt/CentOS-7-x86_64-DVD-1810.iso 光驅路徑/鏡像路徑(根據實際鏡像路徑配置)
--network network=default 使用默認NAT的網絡 使用宿主機IP
--graphics vnc,listen=0.0.0.0
--noautoconsole
磁盤格式:
raw: 不支持做快照,性能好
qcow2: 支持快照
安裝一台KVM虛擬機相當於創建2個文件:
磁盤文件:--disk /opt/centos2.raw,format=raw,size=10 硬盤位置,存儲格式,硬盤大小
配置文件:/etc/libvirt/qemu/虛擬機名.xml
-
安裝成功標志:
Starting install... Allocating 'centos2.raw' | 10 GB 00:00:00 Domain installation still in progress. You can reconnect to the console to complete the installation process.
-
安裝過程如果報錯如下:
ERROR Network not found: no network with matching name 'default' Removing disk 'centos2.raw' | 0 B 00:00:00 Domain installation does not appear to have been successful. If it was, you can restart your domain by running: virsh --connect qemu:///system start centos7 otherwise, please restart your installation.
則表示找不到默認網絡配置文件,解決辦法:https://wiki.libvirt.org/page/Networking
安裝成功后,使用VNC連接,10.0.0.200:5900(vnc默認端口為5900)
系統安裝:
連接成功后,使用上下鍵選擇 Install Centos7,回車,開始系統安裝!
系統語言使用默認英文,無需改變,直接下一步
①、配置 DATE & TIME:
②、配置 Kdump:
Kdump是個內核奔潰備份機制,需要占用內存
這里顯示要占用160M,如果給虛擬機分配的內存很大,則可以勾選,否則不建議勾選:
③、選擇網絡和主機 (network & host name)
④、選擇分區(Installation Destination)
然后點擊 Installation 開始安裝,安裝過程中必須設置 root 密碼
總結:
一、語言:
選擇默認(英語)
二、系統配置:
1、修改時區
2、關閉Kdump
3、網卡開機啟動
4、手動分區:只要一個標准根分區
三、開始安裝:
設置root密碼
四、安裝完成點擊reboot重啟
3、虛擬機virsh的日常管理和配置
-列表 list(--all)
virsh list : 只列出正在運行的虛擬機
virsh list --all : 列出所有虛擬機
-開機 start
virsh start 虛擬機名
-關機 shutdown
virsh shutdown 虛擬機名
-拔電源關機 destroy
virsh destroy 虛擬機名
-刪除 define
virsh undeine 虛擬機名
推薦:先destroy,在undefine
-導出配置dumpxml(默認導出是xml格式文件)
eg:virsh dumpxml centos7 >centos7-off.xml
-導入配置define
eg:virsh define centos7-off.xml
-重命名 domrename (低版本不支持)
virsh domrename 虛擬機名
-掛起 suspend
virsh suspend 虛擬機名
-恢復掛起 resume
virsh resume 虛擬機名
-查詢vnc端口號 vncdisplay (默認第一個虛擬機端口是0,第二個是1,第三個是2,...一次類推)
virsh vncdisplay 虛擬機名
4、KVM虛擬機開機自啟和console控制台登錄
- 設置開機啟動:
前提:將libvirtd服務設置為開機啟動 systemctl enable libvirtd.service
KVM開機啟動:virsh autostart 虛擬機名
取消開機啟動:virsh autostart --disable 虛擬機名
ps:
1、設置開啟動后會在 /etc/libvirt/qemu/ 下生成一個autostart文件夾
2、在autostart下會生成一個軟連接:虛擬機名.xml 指向配置文件
centos7.xml -> /etc/libvirt/qemu/centos7.xml
3、我們也可以為虛擬機手動創建一個指向該虛擬機配置文件的軟連接,使得該虛擬機可以開機自啟
ln -s /etc/libvirt/qemu/web01.xml /etc/libvirt/qemu/autostart/
- 設置console控制台登錄:
在虛擬機上執行以下命令來開啟console登錄:(宿主機無需做修改)
grubby --update-kernel=ALL --args="console=ttyS0,115200n8" # 修改內核參數
reboot
在虛擬機上進行修改時,需要手動輸入上述命令,或者vim 編輯 /boot/grub2/grub.cfg 文件,100行左右
此時虛擬機是無法進行粘貼輔助,我們可以通過宿主機ssh到虛擬機,然后進行修改(ip a 進行查看虛擬機ip)
ssh 虛擬機ip
在虛擬機上進行修改時,需要手動輸入上述命令,或者vim 編輯 /boot/grub2/grub.cfg 文件,100行左右,此時虛擬機 是無法進行粘貼輔助,我們可以通過宿主機ssh到虛擬機,然后進行修改(ip a 進行查看虛擬機ip),如下:
[root@kvm autostart]# ssh 192.168.122.235
The authenticity of host '192.168.122.235 (192.168.122.235)' can't be established.
ECDSA key fingerprint is SHA256:WS7XFnasPFwRohib6B+m7V6z9+5Pkh5IaornITRGGWo.
ECDSA key fingerprint is MD5:7a:9c:33:0e:ab:c1:a0:2f:d3:a9:96:71:d6:c1:c6:79.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.122.235' (ECDSA) to the list of known hosts.
root@192.168.122.235's password:
Last login: Sat Jun 8 17:42:58 2019
[root@localhost ~]#
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]#
[root@localhost ~]# reboot
Connection to 192.168.122.235 closed by remote host.
Connection to 192.168.122.235 closed.
-
設置成功后,在宿主機上通過命令登錄虛擬機 :
virsh console 虛擬機名
5、kvm虛擬磁盤創建及格式轉換
查看磁盤信息:qemu-img info 磁盤名
2種磁盤格式比較:
raw:裸格式,占用空間比較大,不支持快照功能,性能較好,不方便傳輸 總50G 占用2G,但傳輸還是要傳50G
qcow2:占用空間小,支持快照,性能比raw差一點,方便傳輸 總50G 占用2G,傳輸只傳2G
qcow2全稱:
q:qemu
cow:copy on write 寫時復制(用多少,分配多少)
創建一塊qcow2格式的虛擬硬盤:
創建一塊qcow2格式的虛擬硬盤:
qemu-img create -f qcow2 centos2.qcow2 10G
-f qcow2 : 聲明創建的磁盤文件格式為qcow2格式,如果不寫,則默認創建raw格式的磁盤文件
10G : 聲明創建的磁盤文件的大小
磁盤擴容:磁盤容量只能擴容,不能縮減,縮減很有可能會丟失數據
qemu-img resize /data/centos2.qcow2 +20G
+20G: 從原來的容量上增加20G
20G:將容量擴容到20G,不加"+"表示擴容到x,這里的x要大於原本容量
磁盤格式轉換
qemu-img convert -f raw -O qcow2 oldboy.raw oldboy.qcow2
convert [-f fmt] [-O output_fmt] filename output_filename
轉換 原格式 輸出格式 源文件路徑 輸出文件路徑
# 上述命令執行完成后,相當於轉換成了一個新格式的磁盤文件,源文件並沒有動,(相當於我們將word轉換成pdf,會新 產 生一個文件)
# 此時,KVM使用的還是原來的磁盤文件,我們需要修改配置文件的磁盤信息(修改配置信息,在關機狀態下修改)
virsh destroy web01
virsh edit web01:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/> # 將文件格式由raw修改為qcow2
<source file='/opt/centos.qcow2'/> # 將文件路徑修改為轉換后的文件路徑
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
virsh start web01
6、快照管理
創建快照virsh snapshot-create centos7 (這種方式創建的快照,以當前的時間戳作為快照名)
自定義快照名創建快照:virsh snapshot-create-as --name 快照名 centos7
查看快照virsh snapshot-list centos7
還原快照virsh snapshot-revert centos7 --snapshotname 快照名
刪除快照virsh snapshot-delete centos7 --snapshotname 快照名
1、raw不支持做快照,qcow2支持快照,並且快照就保存在qcow2的磁盤文件中
2、由於qcow2屬於用多少空間,分配多少,但當我們把快照刪除后,分配給快照的空間不會自動回收
3、如果要回收空余的空間,可使用:
qemu-img convert -c -f qcow2 -O qcow2 oldboy.qcow2 oldboy.qcow2 # -c 表示壓縮
7、KVM虛擬機克隆
-
完整克隆
virt-clone --auto-clone -o web01 -n web02 # 必須在關機或掛起狀態進行克隆,否則會報錯
-
鏈接克隆(依賴基礎磁盤文件,把變化的內容保存在一個新的qcow2文件中)
a:生成虛擬機磁盤文件 qemu-img create -f qcow2 -b /data/centos2.qcow2 /data/centos3.qcow2 # -b表示創建的是鏈接磁盤 b:生成虛擬機的配置文件 b1:先復制一份虛擬機的配置文件 cp /etc/libvirtd/qemu/centos7.xml /etc/libvirtd/qemu/centos7_link.xml b2: 修改配置 <name>49-web03</name> # 修改name <uuid>8e505e25-5175-46ab-a9f6-feaa096daaa4</uuid> # 刪除掉uuid,重啟會自動生成 <source file='/opt/49-web03.qcow2'/> #修改路徑 <mac address='52:54:00:4e:5b:89'/> # 刪除mac地址,重啟會自動生成 c:導入虛擬機並進行啟動測試 導入:virsh define /etc/libvirtd/qemu/centos7_link.xml 啟動:virsh start 虛擬機名 #這里的虛擬機名是我們在配置文件中修改name后的名稱 ps: 寫一個腳本,實現自動化鏈接克隆
8、kvm虛擬機的橋接網絡
檢查虛擬機網絡狀況,是否能上網?
從虛擬機ping外網:ping baidu.com ,發現不通
從宿主機ping外網:可以通
總結:當虛擬機將數據包轉發給宿主機時,宿主機沒有轉發到外網,說明宿主機沒有開啟內核轉發參數
解決:開啟內核轉發參數即可
開啟:sysctl net.ipv4.ip_forward = 1
關閉:sysctl net.ipv4.ip_forward = 0
為什么要為虛擬機創建橋接網絡?
- 當我們通過外網訪問虛擬機時,時無法直接訪問的,需要做端口映射
- 當虛擬機數量較大時,端口映射的方式也不適合,所以需要用到橋接網絡,使得可以通過外網直接訪問虛擬機
設置橋接網絡
創建橋接網卡(創建完成后建議重啟網卡)
virsh iface-bridge eth0 br0 # 取消橋接網卡 virsh iface-unbridge br0
- 新建橋接網絡的虛擬機
1、創建鏈接磁盤:
qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server2.qcow2
2、安裝虛擬機:
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
3、檢查
查看虛擬機ip是否是dhcp動態分配的ip,如果是,則表示創建成功!
ps: 如果 ping 不通 dhcp 的網關,建議重啟網卡:systemctl restart network=-0 (不行就多重啟幾次網卡)
- 將nat模式的虛擬機修改為橋接模式
1、修改配置文件:
<interface type='bridge'> # 將原來的type='network' 改為 type='bridge'
<mac address='52:54:00:55:aa:fa'/>
<source bridge='br0'/> # 將原來的network='default' 改為 bridge='br0'
2、在宿主機上,重啟虛擬機生效
virsh destroy 虛擬機名 # 線上環境建議使用shutdown平滑關機
virsh start 虛擬機名
3、檢查
查看虛擬機ip是否是dhcp動態分配的ip,如果是,則表示創建成功!
ps: 如果 ping 不通 dhcp 的網關,建議重啟網卡:systemctl restart network=-0 (不行就多重啟幾次網卡)
9、熱添加技術
KVM熱添加硬盤
1、宿主機-創建一塊硬盤
qemu-img create -f qcow2 /data/server1_add.qcow2 10G
2、宿主機-添加硬盤到虛擬機 (臨時和永久都執行)
臨時生效
virsh attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2
永久生效
virsh attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 --config
參數說明:
attach-disk:添加硬盤
web04:虛擬機名 (要指定給哪台虛擬機添加硬盤)
/opt/oldboy.qcow2:要添加的磁盤路徑 (這塊磁盤要事先創建好,所以第1步便是創建硬盤)
vdb:盤符名稱 (通過 fdisk -l 命令查看虛擬機已存在的盤符,新添加的盤符不能和已存在的相同)
--subdriver qcow2 : 指定所添加的盤符類型為qcow2格式,不指定則默認添加的是raw格式
3、虛擬機-格式化硬盤
mkfs.xfs /dev/vdb # 格式化dev下的vdb盤
4、虛擬機-掛載
mount /dev/vdb /mnt
5、虛擬機-查看
df -h
6、虛擬機-測試往里面寫東西
cp /etc/service /mnt
-
KVM擴容硬盤
1、虛擬機-卸載盤符 (保證其他人不能再往該盤符寫內容) umount /mnt 2、宿主機-剝離硬盤 virsh detach-disk server1 vdb # 剝離硬盤 虛擬機名 盤符名稱 3、宿主機-擴容硬盤 qemu-img resize /data/server1_add.qcow2 +20G 4、宿主機-添加硬盤到虛擬機 (臨時和永久都執行) 臨時生效(立即生效即可,因為該盤符本來就存在,無需永久生效) virsh attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 5、虛擬機-掛載盤符 (擴容不能格式化硬盤,否則原本的數據會丟失) mount /dev/vdb /mnt 但此時我們用df -h 查看磁盤空間,發現vdb還是原本的大小,並沒有擴容。原因是該盤符在最初被創建、格式化的時候,系統會分配Inode和block,此時該盤符所剩余的空間已經確定了。當我們進行擴容后,該盤符的信息還是最初格式化時的信息,所以該盤符能管理的空間還是原本大小,Inode和block沒有改變。所以vdb還是原本的大小。為了解決上述問題,系統提供了一個命令:xfs_growfs ,用來重新調整 Inode 和 block,見步驟6 6、重新調整盤符的 Inode 和 block xfs_growfs /dev/vdb # 也可以將 /dev/vdb 換成 /mnt
-
重新調整盤符的 Inode 和 block
在上面我們使用 xfs_growfs 來調整符的 Inode 和 block,這是因為該盤符的文件系統是 xfs
查看盤符的文件系統類型; [root@localhost ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 xfs 10G 1.1G 9.0G 11% / devtmpfs devtmpfs 486M 0 486M 0% /dev tmpfs tmpfs 496M 0 496M 0% /dev/shm tmpfs tmpfs 496M 6.7M 489M 2% /run tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup tmpfs tmpfs 100M 0 100M 0% /run/user/0 /dev/vdb xfs 30G 34M 30G 1% /mnt
但如果是盤符的文件系統類型是 ex4、ext3、ext2, 我們擴容完成后,使用 resize2fs來調整盤符的 Inode 和 block
KVM在線熱添加網卡
1、添加網卡
virsh attach-interface server1 bridge br0 --config # 網卡名以ens開頭
virsh attach-interface server1 bridge br0 --model virtio # 網卡名以eth開頭
參數說明:
attach-interface:添加接口/網卡
server1:虛擬機名
bridge:網卡類型
br0:網卡源,基於宿主機的哪個網卡創建
--config:將添加的網卡信息寫入配置文件
--model: 添加的網卡名以eth開頭,將網卡信息寫入配置文件,並自動啟動該網卡
2、剝離網卡
virsh detach-interface server1 bridge --mac 52:54:00:b7:6a:37
ps:
如果相同類型的網卡只有一塊,則無需加 --mac區分
KVM在線熱添加內存
前提:該內存是可以被擴容,即總最大內存比當前內存大,如下:
可以擴容:
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>524288</currentMemory>
不可擴容:
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
1、創建內存可擴容的虛擬機
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name server3 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/server3.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#1、這里新增了參數:maxmemory=2048
#2、虛擬磁盤需要提前創建好:
qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server3.qcow2
2、設置內存
臨時熱添加內存
virsh setmem server3 1024M --live
永久增大內存
virsh setmem server3 1024M --config
參數說明:
setmem :設置內存,既可以擴容內存,也可以縮減內存
server3 :虛擬機名
1024M :設置內存大小
KVM在線熱添加cpu
1、創建內存可擴容的虛擬機
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name server4 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=10 --disk /data/server4.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#1、這里新增了參數:maxvcpus=10
#2、虛擬磁盤需要提前創建好:
qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server3.qcow2
#3、通過 lscpu 查看CPU數量
2、設置cpu核數
臨時加cpu核數
virsh setvcpus server4 8 --live
永久添加cpu核數
virsh setvcpus server4 8 --config
10、KVM熱遷移
詳情見:https://www.qstack.com.cn/archives/368.html
注意:需要互相做好host解析
[root@nfs01 data]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 kvm01
10.0.0.12 kvm02
10.0.0.21 nfs21