KVM虛擬化基礎

關於虛擬化

什麼是虛擬化

在計算機技術中,虛擬化(技術)或虛擬技術(英語:Virtualization)是一種資源管理技術,是將計算機的各類實體資源(CPU、內存、磁盤空間、網絡適配器等),予以抽象、轉換後呈現出來並可供分區、組合爲一個或多個電腦配置環境。

由此,打破實體結構間的不可切割的障礙,使用戶能夠比本來的配置更好的方式來應用這些電腦硬件資源。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。linux

通常所指的虛擬化資源包括計算能力和數據存儲。web

因爲目前信息技術領域的不少企業都曾在宣傳中將該企業的某種技術稱爲虛擬化技術,這些技術涵蓋的範圍能夠從Java虛擬機技術到系統管理軟件,這就使得準確的界定虛擬技術變得困難。所以各類相關學術論文在談到虛擬技術時經常提到的即是如前面所提到的那個不嚴格的定義。shell

爲何用虛擬化

同一臺物理機運行多個不一樣版本應用軟件
硬件依賴性較低和便於數據遷移

windows

虛擬化技術的優點

1.下降運營成本
服務器虛擬化下降了IT基礎設施的運營成本,令系統管理員擺脫了繁重的物理服務器、OS、中間件及兼容性的管理工做,減小人工干預頻率,使管理更增強大、便捷。
2.提升應用兼容性
服務器虛擬化提供的封裝性和隔離性使大量應用獨立運行於各類環境中,管理人員不需頻繁根據底層環境調整應用,只需構建一個應用版本並將其發佈到虛擬化後的不一樣類型平臺上便可。
3.加速應用部署
採用服務器虛擬化技術只需輸入激活配置參數、拷貝虛擬機、啓動虛擬機、激活虛擬機便可完成部署,大大縮短了部署時間,免除人工干預,下降了部署成本。
4.提升服務可用性
用戶能夠方便地備份虛擬機,在進行虛擬機動態遷移後,能夠方便的恢復備份,或者在其餘物理機上運行備份,大大提升了服務的可用性。
5.提高資源利用率
經過服務器虛擬化的整合,提升了CPU、內存、存儲、網絡等設備的利用率,同時保證原有服務的可用性,使其安全性及性能不受影響。
6.動態調度資源
在服務器虛擬化技術中,數據中心從傳統的單一服務器變成了統一的資源池,用戶能夠即時地調整虛擬機資源,同時數據中心管理程序和數據中心管理員能夠靈活根據虛擬機內部資源使用狀況靈活分配調整給虛擬機的資源。
7.下降能源消耗
經過減小運行的物理服務器數量,減小CPU之外各單元的耗電量,達到節能減排的目的。
centos

KVM簡介

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系發行版支持極佳。
bash

關於KVM

  1. KVM是開源軟件,全稱是kernel-based virtual machine(基於內核的虛擬機)。服務器

  2. 是x86架構且硬件支持虛擬化技術(如 intel VT 或 AMD-V)的Linux全虛擬化解決方案。網絡

  3. 它包含一個爲處理器提供底層虛擬化 可加載的核心模塊kvm.ko(kvm-intel.ko或kvm-AMD.ko)。

  4. KVM還須要一個通過修改的QEMU軟件(qemu-kvm),做爲虛擬機上層控制和界面。

  5. KVM能在不改變linux或windows鏡像的狀況下同時運行多個虛擬機,(它的意思是多個虛擬機使用同一鏡像)併爲每個虛擬機配置個性化硬件環境(網卡、磁盤、圖形適配器……)同時KVM還可以使用ksm技術幫助宿主服務器節約內存。

  6. 在主流的Linux內核,如2.6.20以上的內核均已包含了KVM核心。

關於Virtual Machine Manager

電腦運算中,紅帽公司的Virtual Machine Manager是一個虛擬機管理員,可讓用戶管理多個虛擬機。
基於內核的虛擬機libvirt與Virtual Machine Manager。 
Virtual Machine Manager可讓用戶:

