kvm

Posted woaiyitiaochai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kvm相关的知识,希望对你有一定的参考价值。

1、搭建kvm虚拟环境

•KVM是一个混合类型的VMM,它能够以模拟方式支持硬件的完全虚拟

化,也能够在GuestOS中安装驱动程序进而支持部分硬件的半虚拟化

•对网络设备和块设备来讲,半虚拟化方式能够极大地提升设备性能

•Red Hat联手IBM同Linux社区开发出了一种独立于VMM的半虚拟化驱动

程序标准VirtIO,根据这种标准开发的半虚拟化设备驱动程序可兼容地

运行于多种不同的VMM上,从而提高了相关VMM之间的互操作性

•VritIO驱动已经包含于2.6.25及以后版本的Linux内核中,RHEL系列的

操作系统4.8+、5.3+及6.0+的内核业已支持此驱动,而且,Red Hat专门

为GuestOS模式的Windows提供的VirtIO驱动程序也通过了微软的

WHQL认证

基于libvirt API管理工具主要有VMM和virsh。

• “VMM(Virtual Machine Manager)”程序提供了virt-manager、virtinst和virt

viewer三个工具,均可以通过官方站点http://www.virt-manager.org获取

• virt-manager:通过libvirt管理虚拟机的图形化工具,并可用于启动、关闭、新建或删除虚拟

设备,连接至图形或串行控制台,以及查看资源占用率类的统计数据等;

• virtinst:构建及安装虚拟的工具组件,包括virt-install(创建及安装虚拟机)、virt-clone(虚

拟机克隆)、virt-convert(虚拟机格式转换)和virt-image(基于xml格式的镜像描述文件创

建虚拟机)等;

• virt-viewer:连接虚拟机的图形化客户端;

• virsh:管理虚拟机的交互式shell,可用于创建、暂停、停止域等,也可实现虚拟

设备的管理,是用于管理VKM虚拟机的最常用工具之一

桥接网络,将物理机中的网卡,变为交换机,配置虚拟交换机,连接本机其他虚拟机,将虚拟交换机配置ip地址,取消网卡ip地址,使其变为交换机,当外部来的报文进入物理网卡(相当于虚拟交换机)发送给宿主机网卡(其实是虚拟的网卡)或者其他虚拟机(在同一个万网段),会使其所有虚拟机暴露在网络中

nat网络在宿主机中配置一块虚拟网络空间(路由器)。连接所有虚拟机。将虚拟机所有虚拟机网关指向虚拟路由器。在通过内核驱动虚拟路由器将报文转至物理网卡。通过物理网卡出去

仅主机模式:只能与宿主机通信

 

技术图片
 

安装kvm步骤

安装使用KVM:

判断CPU是否支持硬件虚拟化:

grep -i -E ‘(vmx|svm|lm)‘ /proc/cpuinfo

vmx:Intel VT-x

svm:AMD AMD-v

 

1,在vm虚拟机中安装kvm虚拟机,需要开启cpu虚拟化选项

 

技术图片
勾选cpu虚拟化

modeprobe kvm #加载kvm模块至内核中

 

技术图片
 

快速使用kvm技术:

# yum install libvirt-daemon-kvm qemu-kvm virt-manager

# modprobe kvm

# systemctl start libvirtd.service

# virsh iface-bridge INTERFACE BRIDGE_NAME

# virt-manager

 

默认libvirtd安装虚拟机只有nat模式网络,如果需要桥接模式则需设置将物理网卡转换为交换机,创建虚拟桥设置为网卡。

 

vim  /etc/sysconfig/network-scripts/ifcfg-ens33 修改网卡配置文件增加一项 BRIDGE=br0 设置为网桥

    TYPE="Ethernet"

    PROXY_METHOD="none"

    BROWSER_ONLY="no"

    BOOTPROTO="none"

    NAME="ens33"

    DEVICE="ens33"

    ONBOOT="yes"

    BRIDGE=br0

 

vim /etc/sysconfig/network-scripts/ifcfg-br0 修改网桥设备,增加ip地址

    BROWSER_ONLY="no"

    BOOTPROTO="none"

    NAME="br0"

    DEVICE="br0"

    ONBOOT="yes"

    IPADDR="192.168.101.195"

    NETMASK=255.255.255.0

    GATEWAY="192.168.101.1"

 

技术图片
修改后网卡参数

virt-manager  #启动图形界面虚拟机

 

技术图片
 

 

技术图片
选择镜像

 

技术图片
可选择桥接或nat模式
技术图片
开始安装

 

使用virsh命令管理kvm虚拟机

virsh list 查看虚拟机列表  --all 显示所有虚拟机包括未启动虚拟机

