1. 程式人生 > >虛擬化技術之KVM

虛擬化技術之KVM

iss iptable roo num bytes ebo uuid screen ext

技術分享圖片技術分享圖片一、kvm環境準備

kvm介紹:

KVM是Kernel Virtual Machine的簡寫,目前Red Hat只支持在64位的RHEL5.4及以上的系統運行KVM,同時硬件需要支持VT技術。KVM的前身是QEMU,2008年被Red Hat公司收購並獲得一項hypervisor技術,不過Red Hat的KVM被認為是將成為未來Linux hypervisor的主流,準確來說,KVM僅僅是Linux內核的一個模塊。管理和創建完整的KVM虛擬機,需要更多的輔助工具。

qemu介紹:

QEMU是一套由法布裏斯·貝拉(Fabrice Bellard)所編寫的以GPL許可證分發源碼的模擬處理器,在

GNU/Linux平臺上使用廣泛。BochsPearPC等與其類似,但不具備其許多特性,比如高速度及跨平臺的特性,通過KQEMU這個閉源的加速器,QEMU能模擬至接近真實電腦的速度。

目前,0.9.1及之前版本的qemu可以使用kqemu加速器。在qemu1.0之後的版本,都無法使用kqemu,主要利用qemu-kvm加速模塊,並且加速效果以及穩定性明顯好於kqemu

安裝kvm相關包

# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y

驗證虛擬機是否支持kvm

# grep -E

vmx|svm /proc/cpuinfo

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 
clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs
bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16
pcid sse4_1 sse4_2 x2apic
movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt

創建硬盤

-f指定鏡像創建的格式

# qemu-img create -f raw /opt/CentOS-7.2-x86_64.raw 10G

Formatting /opt/CentOS-7.2-x86_64.raw, fmt=raw size=10737418240

驗證

# lsmod |grep kvm

kvm_intel             162153  0

kvm                   525259  1 kvm_intel

開啟libvirtd

[root@localhost ~]# systemctl enable libvirtd

Created symlink from /etc/systemd/system/sockets.target.wants/virtlockd.socket to /usr/lib/systemd/system/virtlockd.socket.

[root@localhost ~]# systemctl start libvirtd

[root@localhost ~]# systemctl status libvirtd

上傳鏡像

# dd if=/dev/cdrom of=/opt/CentOS-7.2.iso

8456192+0 records in

8456192+0 records out

4329570304 bytes (4.3 GB) copied, 200.903 s, 21.6 MB/s

虛擬機安裝幫助查詢

# virt-install --help

# virt-install --name CentOS-7.1-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.2.iso --disk path=/opt/CentOS-7.2-x86_64.raw --network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

 

Starting install...

Domain installation still in progress. You can reconnect to

the console to complete the installation process.

如果不小心寫錯 需要重新安裝

# virsh undefine CentOS-7.1-x86_64

然後再執行 安裝

登錄vnc

技術分享圖片

技術分享圖片

使用tab鍵編寫內核參數 修改網卡名為eth0

net.ifnames=0 biosdevname=0

修改完回車

安裝結束reboot virt就會被關閉

[root@localhost ~]# virsh list --all

 Id    Name                           State

----------------------------------------------------

 -     CentOS-7.1-x86_64              shut off

手動開啟virt

[root@localhost ~]# virsh start CentOS-7.1-x86_64

Domain CentOS-7.1-x86_64 started

 

再用vnc連接

技術分享圖片

在vnc裏修改eth0網卡配置文件

ONBOOT=yes

重啟網卡

# systemctl restart network

查看網卡

# ip ad li

技術分享圖片

測試是否能連接外網

技術分享圖片

給虛擬機裝上 ifconfig命令

# yum install -y net-tools

給虛擬機創建cpu

法一:通過修改xml文件來生成

如果已經安裝好了想要調節也是修改xml文件

virsh edit CentOS-7.1-x86_64

<domain type=kvm>

  <name>CentOS-7.1-x86_64</name>

  <uuid>9d0660d2-d5c0-4c1e-b671-6b2c4ce84514</uuid>

  <memory unit=KiB>1048576</memory>

  <currentMemory unit=KiB>1048576</currentMemory>

  <vcpu placement=auto current="1">4</vcpu>

重啟生效

[root@localhost ~]# virsh shutdown CentOS-7.1-x86_64

Domain CentOS-7.1-x86_64 is being shutdown

[root@localhost ~]# virsh start CentOS-7.1-x86_64   

Domain CentOS-7.1-x86_64 started

 

法二:也可以 手動install

