一、KVM簡介
1、概念
KVM,基於內核的虛擬機(英語:Kernel-based Virtual Machine,縮寫為 KVM),是一種用於Linux內核中的虛擬化基礎設施,可以將Linux內核轉化為一個hypervisor。
KVM在2007年2月被導入Linux 2.6.20核心中,以可加載核心模塊的方式被移植到FreeBSD及illumos上。
KVM在具備Intel VT或AMD-V功能的x86平台上運行。它也被移植到S/390,PowerPC與IA-64平台上。在Linux內核3.9版中,加入ARM架構的支持。
KVM目前由Red Hat等廠商開發,對CentOS/Fedora/RHEL等Red Hat系發行版支持極佳。
2、關於KVM
KVM是開源軟件,全稱是kernel-based virtual machine(基於內核的虛擬機)。
是x86架構且硬件支持虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。
它包含一個為處理器提供底層虛擬化 可加載的核心模塊kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
KVM還需要一個經過修改的QEMU軟件(qemu-kvm),作為虛擬機上層控制和界面。
KVM能在不改變linux或windows鏡像的情況下同時運行多個虛擬機,(它的意思是多個虛擬機使用同一鏡像)並為每一個虛擬機配置個性化硬件環境(網卡、磁盤、圖形適配器)
同時KVM還能夠使用ksm技術幫助宿主服務器節約內存。在主流的Linux內核,如2.6.20以上的內核均已包含了KVM核心。
二、設置本地虛擬機環境
1、設置大一些的內存
2、修改處理器配置,添加虛擬化引擎(必須要設置)
三、安裝KVM所需依賴
1、查看是否存在vmx,存在才能安裝kvm虛擬機:grep -E "(vmx|svm)" /proc/cpuinfo
2、查看kvm相關工具包:yum list | grep kvm
3、安裝kvm工具包:yum install -y qemu-kvm qumu-kvm-tools libvirt virt-install bridge-utils libguestfs-tools
4、安裝工具包完成之后:設置開機自啟動
systemctl start libvirtd
systemctl enable libvirtd
5、執行ifconfig命令:會發現kvm幫你自動創建了一個virbr0的橋接網卡,其中,192.168.122.1地址是不變的
四、創建kvm虛擬機
1、首先下載Centos7鏡像,方便后面安裝鏡像使用
wget -c https://mirrors.aliyun.com/centos-vault/7.1.1503/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso
2、使用tigthVNC工具連接,需要下載此工具:
下載地址:https://www.tightvnc.com/download.php
選擇:Installer for Windows (64-bit)
安裝:
3、創建虛機鏡像:qemu-img create -f raw /opt/CentOS-7-x86_64.raw 10G
4、安裝虛虛機(注意磁盤和鏡像的路徑):virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 --cdrom=/opt/CentOS-7-x86_64-DVD-1503-01.iso --disk path=/opt/CentOS-7-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
6、安裝操作系統:
用TightVNC工具連接:
跳出界面:移動方向鍵上下鍵選擇第一個,然后按Tab鍵,下方出現一行內容,空一格在后面輸入 net.ifnames=0 biosdevname=0
(注意:如果連接失敗,需要關閉防火牆再次進行連接:systemctl stop firewalld)
以下步驟參照此文檔進行安裝:https://www.cnblogs.com/zhangguosheng1121/p/13521108.html
以上kvm虛擬機就安裝成功。
安裝成功之后,此時虛擬機是關閉的狀態,不能通過TightVNC連接訪問,需要開啟虛機,然后再次進行TightVNC連接
五、虛機聯網
1、查看所有虛擬機:virsh list --all
2、開啟虛擬機:virsh start 虛擬機名稱
3、TightVNC連接虛擬機,查看ip
4、設置DNS,聯網
修改配置文件:vi /etc/sysconfig/network-scripts/ifcfg-eth0
重啟網絡:systemctl restart network
查看系統分配的ip:
修改DNS:vi /etc/resolv.conf
查看是否可以上網:ping baidu.com
安裝工具:yum install net-tools
六、kvm虛擬機console登錄
1、在虛機內操作:用tightVNC連接進入虛擬機