virsh dumpxml  generic    # 查看创建虚拟机时记录的选项模板文件,之后可使用virsh结合此模板文件创建虚拟机,创建虚拟机后此文件会自动存放至 /etc/libvirt/qemu/目录中

virsh dumpxml generic > /etc/libvirt/qemu/c2.xml  # 导出虚拟机xml文件

vim /etc/libvrt/qemu/c1.xml 修改配置文件,名称,内存,及mac信息等等

 

    <domain type=‘kvm‘ id=‘1‘>

      <name>c1</name> #名称

      <memory unit=‘KiB‘>1047552</memory># 内存 

      <currentMemory unit=‘KiB‘>1047552</currentMemory>

      <vcpu placement=‘static‘>1</vcpu> #占用cpu数

    </controller>

        <interface type=‘bridge‘>

          <mac address=‘52:54:00:00:74:2a‘/> #修改mac

          <source bridge=‘br0‘/>

          <target dev=‘vnet0‘/>

          <model type=‘rtl8139‘/>

          <alias name=‘net0‘/>

          <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>

        </interface>

保存模板,之后使用virsh create 创建虚拟机

virsh define /etc/libvirt/qemu/c2.xml #创建虚拟机不启动

 

技术图片
创建但为启动

[root@centos7 ~]# virsh start c1  # 启动虚拟机

        Domain c1 started

[root@centos7 ~]# virsh domifaddr c1 #查看虚拟机网络信息

        Name      MAC address          Protocol    Address

[root@centos7 ~]# virsh console generic #本地连接控制台

    Connected to domain generic

    Escape character is ^]

 

技术图片
 

virsh save c1 保存虚拟机 

virsh restore  c1 running 继续运行

virsh shutdown c1 关机 

virsh destroy c1 删除虚拟机

[root@centos7 ~]# virsh domiflist c1 #查看虚拟机的网络状态,虚拟机网卡为成对出现,另一半则在宿主机上表现为vnet1

Interface  Type      Source    Model      MAC

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

vnet1      bridge    br0        rtl8139    52:54:00:00:74:2a

[root@centos7 ~]# virsh domblklist c1 #查看虚拟机对应宿主机文件映像文件

Target    Source

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

hda        /var/lib/libvirt/images/generic.qcow2

 

技术图片
查看虚拟机网卡报文信息

使用qemu-img 配置磁盘

qemu-img create -f qcow2 -o preallocation=metadata,size=10G /data/vms/mydis.img #创建磁

盘映像文件

技术图片
查看磁盘映像文件信息

virsh attach-disk generic /data/vms/mydis.img vdb 向虚拟机generic添加刚创建的磁盘

 

技术图片
查看硬盘信息添加成功

[root@centos7 ~]# virsh detach-disk generic vdb  #拆除虚拟硬盘设备

Disk detached successfully

 

[root@centos7 ~]# virsh net-dumpxml default # 查看默认虚拟网络xml文件

    <network>

      <name>default</name>

      <uuid>2f80309c-c18b-4fd0-ab50-1c44a01adb13</uuid>

      <forward mode=‘nat‘>

        <nat>

          <port start=‘1024‘ end=‘65535‘/>

        </nat>

      </forward>

      <bridge name=‘virbr0‘ stp=‘on‘ delay=‘0‘/> 

      <mac address=‘52:54:00:77:e9:31‘/>

      <ip address=‘192.168.122.1‘ netmask=‘255.255.255.0‘>

        <dhcp>

          <range start=‘192.168.122.2‘ end=‘192.168.122.254‘/>

        </dhcp>

      </ip>

</network>

 

定义隔离网络 

[root@centos7 networks]# vim /etc/libvirt/qemu/net/virnet0.xml 在此目录中创建xml文件定义隔离网络 

    <network>

    <name>geli</name>

    <bridge name=‘virbr1‘ stp=‘on‘ delay=‘0‘/>

    <mac address=‘52:54:00:70:e9:31‘/>

    </network>

virsh net-create virnet0.xml  #从virnet0.xml 中创建一个隔离网络

[root@centos7 networks]# virsh net-create virnet0.xml 

     Network geli created from virnet0.xml

 

技术图片
创建geli网络成功

之后新创建虚拟机则可加入此隔离网络

2、使用qemu-kvm创建和管理虚拟机

qemu-kvm命令默认存放在 /usr/libvert/cmd/目录中,如果不想使用绝对路径执行qemu-kvm命令

则可使用 ln -s /usr/libexec/qemu-kvm /usr/sbin 软连接至path目录中

Qemu:

处理器模拟器

仿真各种IO设备

将仿真设备连接至主机的物理设备

提供用户接口

qemu-kvm命令语法:

qemu-kvm [options] [disk_image]

选项有很多类别:

标准选项、块设备相关选项、显示选项、网络选项、...

标准选项:

-machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型;

-cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;

-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虚拟机上vcpu的数量及拓扑;

-boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]

order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d

-m megs:虚拟机的内存大小;

-name NAME:当前虚拟机的名称,要惟一;

块设备相关的选项:

-hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;

-hdc/-hdd file:第2和第3个;

-cdrom file:指定要使用光盘映像文件;

-drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:

file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;

if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,...

media=TYPE:介质类型,cdrom和disk;

index=i:设定同一类型设备多个设备的编号;

cache=writethrough|writeback|none|directsync|unsafe:缓存方式;

format=f:磁盘映像文件的格式;

显示选项:

-display type:显示的类型,sdl, curses, none和vnc;

-nographic:不使用图形接口;

-vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;

-vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口;

display:

(1) HOST:N

在HOST主机的第N个桌面号输出vnc;

5900+N

(2) unix:/PATH/TO/SOCK_FILE

(3) none

options:

password:连接此服务所需要的密码;

-monitor stdio:在标准输出上显示monitor界面;

Ctrl-a, c:在console和monitor之间切换;

Ctrl-a, h

网络选项:

-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]

为虚拟机创建一个网络接口,并将其添加至指定的VLAN;

model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;

-net nic,model=?

macaddr=mac:指明mac地址;52:54:00:

-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:

通过物理的TAP网络接口连接至vlan n;

script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup

downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown

ifname=NAME:自定义接口名称;

/etc/qemu-ifup

#!/bin/bash

#

bridge=br0

if [ -n "$1" ];then

ip link set $1 up

sleep 1

brctl addif $bridge $1

[ $? -eq 0 ] && exit 0 || exit 1

else

echo "Error: no interface specified."

exit 1

fi

其它选项:

-daemonize:以守护进程运行;

示例1:

~]#  qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc  :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup

示例2:

~]# qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize

半虚拟化:virtio

建议:Network IO, Disk IO使用virtio,性能会有显著提升;

dnsmasq:

listen-address=192.168.1.132,127.0.0.1

dhcp-range=192.168.1.50,192.168.1.150,48h

dhcp-option=3,192.168.0.1

 

qemu-kvm -cpu host -m 512 -name cn4 -boot order=dc -drive file=/data/vm1.img,media=disk,if=virtio,cache=writeback,format=qcow2 -vnc :5 -net nic,macaddr=52:54:00:00:00:04,model=virtio -net tap,script=/etc/qemu-ifup -daemonize

http://download.cirros-cloud.net/0.4.0/ 可在此地址下载img镜像系统

 

创建虚拟机

技术图片
 

安装tigervnc 

[root@centos7 data]# vncviewer 

 

技术图片
 

 

技术图片
登录成功

 

技术图片
 

配置仅主机网络,给虚拟机加入的宿主机网桥配置ip地址即可通信

 

技术图片
 

构建路由模式

宿主机打开核心转发,虚拟机网关指向网桥的ip地址 192.168.30.1

配置虚拟机网关指向宿主机虚拟的网桥地址

技术图片
 

打开宿主机核心转发

在宿主机打开sant规则

iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -d 192.168.30.0/24 -j MASQUERADE

技术图片
通信成功

 

3、利用virt-install创建虚拟机并安装guestOS7.x

使用qemu-img 创建磁盘文件

qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G

 

virt-install --name centos7 --ram 1024 --vcpus=2 --location=/data/centos.iso --disk path=/var/lib/libvirt/images/cenot.qcow2,size=10,format=qcow2 --network bridge=br0 --os-type=linux --os-variant=rhel6 --extra-args=‘console=ttyS0‘ --force

name centos7 表示 guest 名称;ram 1024 表示给 guest 分配的内存大小,单位为M; vcpus=2 表示给 guest 分配的虚拟CPU数量; location=/data/CentOS-7iso 指定客户机安装镜像文件; disk path=/opt/centos-6.7-4.qcow2,size=10,format=qcow2 客户端磁盘的位置及格式;network bridge=br0 客户端网卡配置,使用桥接方式 br0 ;os-type=linux 表示系统为linux;os-variant=rhel6 表示系统类型为 rhel6; extra-args=’console=ttyS0’ 表示使用 console ttyS0 进行管理 guest –force

 

技术图片
 

以上是关于kvm的主要内容,如果未能解决你的问题,请参考以下文章

KVM之实现批量创建KVM虚拟机

KVM是啥?

kvm系列之二:kvm日常管理

安卓开启kvm

[kvm]-kvm入门

51 kvm技术基础使用qemu-kvm管理kvm虚拟机