# virt-install --help|grep cpu

 --vcpus VCPUS         Number of vcpus to configure for your guest. Ex:

                        --vcpus 5

                        --vcpus 5,maxcpus=10,cpuset=1-4,6,8

                        --vcpus sockets=2,cores=4,threads=2,

  --cpu CPU             CPU model and features. Ex:

                        --cpu coreduo,+x2apic

                        --cpu host

查看一下虛擬機的cpu個數

技術分享圖片

cpu的熱添加

[root@localhost ~]# virsh setvcpus CentOS-7.1-x86_64 2 --live

添加完後 cat /proc/cpuinfo查看

技術分享圖片

查看cpu的工作狀態

技術分享圖片

註意:熱添加只能增加不能減少,添加的最大個數由xml文件裏設置的個數決定

<vcpu placement=auto current="1">4</vcpu>

[root@localhost ~]#  virsh setvcpus CentOS-7.1-x86_64 3 --live
[root@localhost ~]#  virsh setvcpus CentOS-7.1-x86_64 2 --live

error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count

給虛擬機熱添加 內存

[root@localhost ~]# virsh edit CentOS-7.1-x86_64

<memory unit=KiB>4048576</memory>         

 

重啟虛擬機進程

[root@localhost ~]# virsh shutdown CentOS-7.1-x86_64

Domain CentOS-7.1-x86_64 is being shutdown

 

[root@localhost ~]# virsh start CentOS-7.1-x86_64   

Domain CentOS-7.1-x86_64 started

管理虛擬機內存的命令

[root@localhost ~]# virsh qemu-monitor-comman

後面接--help查看 命令使用

查看虛擬機的內存

技術分享圖片

在終端查看虛擬機內存

