kvm -- Kernel-based Virtual Machine


1、虛擬機類型: 類型1 硬件上直接安裝hp 

       類型2 硬件上安裝HOST 上面跑VMM

 

2、kvm概要

  kvm 不算類型1也不算類型二。兩種特性都有,他是linux的一個內核模塊,內核中本身沒有hv,當裝上kvm時,內核就會變成hv了。此時硬件驅動就不用借助於別人,內核本身就可以使用這些驅動。

  當有了hv時,需要一個管理工具,來創建虛擬機,管理虛擬機。

  本身linux是運行在環0上,當裝上kvm后,kvm就運行在環0捕獲特權指令,內核運行在環-1上。

  IO設備就需要軟件模擬了。但是kvm自己不會模擬,只能借助另一個軟件,qemu

3、qemu

qemu是個模擬器,可以管理並創建各種設備

  cpu:模擬器,虛擬化

  qemu (類型2的虛擬化軟件) kqemu相當於qemu的二進制翻譯。此時qemu性能更好,但是bug很多

  此時kvm出現,取代了kqemu,和qemu配合更好,此時內核變為hv, qemu成為kvm控制台以及管理io設備的工具

4、使用kvm
  如果用的是vm虛擬機要注意,硬件必須支持虛擬化

 

cat /proc/cpuinfo  | egrep 'vmx|svm'
modprobe kvm #裝在kvm
modprobe kvm_intel | kvm_amd lsmode | grep kvm  #查看

/dev/kvm

為虛擬機分配內存

讀寫vcpu的寄存器

想vcpu注入終端

運行vcpu

qemu進程,

 

處理器需求:需要一台可以運行最新Linux內核的Intel處理器(含VT虛擬化技術)或AMD處理器(含SVM安全虛擬機技術的AMD處理器,也叫AMD-V)。可以使用如下命令檢查:

  #egrep "(vmx|svm)" color=always /proc/cpuinfo

或者使用下面的命令:

    #cat/proc/cpuinfo | egrep 'vmx|svm' 

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid

   會出現一堆這樣的 flags

如果輸出的結果包含vmx,它是Intel處理器虛擬機技術標志;

如果包含svm,它是AMD處理器虛擬機技術標志;。

如果你甚么都得不到,那應你的系統並沒有支持虛擬化的處理,不能使用kvm。

另外Linux發行版本必須在64bit環境中才能使用KVM。

用命令uname-a 查看

 

x86_64則說明你是64位內核,跑的是64位的系統.
是否支持虛擬化

 如果不支持硬件虛擬化,是安裝不上kvm-intel 或者 kvm-amd的,如果是虛擬機則要在物理cpu支持虛擬化的前提下開啟虛擬機cpu的虛擬化

 

 

查看內核是否編譯了kvm模塊

[root@centos6 ~]# grep -i "kvm" /boot/config-2.6.32-642.el6.x86_64
CONFIG_KVM_CLOCK=y
CONFIG_KVM_GUEST=y
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m

 

 

如果內核編譯了kvm模塊但是沒有加載可以先加載

[root@centos6 ~]# modprobe kvm
[root@centos6 ~]# modprobe kvm_intel

或者直接加載kvm_intel,這樣kvm會一起依賴加載進來

 

 

[root@centos6 ~]# lsmod | grep kvm
kvm_intel              55464  0
kvm                   345038  1 kvm_intel

  

 

 virtio 驅動,

 

 kvm管理工具站

 

1、virsh 

virsh調用底層的libvirt庫來實現管理虛擬機,

virt-manager,virt-viewer 這兩個是virsh的圖形化工具

可以管理xen與kvm

 2、qemu

qemu也是一個管理虛擬機的管理工具,qemu-kvm就是管理kvm的基礎

virsh比較完善 ,qemu目前不太完善

3,查看virt工具

yum list all *virt*

centos6以后xen就不能運行在dome0中了,紅帽拋棄了xen專項大力研發kvm,所以這套組件在centos6后僅適用於kvm,但是xen源中的libvirt是支持kvm的

 

4、kvm只能虛擬cpu以及內存,如果想虛擬io就要裝qemu

yum grouplist | grep -i "Virtualization"

  