建立、編輯、引導或中止虛擬機。
查看並控制每一個虛擬機的控制檯。
查看每部虛擬機的性能以及使用率。
查看每部正在運行中的虛擬機以及主控端的即時性能及使用率信息。
不管是在本機或遠程,皆可以使用KVM、Xen、QEMU。


其餘虛擬化軟件

🍪 Xen
  Xen是一個開放源代碼虛擬機監視器,由XenProject開發。它打算在單個計算機上運行多達128個有徹底功能的操做系統。
  在舊(無虛擬硬件)的處理器上執行Xen,操做系統必須進行顯式地修改(「移植」)以在Xen上運行(可是提供對用戶應用的兼容性)。這使得Xen無需特殊硬件支持,就能達到高性能的虛擬化。

🍪 QEMU
  QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟件。它與Bochs,PearPC近似,但其具備某些後二者所不具有的特性,如高速度及跨平臺的特性。經由KVM(早期爲kqemu加速器,如今kqemu已被KVM取代)這個開源的加速器,QEMU能模擬至接近真實電腦的速度。QEMU有兩種主要運做模式:

  User mode模擬模式,亦便是用戶模式。
  QEMU能引導那些爲不一樣中央處理器編譯的Linux程序。而Wine及Dosemu是其主要目標。

  System mode模擬模式,亦便是系統模式。
  QEMU能模擬整個電腦系統,包括中央處理器及其餘周邊設備。它使得爲系統源代碼進行測試及除錯工做變得容易。其亦能用來在一部主機上模擬數部不一樣虛擬電腦。

KVM部署與使用

系統環境說明

[root@kvm01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@kvm01 ~]# uname -r
3.10.0-693.el7.x86_64
[root@kvm01 ~]# sestatus
SELinux status:                 disabled
[root@kvm01 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@kvm01 ~]# hostname -I
10.0.0.11
# kvm主機內存不能低於4GB

安裝KVM虛擬化軟件

安裝依賴包(可使用本地yum源)

[root@kvm01 ~]# yum install libvirt* virt-* qemu-kvm* -y

# libvirt   # 做用:虛擬機的管理軟件
# virt      # virt-install virt-clone   做用:虛擬機的安裝和克隆
# qemu-kvm  # qemu-img 做用:複製管理虛擬機的磁盤  管理虛擬機磁盤

啓動服務

[root@kvm01 ~]# systemctl start libvirtd.service
[root@kvm01 ~]# systemctl status libvirtd.servic

安裝VNC軟件(windows版):

下載vnc軟件方法,tightvnc官網:  http://www.tightvnc.com

  VNC軟件,用於VNC(Virtual Network Computing),爲一種使用RFB協議的顯示屏畫面分享及遠程操做軟件。此軟件藉由網絡,可發送鍵盤與鼠標的動做及即時的顯示屏畫面。
  VNC與操做系統無關,所以可跨平臺使用,例如可用Windows鏈接到某Linux的電腦,反之亦同。甚至在沒有安裝客戶端程序的電腦中,只要有支持JAVA的瀏覽器,也可以使用。
  安裝VNC時,使用默認安裝便可,無需安裝server端。(只安裝客戶端)

配置第一臺KVM虛擬機

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.4-x86_64-DVD-1708.iso --network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole

注意:
須要先將鏡像文件拷貝到 /opt/目錄下。xshell下使用xftp  默認的rz sz不行
VMware須要在配置內開啓虛擬化

使用參數說明