[root@localhost ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon

balloon: actual=1024

設置虛擬機內存600M

[root@localhost ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd  balloon 600

vnc上查看虛擬機內存,可以發現顯示不是很準

技術分享圖片

給虛擬機設置2g內存

[root@localhost ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd  balloon 2000

[root@localhost ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info  balloon

balloon: actual=2000

 

自動生成的xml文件存放位置

[root@localhost ~]# cd /etc/libvirt/qemu/

[root@localhost qemu]#

CentOS-7.1-x86_64.xml  networks

圖形界面管理創建虛擬機

# virt-manager

libvirt介紹

前主流Linux平臺上默認的虛擬化管理工具virt-manager(圖形化),virt-install(命令行模式)等均基於libvirt開發而成。

Libvirt 庫是一種實現 Linux 虛擬化功能的 Linux® API,它支持各種虛擬機監控程序,包括 Xen KVM,以及 QEMU 和用於其他操作系統的一些虛擬產品。

libvirt 提供一種虛擬機監控程序不可知的 API 來安全管理運行於主機上的客戶操作系統。libvirt 本身 不是一種工具, 它是一種可以建立工具來管理客戶操作系統的 APIlibvirt 本身構建於一種抽象的概念之上。它為受支持的虛擬機監控程序實現的常用功能提供通用的 APIlibvirt 起初是專門為 Xen 設計的一種管理 API,後來被擴展為可支持多個虛擬機監控程序。

virsh 管理工具

查看:

[root@localhost qemu]# virsh list

 Id    Name                           State

----------------------------------------------------

 1     CentOS-7.1-x86_64              running

 

[root@localhost qemu]# virsh list --all

 Id    Name                           State

----------------------------------------------------

 1     CentOS-7.1-x86_64              running

 
[root@localhost ~]# iptables -t nat -vnL

Chain PREROUTING (policy ACCEPT 1 packets, 52 bytes)

 pkts bytes target     prot opt in     out     source               destination         

 

Chain INPUT (policy ACCEPT 1 packets, 52 bytes)

 pkts bytes target     prot opt in     out     source               destination         

 

Chain OUTPUT (policy ACCEPT 15 packets, 1225 bytes)

 pkts bytes target     prot opt in     out     source               destination         

 

Chain POSTROUTING (policy ACCEPT 15 packets, 1225 bytes)

 pkts bytes target     prot opt in     out     source               destination         

    2   267 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        

    0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     

    0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535

    0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535

0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24

[root@localhost ~]# cat /var/lib/libvirt/dnsmasq/default.conf

##WARNING:  THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE

##OVERWRITTEN AND LOST.  Changes to this configuration should be made using:

##    virsh net-edit default

## or other application using the libvirt API.

##

## dnsmasq conf file created by libvirt

strict-order

pid-file=/var/run/libvirt/network/default.pid

except-interface=lo

bind-dynamic

interface=virbr0

dhcp-range=192.168.122.2,192.168.122.254

dhcp-no-override

dhcp-authoritative

dhcp-lease-max=253

dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile

addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts

支持的硬盤的類型

# qemu-img --help

Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

全鏡像格式

稀疏格式

raw

qcow2(支持壓縮,快照,鏡像)

添加網橋

[root@localhost ~]# brctl show

bridge name     bridge id               STP enabled     interfaces

virbr0          8000.fe54006fd14f       yes             vnet0

[root@localhost ~]# brctl addbr br0

[root@localhost ~]# brctl show     

bridge name     bridge id               STP enabled     interfaces

br0             8000.000000000000       no

virbr0          8000.fe54006fd14f       yes             vnet0

[root@localhost ~]# brctl addif br0 eth0 && ip addr del dev eth0 10.0.0.111/24 && ifconfig br0 10.0.0.111/24 up &&

route add default gw 10.0.0.2 && iptables -F

技術分享圖片

虛擬機的刪除命令

virsh undefine 主機名

導出xml命令

[root@localhost ~]# virsh --help|grep dump

    dump                           dump the core of a domain to a file for analysis

    dumpxml                        domain information in XML

    save-image-dumpxml             saved state domain information in XML

    iface-dumpxml                  interface information in XML

    nwfilter-dumpxml               network filter information in XML

    net-dumpxml                    network information in XML

    nodedev-dumpxml                node device details in XML

    secret-dumpxml                 secret attributes in XML

    snapshot-dumpxml               Dump XML for a domain snapshot

    pool-dumpxml                   pool information in XML

vol-dumpxml                    vol information in XML

操作虛擬機的常用管理命令

virsh start

virsh shutdown

virsh edit

virsh destroy  相當於物理機直接拔電源  kill -9 進程也是一樣

virsh suspended 終止

virsh resumed   恢復

qemu-img      磁盤管理命令

CPU 優化 vt-x

技術分享圖片

taskset 綁定KVM進程到固定的CPU,減少Cache Miss

內存優化

技術分享圖片

  1. 宿主機虛擬內存 -> 宿主機物理內存

虛擬機的虛擬內存 -》 虛擬機的物理內存

影子列表

宿主機虛擬內存 -》 宿主機物理內存

ept 內存尋址

ksmd默認開啟 來減少內存空間 合並內存相同內容

writeback性能最好但是最不安全 斷電數據有可能不同步

WriteThrough 最慢但是最安全 (默認是該模式)

[root@localhost ~]# ps -ef |grep ksmd

root        282      2  0 21:39 ?        00:00:00 [ksmd]

大頁內存默認開啟

[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

khugepaged將連續可用4k的內存頁合並成2M的大頁文件

[root@localhost ~]# ps -ef|grep kh

root        283      2  0 21:39 ?        00:00:01 [khugepaged]

I/O

默認使用 Virtio 半虛擬化隊列接口

virio-net virio-blk

IO Schedulers

電梯算法

  1. Noop Sheduler FIFO SSD 什麽都不幹的調度方式
  2. Anticipatory IO Sheduler(“as sheduler”)
  3. Deadline Sheduler 截止時間的調度方式 默認讀短於寫 一般用於數據庫
  4. Complete Fair Queueing Scheduler(“cfq sheduler”) 完全公平的調度的方式

linux支持的調度算法

[root@localhost ~]# dmesg |grep -i scheduler

[    0.933120] io scheduler noop registered

[    0.933122] io scheduler deadline registered (default)

[    0.933137] io scheduler cfq registered

查看當前使用的調度算法

[root@localhost ~]# cat /sys/block/sda/queue/scheduler

noop [deadline] cfq

臨時更改當前的算法

[root@localhost ~]# echo cfq > /sys/block/sda/queue/scheduler

[root@localhost ~]# cat /sys/block/sda/queue/scheduler                     

noop deadline [cfq]

永久修改

加入內核參數  elevator=noop

鏡像制作:

  1. 分區的時候,只分一個/分區。
  2. 刪除網卡和udev規則裏的uuid MAC
  3. 關閉防火墻和selinux
  4. 安裝常用包net-tools lrzsz screen tree vim wget

KVM管理平臺介紹:

OpenStack

CloudStack cloud.com公司--Ctrix---Apache基金會---Java(商業化產品)

OpenNebula

ZStack

oVirt RHEV的開源實現 Fedora Centos RHEL https://www.ovirt.org/download/

管理端+客戶端組成 oVirt Engine oVirt主機/節點

sudo yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release41.rpm

 

sudo yum install -y ovirt-engine

 

sudo engine-setup

 

虛擬化技術之KVM