[root@kvm ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8" [root@kvm ~]# reboot
2、在宿主機內操作

[root@admin ~]# virsh console CentOS-7-x86_64 Connected to domain CentOS-7-x86_64 Escape character is ^] CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 zgskvm login: root Password: Last failed login: Fri Jul 24 08:34:51 CST 2020 on ttyS0 There was 1 failed login attempt since the last successful login. Last login: Thu Jul 23 17:55:36 on ttyS0
報錯解決:
退出虛擬機:快捷鍵: ctrl+]
七、virsh基本命令
虛擬機管理常用命令
1、備份虛機:virsh dumpxml 虛機名稱 > 備份文件名字
2、關閉虛機:virsh shutdown 虛機名稱
大前提:使用shutdown關閉虛擬機時,kvm虛擬機需要安裝acpid服務,注意是在虛擬機里面安裝,不是在宿主機上。
yum install -y acpid
service acpid start
強制關機虛擬機:virsh destroy 虛擬機名稱
3、刪除虛機:virsh undefine 虛機名稱
4、定義虛機:virsh define 備份文件
5、暫停虛機與喚醒虛機:
6、設置虛擬機自啟動:virsh autostart 虛擬機名稱
7、關閉虛擬機自啟動:virsh autostart --disable 虛擬機名稱
8、獲取當前路徑:virsh pwd
9、查看kvm虛擬機vnc端口號:virsh vncdisplay CentOS-7-x86_64
10、虛擬機xml配置文件路徑:/etc/libvirt/qemu
11、虛擬機默認磁盤路徑:/var/lib/libvirt/images,當然可以自己定義磁盤存放路徑
12、查詢虛擬機的mac地址 : virsh dumpxml CentOS-7 | grep 'mac address' |awk -F"'" '{print $2}'
13、根據mac地址查找主機名:
八、KVM存儲池和存儲卷管理
默認儲存池路徑:/var/lib/libvirt/images
創建基於文件夾的儲存池(目錄)
定義儲存池與其目錄:virsh pool-define-as vmdisk --type dir --target /data/vmfs
創建已定義的儲存池:virsh pool-build vmdisk
查看已定義的儲存池(儲存池沒有激活無法使用):virsh pool-list --all
激活並自動啟動已經定義的儲存池:
激活: virsh pool-start vmdisk
自啟動: virsh pool-autostart vmdisk
在儲存池中創建儲存卷: virsh vol-create-as vmdisk 01_CCJ.qcow2 2G --format qcow2
刪除儲存池中創建的儲存卷: virsh vol-delete --pool vmdisk 01_CCJ.qcow2
關閉儲存池:virsh pool-destroy vmdisk
獲取儲存池:virsh pool-list --all
獲取儲存池信息:virsh pool-info opt
刪除儲存池:virsh pool-delete vmdisk
取消定義的儲存池:virsh pool-undefine vmdisk
獲取儲存池uuid:virsh pool-uuid vmdisk
編輯儲存池配置:virsh pool-edit vmdisk
九、KVM虛擬機磁盤、快照與克隆
1、磁盤鏡像文件格式
raw:原始格斯,性能最好,但是不支持快照,創建時會立刻分配空間,不管有沒有用到這么多的空間
qcow2:性能上不如raw,但是可以支持快照。創建時只是承諾給你分配空間,只有當你需要空間的時候,才會給你空間,最多只會給你承諾空間的大小,這樣可以避免空間浪費
cow(copy on write-寫時拷貝)
2、磁盤管理
查看已經創建磁盤信息:qemu-img info CentOS-7-x86_64.raw
檢查磁盤有沒有問題:qemu-img check CentOS-7-x86_64.qcow2
創建一塊qcow2格式的虛擬硬盤:qemu-img create -f qcow2 /opt/CentOS-7-x86_64.qcow2 10G
raw轉qcow2格式:(需要注意磁盤鏡像文件的路徑,轉換之前需要創建一塊qcow2格式的磁盤,如上)
qemu-img convert -f raw -O qcow2 CentOS-7-x86_64.raw CentOS-7-x86_64.qcow2
轉換完成之后,需要更改此虛擬機的配置文件,編輯:virsh edit CentOS-7-x86_64,如下:
注意:修改之后需要重新啟動kvm虛擬機
這樣就完成了格式的轉換,方便進行快照等一系列操作。
3、快照管理(raw格式無法創建快照,安裝時是raw格式,需要轉換成qcow2格式,參照上述方法轉換格式)
查看快照命令:virsh --help | grep snap
創建快照:virsh snapshot-create CentOS-7-x86_64
查看主機快照列表:virsh snapshot-list CentOS-7-x86_64
查看快照信息: virsh snapshot-info CentOS-7-x86_64 --snapshotname 1595568232
還原快照: virsh snapshot-revert CentOS-7-x86_64 --snapshotname 1595568708
刪除快照:virsh snapshot-delete CentOS-7-x86_64 --snapshotname 1595568232
查看快照配置文件位置:cd /var/lib/libvirt/qemu/snapshot
4、kvm虛擬機克隆
復制一個虛擬機,需修改如 MAC 地址,名稱等所有主機端唯一的配置。虛擬機的內容並沒有改變:virt-clone 不修改任何客戶機系統內部的配置,它只復制磁盤和主機端的修改。
virt-clone -o CentOS-7-x86_64 -n CentOS-7 -f /var/lib/libvirt/images/CentOS-7.qcow2
注:-o:original 后面跟要克隆的虛擬機名字
-n:name 克隆后虛擬機的名字
-f:file 指定鏡像存放的路徑
查看原虛擬機與克隆之后的虛擬機xml文件的不同:
十、kvm虛擬機網絡管理:設置橋接
參考:https://www.cnblogs.com/Zrecret/p/12299128.html
1、設置橋接網絡