如果想省事就把這4個組都裝上去

 

查看包信息

 

[root@centos6 ~]# yum install qemu-kvm qemu-kvm-tools

安裝成功后可以創建虛擬機

但是可以發現沒有qemu-kvm的命令,紅帽有意為之,因為他想讓我們使用virsh

 

 

[root@centos6 ~]# rpm -ql qemu-kvm  

這個工具在libexec中,但是這個不在我們的環境變量中。可以做個鏈接

 qemu的命令很多,但是功能也就是創建虛擬機 cpu幾顆,內存多大,IO ,光驅,硬件設備 ,映像文件位置,等等

命令格式: usage: qemu [options] [disk_image]   : qemu  功能 磁盤映像文件

 

可以指定的一些選項

 

kvm標准選項

qemu-kvm

  -name 設定虛擬機名稱

  -M 制定要模擬的主機類型  standard PC 標准pc ,ISA-only PC 或 Intel-Mac

  

[root@centos6 ~]# qemu-kvm -M ?
Supported machines are:
pc         RHEL 6.6.0 PC (alias of rhel6.6.0)
rhel6.6.0  RHEL 6.6.0 PC (default)
rhel6.5.0  RHEL 6.5.0 PC
rhel6.4.0  RHEL 6.4.0 PC
rhel6.3.0  RHEL 6.3.0 PC
rhel6.2.0  RHEL 6.2.0 PC
rhel6.1.0  RHEL 6.1.0 PC
rhel6.0.0  RHEL 6.0.0 PC
rhel5.5.0  RHEL 5.5.0 PC
rhel5.4.4  RHEL 5.4.4 PC
rhel5.4.0  RHEL 5.4.0 PC

  

  -m 設定虛擬機的RAM大小

  -cpu 設定CPU模型

[root@centos6 ~]# qemu-kvm -cpu ?    【qemu-kvm -cpu -host 和物理機一樣的cpu類型】
x86       Opteron_G5  AMD Opteron 63xx class CPU
x86       Opteron_G4  AMD Opteron 62xx class CPU
x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)
x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)
x86       Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)
x86        Broadwell  Intel Core Processor (Broadwell)
x86          Haswell  Intel Core Processor (Haswell)
x86      SandyBridge  Intel Xeon E312xx (Sandy Bridge)
x86         Westmere  Westmere E56xx/L56xx/X56xx (Nehalem-C)
x86          Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)
x86           Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)
x86           Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)
x86      cpu64-rhel5  QEMU Virtual CPU version (cpu64-rhel5)
x86      cpu64-rhel6  QEMU Virtual CPU version (cpu64-rhel6)
x86             n270  Intel(R) Atom(TM) CPU N270   @ 1.60GHz
x86           athlon  QEMU Virtual CPU version 0.12.1
x86         pentium3
x86         pentium2
x86          pentium
x86              486
x86          coreduo  Genuine Intel(R) CPU           T2600  @ 2.16GHz
x86           qemu32  QEMU Virtual CPU version 0.12.1
x86            kvm64  Common KVM processor
x86         core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz
x86           phenom  AMD Phenom(tm) 9550 Quad-Core Processor
x86           qemu64  QEMU Virtual CPU version 0.12.1

 