參數 參數說明
--virt-type HV_TYPE 要使用的管理程序名稱 (kvm, qemu, xen, ...)
--os-type 系統類型
--os-variant DISTRO_VARIANT 在客戶機上安裝的操做系統,例如:'fedora18'、'rhel6'、'winxp' 等。
-n NAME, --name NAME 客戶機實例名稱
--memory MEMORY 配置客戶機虛擬內存大小
--vcpus VCPUS 配置客戶機虛擬 CPU(vcpu) 數量。
--disk DISK 指定存儲的各類選項。
-cdrom CDROM    光驅安裝介質
-w NETWORK, --network NETWORK 配置客戶機網絡接口。
--graphics GRAPHICS 配置客戶機顯示設置。
虛擬化平臺選項:
-v, --hvm          這個客戶機應該是一個全虛擬化客戶機
-p, --paravirt     這個客戶機應該是一個半虛擬化客戶機
--container        這個客戶機應該是一個容器客戶機
--virt-type HV_TYPE 要使用的管理程序名稱 (kvm, qemu, xen, ...)
--arch ARCH        模擬 CPU 架構
--machine MACHINE 機器類型爲仿真類型
其它選項:
--noautoconsole 不要自動嘗試鏈接到客戶端控制檯
--autostart 主機啓動時自動啓動域。
--noreboot  安裝完成後不啓動客戶機。
以上信息經過 " virt-install --help " 得到。

在啓動的同時使用vnc鏈接

而後開始安裝系統

KVM虛擬機管理操做

virsh命令經常使用參數總結

參數 參數說明
基礎操做
list 查看虛擬機列表,列出域
start 啓動虛擬機,開始一個(之前定義的)非活躍的域
shutdown 關閉虛擬機,關閉一個域
destroy(危險) 強制關閉虛擬機,銷燬(中止)域
vncdisplay 查詢虛擬機vnc端口號
reboot 重啓(有些版本不支持)
配置管理操做
dumpxml 導出主機配置信息
undefine 刪除主機
define 導入主機配置
domrename 對虛擬機進行重命名
掛起與恢復
suspend 掛起虛擬機
resume 恢復虛擬機
自啓動管理
autostart 虛擬機開機啓動
autostart --disable 取消虛擬機開機啓動
以上參數經過  「virsh  --help」 得到。

KVM虛擬機配置文件位置

[root@kvm ~]# ll /etc/libvirt/qemu/centos7.xml

修改KVM配置文件

修改KVM虛擬機配置的方法

[root@kvm ~]# virsh edit centos7

   使用該命令修改能夠對文件進行語法校驗。(如crontable -e)

備份與恢復

備份虛擬機配置(關機時備份):

[root@kvm ~]# virsh dumpxml centos7  > centos7.xml

刪除虛擬機配置