[root@kvm-test ~]# systemctl stop NetworkManager # 停止此服務 [root@kvm-test ~]# virsh iface-bridge ens33 br0 # 執行此命令時,若提示以下信息,不用在意,因為其已經存在了 使用附加設備 br0 生成橋接 ens33 失敗 已啟動橋接接口 br0 Created bridge br0 with attached device ens33 Bridge interface br0 started
2、查看宿主機網橋:eth0綁定到br0上
3、查看配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0 ONBOOT=yes BRIDGE="br0" NM_CONTROLLED=no TYPE=Ethernet
cat /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="none" IPADDR="10.0.0.200" NETMASK="255.255.255.0" GATEWAY="10.0.0.2" IPV6INIT="yes" IPV6_AUTOCONF="yes" DHCPV6C="no" STP="on" DELAY="0" BOOTPROTO=static NM_CONTROLLED=no
4、修改kvm虛擬機網絡配置:改成橋接模式
virsh edit CentOS-7-x86_64
5、修改kvm虛擬機網卡配置文件:vnc登錄進去
vi /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=no PEERROUTES=yes IPV4_FAILURE_FATAL=no NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=10.0.0.60 NETMASK=255.255.255.0 GATEWAY=10.0.0.2 DNS1=8.8.8.8 DNS2=114.114.114.114
重啟網絡:systemctl restart network
測試:可以ping通網關,可以訪問百度,可以使用secureCRT進行連接,則虛擬網橋搭建成功。
十一、安裝virt-manager
https://www.cnblogs.com/zhangguosheng1121/p/13521108.html
十二、執行python腳本

#bin/bash import libvirt conn = libvirt.open("qemu:///system") for id in conn.listDomainsID(): dom = conn.lookupByID(id) infos = dom.info() print '' print 'ID = %d'%id print 'Name = %s'%dom.name() print 'Statu = %d' %infos[0] print ''
十三、執行virsh命令返回成功信息:中文和英文區分