虛擬cpu顆數:  

  -smp n [,core=core 每科cpu的核心數 ] 【,threads=threads 每科cpu的線程數】 【,sockets=sockets cpu的插槽數】 【,maxcpu=maxcpus 最大的虛擬cpu個數】

      設定模擬SMP架構中CPU的個數,每個CPU的核心數機CPU的socket數目等,PC機上最多可模擬255可CPU maxcpus用於制定熱插入的CPU個數上限

  -numa opts :指定內存架構, 模擬多節點的numa設備,對稱多處理服務器上的非一致性內存訪問,讓每顆cpu有自己的專用內存

  指定為IDE接口的IO設備:

  -fda file

  -fdb file 使用制定文件作為軟盤鏡像,file為/dev/fd0表示私用物理軟驅

  -hda file 把某一文件模擬為ide格式個硬盤 

  -hdb file 

  -hdc file 光驅設備,不能和-cdrom同時使用 

  -hdd file 使用制定file作為硬盤鏡像

  -cdrom file 指定file作為cd-rom鏡像,需要注意的是 -cdrom和-hdc不能同時使用,將file制定為/dev/cdrom可以直接使用物理光驅

  

  指定scsi接口的IO設備

  -drive option【,option【,option【,。。。 。。。】】】 制定一個新的硬盤設備:可用子選項很多

    file=/path/to/somefile : 硬件影響文件路徑

    if=interface: 指定硬盤設備所連接的接口類型,及、即控制器類型,如 ide,scsi ,sd,mtd,floppy,pflash即virtio等,這里的scsi不一定性能就比ide好

    index=index 設定同一種控制類型中不同設備的索引號,即標識號

    media=media 定義介質類型為硬盤dick 還是光驅cdrom

    snapshot=snapshot 制定當前硬件設備是否是支持快照功能 on/off

    cache=cache  定義如何使用物理機緩存來訪問塊設備,即可用值有none、writeback(回寫)、unsafe和writethrough(通寫)四個

    format=format 指定映像文件的格式,具體格式課件qemu-img命令

  -boot  【order=drives】【,one=drives】【,menu=on|off 】 定義啟動設備的引導次序(從哪個磁盤影響文件啟動),每個設備使用一個字符表示,不同的結構所支持的設備及其表示字符不同,x86pc架構上

   a、b表示軟驅,c表示第一塊硬盤(index=index中誰的索引小),d表示第一個光驅(index=index中誰的索引小),n-p表示網絡適配器(pxe),默認為硬盤設備

    -boot order dcn-p  once=d menu=on   (先光驅,再硬盤,再網絡) (once此引導次序只在第一次啟動時適用) (menu=on 顯示菜單)

 

指定顯示選項:

  -nographic :默認情況下,qumu適用SDL來顯示VGA 輸出, 而此選項用於進制圖形接口,此時,qumu類似一個簡單的命令行程序,其方針串口設備將被重定向到控制台;

  -curses: 禁止圖形接口,並使用curese/ncurese作為交互接口

      -alt-grab: 只用Ctrl + Alt + Shift 組合鍵釋放鼠標

      -sdl: 啟用SDL

  -spic option [, option[,...]] 啟用spice 換成桌面協議,有許多子選項,請看找qemu-kvm手冊

  -vga type:指定要方針的VGA 接口類型,常見有

    cirrus: Cirrus Logic GD5445顯卡

  std: 帶有Bochs VBI 擴展的顯示VGA顯卡

  vmware : Vmware SVGA-II 兼容的顯示適配器

  qxl: QXL半虛擬化顯卡,與VGA兼容, 在Guest 中安裝qxl 驅動后能以很好的方式工作,在使用spice協議時推薦側類選項。

  none:禁用VGA卡

  -vnc display[, option[,option[,......]]] 默認情況下 ,qumu使用SDL顯示VGA輸出;使用-vnc選項,可以讓qemu堅挺在VNC上,並將VGA輸出重定向值VNC會話;使用此選項時,不許使用-k

  選項制定鍵盤布局類型,有許多子選項,參照手冊

  

