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虚拟机要注意,硬件必须支持虚拟化

kvm -- Kernel-based Virtual Machine_第1张图片

 

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 -- Kernel-based Virtual Machine_第2张图片

 

 

查看内核是否编译了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 -- Kernel-based Virtual Machine_第3张图片

 

 kvm管理工具站

kvm -- Kernel-based Virtual Machine_第4张图片

 

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*

kvm -- Kernel-based Virtual Machine_第5张图片

centos6以后xen就不能运行在dome0中了,红帽抛弃了xen专项大力研发kvm,所以这套组件在centos6后仅适用于kvm,但是xen源中的libvirt是支持kvm的

 

4、kvm只能虚拟cpu以及内存,如果想虚拟io就要装qemu

yum grouplist | grep -i "Virtualization"

  

如果想省事就把这4个组都装上去

 

查看包信息

 kvm -- Kernel-based Virtual Machine_第6张图片

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

安装成功后可以创建虚拟机

但是可以发现没有qemu-kvm的命令,红帽有意为之,因为他想让我们使用virsh

 

 

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

这个工具在libexec中,但是这个不在我们的环境变量中。可以做个链接

kvm -- Kernel-based Virtual Machine_第7张图片

 qemu的命令很多,但是功能也就是创建虚拟机 cpu几颗,内存多大,IO ,光驱,硬件设备 ,映像文件位置,等等

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

 

可以指定的一些选项

kvm -- Kernel-based Virtual Machine_第8张图片

 

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说明:需要将虚拟桥接设备关联至物理网卡设备,才可以创建出这个桥接设备,所以需要关联一个手动写的文件。关闭时到无所谓,因为会自动销毁

kvm -- Kernel-based Virtual Machine_第9张图片 

所以创建桥接网卡的时候 -net 要指定两遍  -net nic (指定虚拟机网卡) -net tap(指定临时创建的虚拟接口)通过tap接口敲到eth0上去。 所以刚启动虚拟机时tap的临时网络接口不存在,需要制定脚本来创建。/etc/qemu-ifup 就是做这个用的,但是这个脚本不存在,需要手动编写

 

例子:

kvm -- Kernel-based Virtual Machine_第10张图片

 

kvm -- Kernel-based Virtual Machine_第11张图片

 

 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 

kvm -- Kernel-based Virtual Machine_第12张图片

 

 kvm -- Kernel-based Virtual Machine_第13张图片

 

 如果这个方法不能自动弹出窗口那么就用下面的方法链接

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

 2、然后执行上面创建虚拟机的命令

3、再开一个端口链接本机的5900端口

[root@centos6 ~]# vncviewer :5900

kvm -- Kernel-based Virtual Machine_第14张图片

 

这样就能看到安装界面了

 

使用-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

  

kvm -- Kernel-based Virtual Machine_第15张图片

 

使用 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上

kvm -- Kernel-based Virtual Machine_第16张图片

 

 [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

 

 

启动以后就可以了

 

kvm -- Kernel-based Virtual Machine_第17张图片

 

 在上面的显示中 按下 control + alt + 2  可以到达监控界面

 info network 这里显示的vnet0  则是name=vnet0 指定的参数

kvm -- Kernel-based Virtual Machine_第18张图片

 

转载于:https://www.cnblogs.com/python-way/p/6168382.html

你可能感兴趣的:(操作系统,数据结构与算法,运维)