開機:virsh start kvm_1 Domain kvm_1 started 域 kvm_1 已開始 關閉:virsh shutdown kvm_1 Domain kvm_1 is being shutdown 域 kvm_1 被關閉 斷電:virsh destroy kvm_1 Domain kvm_1 destroyed 域 kvm_1 被刪除 刪除:virsh undefine kvm_1 Domain kvm_1 has been undefined 域 kvm_1 已經被取消定義 暫停:virsh suspend kvm_1 Domain kvm_1 suspended 域 kvm_1 被掛起 恢復:virsh resume kvm_1 Domain kvm_1 resumed 域 kvm_1 被重新恢復 重啟:virsh reboot kvm_1 Domain kvm_1 is being rebooted 域 kvm_1 正在被重新啟動 克隆:virt-clone -o win2k16 -n Test-1 -f /var/lib/libvirt/images/Test—1.qcow2 Allocating 'Test-3.qcow2' | 80 GB 00:02 Clone 'Test-3' created successfully. if "Clone '{0}' created successfully.".format(kvm_name_clone) or"成功克隆 '{0}'".format(kvm_name_clone) in result['data']: result = '克隆成功。' 定義:virsh define /etc/libvirt/qemu/kvm_1.xml Domain kvm_1 defined from kvm_1 定義域 kvm_1(從 /etc/libvirt/qemu/kvm_1.xml)
十四、在宿主機上修改kvm虛擬機的ip、主機名
1、需要安裝guestmount工具
yum install libguestfs-tools -y
2、掛載kvm虛擬機的磁盤文件
guestmount -a /tank/CentOS-7-test1/CentOS-7.qcow2 -i /etc/libvirt/kvm_mount """ /tank/CentOS-7-test1/CentOS-7.qcow2 磁盤路徑 /etc/libvirt/kvm_mount 要掛載的目錄,沒有則創建 """
3、掛載之后修改網卡文件:/etc/libvirt/kvm_mount/etc/sysconfig/network-scripts/ifcfg-eth0
注意:只有掛載成功了之后才能修改網卡文件
注意:路徑是否正確
sed -i "/IPADDR/s/=.*/=192.168.1.180/" /etc/libvirt/kvm_mount/etc/sysconfig/network-scripts/ifcfg-eth0 # 修改ip sed -i '/HWADDR/d' /etc/libvirt/kvm_mount/etc/sysconfig/network-scripts/ifcfg-eth0 # 刪除MAC地址 echo CentOS-7@test5 > /etc/libvirt/kvm_mount/etc/hostname # 修改主機名
4、修改完成 之后取消掛載:
umount /etc/libvirt/kvm_mount # 取消掛載
5、修改完成,可以啟動創建好的虛擬機:ip:192.168.1.180, 主機名:CentOS-7@test5
virsh start CentOS-7@test1
說明:在宿主機上修改kvm虛擬機的ip和主機名,此步驟是為了結合項目的使用需要在宿主機上修改kvm虛擬機的ip和主機名
如果是在本地測試,可以直接使用virsh console CentOS-7@test1 進入虛擬機去虛擬機中修改ip和主機名
十五、宿主機上修改kvm虛擬機密碼
需求:要修改Test-1虛擬機的密碼,改為123
方式一:通過virt-df
1、安裝模塊
yum install libguestfs-tools
2、生成新的密碼串:openssl passwd -1 -salt 'hello' '123'
說明:openssl是一個加密工具,-1 是指普通加密,hello為key , 123456 才是密碼,下面就是是生成的密碼串,這樣我們只要將這些進行對應的替換就可以了
linux系統的加密密碼通常存儲在/etc/shadow 文件中
3、修改系統root賬戶密碼:virt-edit -d Test-1 /etc/shadow
保存退出,啟動kvm,就可以用新密碼進入了,新密碼是123
方式二: 通過掛載磁盤修改
1、需要安裝guestmount工具 yum install libguestfs-tools -y 2、掛載kvm虛擬機的磁盤文件 guestmount -a /tank/CentOS-7-test1/CentOS-7.qcow2 -i /etc/libvirt/kvm_mount """ /tank/CentOS-7-test1/CentOS-7.qcow2 磁盤路徑 /etc/libvirt/kvm_mount 要掛載的目錄,沒有則創建 """
3、掛載之后修改/etc/shadow文件:/etc/libvirt/kvm_mount/etc/shadow # 只有掛載成功了之后才能修改, 注意路徑是否正確 sed -i 's#{舊密碼}#{新密碼}#g' /etc/libvirt/kvm_mount/etc/shadow # 舊密碼替換成新密碼
4、修改完成之后取消掛載: umount /etc/libvirt/kvm_mount 5、啟動創建好的虛擬機,密碼是123
十六、virsh基本命令:
virsh查看kvm