# 查看
[root@kvm ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 -     centos7                        關閉
 # 刪除
[root@kvm ~]# virsh undefine centos7 
域 centos7 已經被取消定義
[root@kvm ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------

導入虛擬機

# 導入  備份(dumpxml)
[root@kvm ~]# virsh define centos7.xml 
定義域 centos7(從 centos7-off.xml)
# 查看
[root@kvm ~]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 -     centos7                        關閉

修改虛擬機名稱

# 重命名
[root@kvm ~]# virsh domrename centos7 web01
Domain successfully renamed
# 查看
[root@kvm ~]# virsh list
 Id    名稱                         狀態
----------------------------------------------------
 9     web01                          關閉

虛擬機掛起與恢復

掛起虛擬機

[root@kvm01 ~]# virsh suspend centos7
域 centos7 被掛起
# 查看狀態
[root@kvm01 ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 9     centos7                          暫停

恢復虛擬機

[root@kvm01 ~]# virsh resume centos7
域 centos7 被從新恢復

查詢虛擬機vnc端口

[root@kvm ~]# virsh vncdisplay centos7 
:0  
# :0 即 爲 5900 端口,以此類推 :1爲5901 。

開機自啓動設置

# 設置 libvirtd 服務開機自啓動。
[root@kvm ~]# systemctl enabled libvirtd.service 
enabled

設置宿主機開機虛擬機在其餘

[root@kvm ~]# virsh autostart centos7 
域 nfsnobody標記爲自動開始
# 實質爲建立軟鏈接
[root@kvm ~]# ll /etc/libvirt/qemu/autostart/centos7.xml 
lrwxrwxrwx 1 root root 27 1月  22 12:17 /etc/libvirt/qemu/autostart/centos7.xml -> /etc/libvirt/qemu/centos7.xml

取消開機自啓動

[root@kvm ~]# virsh autostart --disable centos7 
域 centos7取消標記爲自動開始

kvm虛擬機console登陸

CentOS 7.X 版本console登陸

配置console登陸

在centos7虛擬機內操做(該操做僅限centos7):

[root@kvm01 ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@kvm01 ~]# reboot
# 115200n8:能顯示虛擬機的啓動過程

重啓完成後,使用virsh console 鏈接虛擬機。

[root@kvm ~]# virsh console centos7 
鏈接到域 centos7
換碼符爲 ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-327.el7.x86_64 on an x86_64

centos7 login: root
Password: 
Last login: Mon Jan 22 12:24:48 from 192.168.122.1
[root@centos7 ~]# w
 12:26:11 up 0 min,  1 user,  load average: 0.09, 0.03, 0.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     ttyS0                     12:26    3.00s  0.02s  0.01s w

CentOS 6.X 版本console登陸

使用virsh console鏈接CentOS 6虛擬主機方法:

  安裝一臺centos6的kvm虛擬機

virt-install --virt-type kvm --os-type=linux --os-variant rhel6 \
--name centos6 --memory 1124 --vcpus 1 \
--disk /data/centos6/centos6.raw,format=raw,size=10 \
--cdrom /data/CentOS-6.9-x86_64-bin-DVD1.iso \
--network network=default --graphics vnc,listen=0.0.0.0,port=5901 \
--noautoconsole

新安裝一臺虛擬機後,是沒法經過virsh console 命令連入虛擬機中的,這時咱們須要開啓虛擬機的console功能。

如下操做都在虛擬機中進行
一、添加ttyS0的許可,容許root登錄

[root@centos6 ~]# echo "ttyS0" >> /etc/securetty

二、編輯/etc/grub.conf中加入console=ttyS0
在該文件的第16行。kernel選項後添加

[root@centos6 ~]# sed -i '/\tkernel/s#.*#& console=ttyS0#g' /etc/grub.conf
[root@centos6 ~]# sync  # 同步配置到 /boot/grub/grub.conf
[root@centos6 ~]# cat -n  /etc/grub.conf 
     1    # grub.conf generated by anaconda
     2    #
     3    # Note that you do not have to rerun grub after making changes to this file
     4    # NOTICE:  You have a /boot partition.  This means that
     5    #          all kernel and initrd paths are relative to /boot/, eg.
     6    #          root (hd0,0)
     7    #          kernel /vmlinuz-version ro root=/dev/vda3
     8    #          initrd /initrd-[generic-]version.img
     9    #boot=/dev/vda
    10    default=0
    11    timeout=5
    12    splashimage=(hd0,0)/grub/splash.xpm.gz
    13    hiddenmenu
    14    title CentOS 6 (2.6.32-696.el6.x86_64)
    15        root (hd0,0)
    16        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=48532582-c271-4c0a-b55f-395fe16cd8aa rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0
    17        initrd /initramfs-2.6.32-696.el6.x86_64.img

三、編輯/etc/inittab
  在最後一行加入內容 S0:12345:respawn:/sbin/agetty ttyS0 115200

[root@centos6 ~]# echo 'S0:12345:respawn:/sbin/agetty ttyS0 115200' >>/etc/inittab

四、以上操做都完成後,重啓虛擬機

[root@centos6 ~]# reboot

如下操做在kvm宿主機上執行
一、檢查虛擬機的狀態

[root@kvm ~]# virsh list --all
 Id    名稱                         狀態
----------------------------------------------------
 11    nfsnobody                          running
 21    nfsnobody6                          running

二、進行鏈接測試

[root@kvm ~]# virsh console nfsnobody6 
鏈接到域 nfsnobody6
換碼符爲 ^]  # 注:退出virsh console鏈接的方法,使用組合鍵Ctrl+]便可

CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64

nfsnobody6 login: root
Password: 
Last login: Mon Jan 22 05:44:25 on ttyS0
[root@nfsnobody6 ~]# who
root     ttyS0        2018-01-22 05:50
# 登錄成功,查看登錄接口爲以前設置的ttyS0

KVM虛擬機磁盤、快照與克隆

磁盤管理

KVM qcow二、raw、vmdk等鏡像格式說明:

http://blog.csdn.net/zhengmx100/article/details/53887162
# 建立一塊qcow2的虛擬硬盤(僅測試使用,無實際意義)
[root@kvm01 data]# qemu-img create -f qcow2 nfsnobody.qcow2 2G

查看當前虛擬機硬盤信息

[root@kvm01 ~]# qemu-img info /data/nfsnobody.raw 
image: /data/nfsnobody.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.1G

raw轉qcow2格式:

# 參數說明
[root@kvm01 data]# qemu-img  --help |grep convert 
qemu-img convert [-f fmt] [-O output_fmt] filename  output_filename

轉換原有磁盤格式

[root@kvm01 data]# qemu-img convert -f raw -O qcow2 nfsnobody.raw nfsnobody.qcow2

修改nfsnobody 虛擬機配置文件

[root@kvm01 data]# virsh edit nfsnobody 
修改前:
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/data/nfsnobody.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
修改後:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/data/nfsnobody.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

刪除原磁盤文件

[root@kvm01 data]# \rm nfsnobody.raw

啓動虛擬機

[root@kvm01 data]# virsh start nfsnobody 

[root@kvm01 data]# virsh list --all 
 Id    名稱                         狀態
----------------------------------------------------
 22    nfsnobody                          running

KVM連接克隆

連接克隆腳本

#!/bin/bash
# kvm link clone scripts  
# user nfsnobody 
# blog: https://www.nfsnobody.com
# 2018-02-06
###

# init
if [ $# -ne 2 ]
  then 
    echo "Usage: $0 OLD_VMNAME NEW_VMNAME"
    exit 2
fi
LOG=/var/log/messages
old_vm=$1
new_vm=$2
new_xml="/tmp/${new_vm}.xml"
. /etc/init.d/functions

# dump old xmlfile 
virsh dumpxml $old_vm >$new_xml
old_disk=`awk -F "'" '/source file/{print $2}'  $new_xml`
tmp_dir=`dirname $old_disk`
new_disk=${tmp_dir}/${new_vm}.qcow2

# make link disk 
qemu-img create -f qcow2 -b $old_disk $new_disk &>> $LOG

# make over xml info 
sed -i '/uuid/d' $new_xml
sed -i '/mac address/d' $new_xml
sed -i '2s#'$old_vm'#'$new_vm'#' $new_xml
sed -i "s#$old_disk#$new_disk#g" $new_xml
sed -i '/source mode/d' $new_xml

# import new xml file
virsh define $new_xml &>> $LOG

# start new vm 
virsh start $new_vm &>> $LOG
if [ $? -eq 0 ]
  then 
   action "vmhost $new_vm start"  /bin/true 
else 
   action "vmhost $new_vm start"  /bin/false
   echo "log info : $LOG"
fi

# END
\rm $new_xml

說明:

手動克隆

第一步:複製虛擬磁盤文件
第二步:修改xml配置文件
  1)name
  2)uuid
  3)虛擬磁盤存儲路徑
  4)mac地址

腳本實現思路

1) 備份old_vm的配置文件,並重定向生成一個新的虛擬機配置文件
2)取出old_vm的磁盤路徑
3)建立新的連接磁盤文件
4) 修改xml配置文件
5) 導入新虛擬機
6)啓動測試
相關文章
相關標籤/搜索