KVM - 內核虛擬化


一、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
View Code

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
View Code

報錯解決:

退出虛擬機:快捷鍵: 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
View Code

2、查看宿主機網橋:eth0綁定到br0上

3、查看配置文件

cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BRIDGE="br0"
NM_CONTROLLED=no
TYPE=Ethernet
View Code

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
View Code

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
View Code

重啟網絡: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 ''
View Code

 

十三、執行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)
View Code

 

十四、在宿主機上修改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>   # 刪除存儲卷
kvm虛擬機信息

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

 


免責聲明!

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



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