指定網絡屬性相關選項

  網絡屬性相關選項用於定義網絡設備接口類型及其相關的各類屬性等信息這里介紹nic ,tap 與user 三種,其他的參見手冊

  -net nic [,vlan=n] [,macaddr=mac] [,model=type][,name=name][,addr=addr][,vectors=v]:創建一個新網卡設備並將其連入vlan中;

    PC架構上默認的NIC為e1000,

    macaddr用於制定mac地址 

    name用於制定一個在監聽時顯示的網上設備名稱

    qemu可以模擬多個類型的網卡設備如:virto,i82551,i82557b,i82559er,ne2k_isa,pcnet,rtl8139,e1000,smc9c111,lance,mcf_fec等,不過不同平台架構上,其支持的類型可能

    只包含前束列表的一部分 可以用qemu-kvm -net nic, mode=?來獲取 (需要指定一個虛擬機的映像文件)

     -net tap [,vlan=n][,name=name][,fd=h][,ifname=name][,script-file][,donscript=dfile]:通過物理機的TAP網絡接口連接至vlan n中,使用script=file 制定腳本(默認/etc/qemu-ifup)

    來配置當前網絡接口,並使用downscript=file制定腳本(默認為/etc/qemu-ifdown)來撤銷接口配置,使用 script=no 和downscrip=no 可以分別來禁止執行腳本

  -net user[,option][,option][,...] : 在用戶模式配置網絡棧,其不依賴於管理權限;有效選擇有:

    vlan=n 聯合制vlan n 默認n=0

    name=name 指定接口顯示名成,常用語架空模式中

    net=addr[/mask ]: 設定GuestOS可見的IP網絡,掩碼可選 默認為10.0.2.0/8

    host=addr : 指定GuestOS 可見的物理機ip地址,默認為制定網絡中的第二個,即 x.x.x.2

    dhcpstart=addr : 指定DHCP服務地址池中16個地址的起始IP ,默認為第16個至第31個,即 x.x.x.16-x.x.x31

    dns=addr 制定dns服務器地址,默認為網絡中第三個 即 x.x.x.3

    tftp=dir : 激活內置tftp服務器,使用制定的dir作為tftp服務器的默認根目錄

    bootfile=file BOOTP文件名稱,用語實現網絡引導GuestOS 如 qemu -hda linux.img -boot n -net user, tftp=/tftpserver/pub, bootfile=/pxelinux.0

  tap說明:需要將虛擬橋接設備關聯至物理網卡設備,才可以創建出這個橋接設備,所以需要關聯一個手動寫的文件。關閉時到無所謂,因為會自動銷毀

 

所以創建橋接網卡的時候 -net 要指定兩遍  -net nic (指定虛擬機網卡) -net tap(指定臨時創建的虛擬接口)通過tap接口敲到eth0上去。 所以剛啟動虛擬機時tap的臨時網絡接口不存在,需要制定腳本來創建。/etc/qemu-ifup 就是做這個用的,但是這個腳本不存在,需要手動編寫

 

例子:

 

 

 1,先創建一個磁盤影響文件

[root@centos6 ~]# mkdir /images/vm1 -pv
mkdir: 已創建目錄 "/images"
mkdir: 已創建目錄 "/images/vm1"
[root@centos6 ~]# qemu-img create -f qcow2 -o size=100G /images/vm1/centos.qcow2
Formatting '/images/vm1/centos.qcow2', fmt=qcow2 size=107374182400 encryption=off cluster_size=65536

  [root@centos6 ~]# ll -h /images/vm1/centos.qcow2
  -rw-r--r--. 1 root root 194K 3月 15 23:13 /images/vm1/centos.qcow2

[root@centos6 ~]# qemu-kvm -name "centos01" -m 512 -smp 2 -hda /images/vm1/centos.qcow2  -cdrom centos.iso \
> -boot order=dc,onec=d  

 

 

 

[root@centos6 ~]# qemu-img create -f qcow2 -o ? /images/vm1/centos.qcow2
Supported options:
size             Virtual disk size
backing_file     File name of a base image
backing_fmt      Image format of the base image
encryption       Encrypt the image
cluster_size     qcow2 cluster size
preallocation    Preallocation mode (allowed values: off, metadata, falloc, full)

 

preallocation  預分配格式,稀疏磁盤格式,真正大小要小的很多,如果=off, 那就更小,metadata會預先分配元數據信息,性能會好,但是額外占用空間。


qemu-img snapshot 快照:

qemu-img info /images/vm1/centos.qcow2 查看文件信息

qemu-img convert 轉換文件格式的 將dd 生成的文件轉換成qcow2格式


  

 

 

 

 

然后使用vnc連接器對地址鏈接

安裝vnc 服務器

[root@centos6 ~]# yum install tigervnc-server

 

 

執行命令 : vncserver :1 

 

 

 

 如果這個方法不能自動彈出窗口那么就用下面的方法鏈接

1、[root@centos6 ~]# yum install tigervnc

 2、然后執行上面創建虛擬機的命令

3、再開一個端口鏈接本機的5900端口

[root@centos6 ~]# vncviewer :5900

 

這樣就能看到安裝界面了

 