virsh list # 獲取當前主機所有虛擬機 virsh domstate <ID or Name or UUID> # 獲取虛擬機運行狀態 virsh dominfo <ID or Name or UUID> # 獲取虛擬機基本信息 virsh domid <Name or UUID> # 根據虛擬機名稱或UUID獲取ID virsh domname <ID or UUID> # 根據虛擬機ID或UUID獲取名稱 virsh dommemstat <ID or Name or UUID> # 獲取虛擬機內存使用情況 virsh setmem <ID or Name or UUID> # 設置虛擬機內存大小,值不能超過最大分配內存,否則需要關閉虛擬機后設置 virsh vcpuinfo <ID or Name or UUID> # 獲取vCPU基本信息 virsh vcpupin <ID or Name or UUID> <vCPU> <pCPU> # 將一個vCPU 綁定到物理CPU virsh setvcpus <ID or Name or UUID> <vCPU num> # 設置虛擬機vCPU 個數 virsh vncdisplay <ID or Name or UUID> # 獲取虛擬機的VNC連接參數 virsh create <dom.xml> # 根據XML文件創建虛擬機 virsh define <dom.xml> # 根據XML文件定義虛擬機,但不啟動 virsh start <ID or Name or UUID> # 啟動(預定義的)虛擬機 virsh suspend <ID or Name or UUID> # 暫停虛擬機 virsh resume <ID or Name or UUID> # 喚醒虛擬機 virsh shutdown <ID or Name or UUID> # 關閉虛擬機 virsh reboot <ID or Name or UUID> # 重啟虛擬機 virsh reset <ID or Name or UUID> # 強制重啟虛擬機 virsh destory <ID or Name or UUID> # 銷毀虛擬機 virsh save <ID> <file.img> # 保存運行中的虛擬機到一個文件 virsh migrate <ID or Name or UUID> <dst url> # 遷移虛擬機 virsh dump <ID or Name or UUID> <core.file> #coredump保存虛擬機到文件 virsh dumpxml <ID or Name or UUID> # 輸出虛擬機配置 virsh attach-device <ID or Name or UUID> <device.xml> # 添加設備 virsh detach-device <ID or Name or UUID> <device.xml> # 移除設備 virsh console <ID or Name or UUID> # 連接到虛擬機 virsh autostart <ID or Name or UUID> # 設置虛擬機自動啟動 virsh auotstart --disable <ID or Name or UUID> # 取消虛擬機自動啟動 virsh pool-list # 獲取libvirt管理的存儲池 virsh pool-info <pool name> # 獲取存儲池信息 virsh pool-uuid <pool name> # 獲取儲存池UUID virsh pool-create <pool.xml> # 根據XML配置文件創建存儲池 virsh pool-edit <pool name or uuid> # 編輯存儲池配置 virsh pool-destory <pool name or uuid> # 關閉存儲池 virsh pool-delete <pool name or uuid> # 刪除存儲池 virsh vol-list <pool name or uuid> # 獲取某個存儲池的卷列表 virsh vol-name <vol key or path> # 獲取存儲卷名稱 virsh vol-path --pool <pool name or uuid> <vol name or key> # 獲取存儲卷路徑 virsh vol-create <vol.xml> # 根據XML配置創建存儲池 virsh vol-clone <vol name path> <name> # 克隆存儲卷 virsh vol-delete <vol name or key or path> # 刪除存儲卷
virsh查看宿主機

virsh version # 獲取libvirt 和hypervisor版本信息 virsh sysinfo # 獲取宿主機系統信息 virsh nodeinfo # 獲取宿主機CPU,內存,核數等信息 virsh uri # 顯示當前連接對象 virsh connect # 連接到指定對象 virsh hostname # 獲取宿主機主機名 virsh capabilities # 獲取宿主機和虛擬機的架構及特性 virsh freecell # 顯示當前MUMA單元空閑內存 virsh nodememstats # 獲取宿主機內存使用情況 virsh nodecpustats # 獲取宿主機CPU使用情況 virsh qemu-attach # 根據PID添加一個QEMU進程到libvirt中 virsh qemu-monitor-command domain [--hmp] command # 向QEMU monitor發送一個命令 virsh iface-list # 獲取宿主機網絡接口列表 virsh iface-mac <iface name> # 獲取網絡接口mac地址 virsh iface-name <mac> # 獲取網絡接口名稱 virsh iface-edit <iface name of uuid> # 編輯網絡接口XML配置文件 virsh iface-dumpxml <iface name of uuid> # 輸出網絡接口XML配置 virsh iface-destory <iface name of uuid> # 關閉網絡接口 virsh net-list # 獲取libvirt管理的虛擬網絡 virsh net-info <net name or uuid> # 獲取虛擬網絡基本信息 virsh net-uuid <net name> # 獲取虛擬網絡UUID virsh net-name <net uuid> # 獲取虛擬網絡名稱 virsh net-create <net.xml> # 根據XML配置文件創建虛擬網絡 virsh net-edit <net name or uuid> # 編輯虛擬網絡信息 virsh net-dumpxml <net name or uuid> # 輸出虛擬網絡XML配置 virsh net-destory <net name or uuid> # 刪除虛擬網絡
十七、獲取KVM內存、磁盤、CPU使用情況
https://www.cnblogs.com/zhangguosheng1121/p/13719188.html