zoukankan      html  css  js  c++  java
  • 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


     
  • 相关阅读:
    Codeforces 916E Jamie and Tree (换根讨论)
    BZOJ 3083 遥远的国度 (换根讨论 + 树链剖分)
    Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
    ECNU 3480 没用的函数 (ST表预处理 + GCD性质)
    HDU 4343 Interval query(贪心 + 倍增)
    Codeforces 147B Smile House(DP预处理 + 倍增)
    HDU 4870 Rating (高斯消元)
    TopCoder SRM 301 Div2 Problem 1000 CorrectingParenthesization(区间DP)
    Hrbust 2320 OX (博弈)
    Hrbust 2319 Number Game(贪心)
  • 原文地址:https://www.cnblogs.com/woaiyitiaochai/p/11757969.html
Copyright © 2011-2022 走看看