使用-drive 指定磁盤類型 

[root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2\
           -drive file=/root/centos.iso media=cdrom, index=1 -boot order=dc

  

vim /etc/qemu-ifup

#! /bin/bash

switch=br0 #打算自己創建一個接口橋接到br0上去 這個br0 要之前就要創建好了

if [ -n $1 ]; then #  $1 這個參數是不是不空
        #ip link set $1 up
        ifconfig $1 up  #讓需要創建的這個接口啟動起來
        sleep 0.5s  #等待內核加載這個接口
        brctl addif $swich $1  #在br0橋上添加 $1 這個要創建的中劍橋
        exit 0
else
        echo "Error no specifed interface."
        exit 1
fi

 bash -n /etc/qemu-ifup 檢查語法是否錯誤

 

使用cd安裝,並制定網絡接口,然后創建橋接可以訪問外網

[root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2 \
            -drive file=/root/centos.iso media=cdrom, index=1 -boot order=dc -net nic -net tap,name=vnet0,script=/etc/qemu-ifup ,downscript=no

  

 

使用 pxe模式安裝

 

 [root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2  \
            -boot order=nc -net nic -net tap,name=vnet0,script=/etc/qemu-ifup ,downscript=no

  

增加br0 腳本

#! /bin/bash
#add bridge
brctl addbr br0

#cancel ip
ifconfig eth0 0 up

#add eth0 to br0
brctl addif br0 eth0

#config br0's ip
ifconfig br0  10.211.55.4/24 up

#up br0
brctl stp br0 on
  

 

 

 

 編寫br0網卡信息

DEVICE=br0     #網卡名稱
BOOTPROTO=none  #手動指定地址
NM_CONTROLLED=no  
ONBOOT="yes"
TYPE=Bridge    #類型為橋接
IPADDR=10.211.55.4    #ip 
NETMASK=255.255.255.0   #mask
GATEWAY=10.211.55.1   #網關
USERCTL=no

  

 然后編輯eth0

DEVICE="eth0"
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT="yes"
TYPE="Ethernet"
USERCTL=no

  

重啟網絡服務:

service network restartw

 

刪除網橋

yao@twomoon:~$ sudo brctl delbr br0
bridge br0 is still up; can't delete it
sudo ifconfig br0 down
sudo brctl delbr br0

 

修改回網卡設置,將br0網卡設置文件刪除

重啟網卡

service network resgart
報錯:
determining ip information for eth0 dhclient is already running. exiting  

 

#ps -aux|grep dhclient 找到dhclient的進程號

 

然后用#kill -9 進程號  便結束了dhclient進程

對於現在這個問題,這樣子做可能沒用處,接下來才是重點

首先網絡要選擇為NAT方式;其次是修改  #vim  /etc/sysconfig/network-scripts/ifcfg-eth0 其中:

NM_CONTROLLED="yes"

最后刷新服務  #service network restart 即可

 

 

 

 

 

配置好以后的網卡信息類似下面,eth0 沒有地址了,跑到了 br0上

 

 [root@centos6 ~]# qemu-kvm -name="centos1" -m=768 -smp 4 -drive file=/images/vm1/centos.qcow2 ,if=ide,index=0,media=disk,format=qcow2  \
            -boot order=nc -net nic -net tap,ifname=vnet0,script=/etc/qemu-ifup ,downscript=no
#ifname=的值會當做第一個參數傳給下面

!# /bin/bash
switch=br0

if [ -n "$1"]; then
   ifconfig $1 up
   sleep 0.5s
   brctl addif $switch $1
   exit 0
else
  echo "Error: no specifed"
qemu-ifup

 

qemu-kvm -name "centos-1" -m 512 -smp 2 -hda /images/vm1/centos.qcow2 -cdrom /media/psf/TOSHIBA EXT/images/CentOS-6.8-x86_64-bin-DVD1.iso -boot order=bc,once=d -net nic -net tap,ifname=br0 -vnc :0

 

 

啟動以后就可以了

 

 

 在上面的顯示中 按下 control + alt + 2  可以到達監控界面

 info network 這里顯示的vnet0  則是name=vnet0 指定的參數

 


免責聲明!

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



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