如何安装KVM和libvirt在CentOS 6.2与桥接网络

如何安装KVM和libvirt在CentOS 6.2与桥接网络 本教程介绍如何安装KVM管理程序和libvirt  虚拟...

如何在具有桥接网络的CentOS 6.2上安装KVM和libvirt

本教程介绍如何在Linux CentOS 6.2上安装KVM虚拟机管理程序libvirt虚拟化库。 在本指南的最后,您将拥有一个具有以下功能的CentOS盒(命名为主机):

  • 虚拟化容量 :多个客户端(Linux / Windows)的机会运行并共享主机的硬件
  • 桥网络配置 :您将能够直接访问客户端,就像它们是同一个LAN上的物理机器一样,反之亦然。
  • 可视化管理 :使用virt-manager (我在这个howto中使用Ubuntu 11.10),您将能够远程管理CentOS主机上的虚拟机。

怎么了

KVM:

“KVM(用于基于内核的虚拟机))是一款针对Linux的x86硬件虚拟化扩展(Intel VT或AMD-V)的完全虚拟化解决方案,它包含一个可加载内核模块kvm.ko,它提供核心虚拟化基础设施和处理器专用模块,kvm-intel.ko或kvm-amd.ko ...“

“使用KVM,可以运行运行未修改的Linux或Windows映像的多个虚拟机,每个虚拟机都有专用的虚拟化硬件:网卡,磁盘,图形适配器等。”

libvirt:

  • “与最近版本的Linux的虚拟化功能交互的工具包...”
  • “根据GNU通用公共许可证提供的免费软件”。
  • “长期稳定的C API”
  • “一套通用语言的绑定”

Intel-VT和AMD-V

要求

  • 硬件
    • 处理器支持Intel-VTAMD-V技术
    • 丰富的RAM内存取决于客人数量
    • 网络连接
  • 软件
    • 一个以前安装的Linux CentOS 6.2与最近的Linux内核。 关于这个如何

      $ uname -r

      2.6.32-220.2.1.el6.x86_64

      $ lsb_release -a

      LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
      Distributor ID: CentOS
      Description: CentOS release 6.2 (Final)
      Release: 6.2
      Codename: Final

    • 安装了Desktop环境的Linux客户机
    • 一个可用的CentOS镜像/存储库

安装步骤

  1. 登录CentOS作为bozz用户(一个sudoer用户),并检查您的硬件是否支持虚拟化扩展,在我的硬件上是:
  2. $ egrep '^flags.*(vmx|svm)' /proc/cpuinfo

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

  3. 安装kvmlibvirt软件包:

    $ sudo yum install kvm libvirt

  4. 将这两个软件包更新到可用于存储库/镜像的最新版本:

    $ sudo yum update libvirt kvm

    $ yum info libvirt

    Installed Packages
    Name        : libvirt
    Arch        : x86_64
    Version     : 0.9.4
    Release     : 23.el6_2.4

    $ yum info qemu-kvm

    Installed Packages
    Name        : qemu-kvm
    Arch        : x86_64
    Epoch       : 2
    Version     : 0.12.1.2
    Release     : 2.209.el6_2.1

  5. 重新启动libvirtd守护进程:

    $ sudo service libvirtd restart

  6. 验证kvm模块是否加载,您应该看到amdintel取决于硬件:

    $ lsmod | grep kvm

    kvm_intel              50380  0
    kvm                   305113  1 kvm_intel

  7. 发出一个virsh命令,以确保本地连接。

    $ sudo virsh sysinfo

    <sysinfo type =“smbios”>
    ...

  8. [可选]要使用非root用户使用KVM,请验证是否在安装时创建了kvm组:

    $ cat /etc/group | grep kvm

    kvm:x:36:qemu

    然后将bozz用户添加到kvm组,因此可以访问虚拟机管理程序:

    $ sudo usermod -a -G kvm bozz
    $ logout

    再次登录为bozz用户并验证kvm的会员资格:

    $ id

    uid=500(bozz) gid=500(bozz) groups=500(bozz),10(wheel),36(kvm) context=...

    并验证/ dev / kvm是否由组kvm拥有:

    $ ls -l /dev/kvm

    crw-rw-rw-. 1 root kvm 10, 232 Jan 17 14:50 /dev/kvm

    在运行udev的系统上,您可能需要在udev配置中添加以下行,以便自动将正确的组分配给新创建的设备:

    $ cat /etc/udev/rules.d/80-kvm.rules

    KERNEL=="kvm", GROUP="kvm", MODE="0666"

  9. 要使用非root帐户管理libvirt ,您应该使用PolicyKit 。 定义libvirt组的访问控制:

    $ sudo groupadd libvirt
    $ sudo usermod -a -G libvirt bozz
    $ logout

    再次以bozz用户身份登录并编辑新档案:

    $ sudo nano /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla

    与此内容:

    [libvirt Management Access]
    # For allowing access to specific user only:
    #Identity=unix-user:bozz
    # For allowing access to a group (like this guide):
    Identity=unix-group:libvirt
    Action=org.libvirt.unix.manage
    ResultAny=yes
    ResultInactive=yes
    ResultActive=yes
    

    重新启动libvirtd守护进程:

    $ sudo service libvirtd restart

    验证bozz用户是否可以本地访问qemu:/// system注意不鼓励使用qemu:/// session ):

    $ virsh -c qemu:///system sysinfo

    <sysinfo type="smbios">
    ...

    验证bozz用户是否可以远程访问qemu + ssh:// bozz @ SERVER / system 。 所以在Linux客户端问题上:

    对于Ubuntu客户端(如本指南):

    $ sudo apt-get install libvirt-bin

    对于CentOS客户端:

    $ sudo yum install libvirt

    然后:

    $ virsh -c qemu+ssh://bozz@SERVER/system sysinfo

    <sysinfo type="smbios">
    ...

    更改默认映像目录下的组所有权和权限:

    $ sudo chown root:libvirt /var/lib/libvirt/images
    $ sudo chmod g+rw /var/lib/libvirt/images

  10. [可选]当libvirtd> = 0.9.3 )以非root方式运行时,它尝试读取〜/ .libvirt / libvirtd.conf (请参阅此处 )。 解决办法是:

    $ mkdir -p ~/.libvirt
    $ touch ~/.libvirt/libvirtd.conf

    然后发布一个virsh命令作为bozz用户:

    $ virsh list

     Id Name                 State
    ----------------------------------

  11. 通过在/ etc / sysconfig / network-scripts / ifcfg-br0创建新的网络脚本来配置桥接网络:

    $ sudo nano /etc/sysconfig/network-scripts/ifcfg-br0

    并根据您的LAN设置配置参数( 注意 :选项区分大小写,即桥和桥是两个不同的选项):

    DEVICE="br0"
    TYPE=Bridge
    DELAY=0
    ONBOOT="yes"
    BOOTPROTO=static
    IPADDR=192.168.11.12
    NETMASK=255.255.255.0
    NETWORK=192.168.11.0
    GATEWAY=192.168.11.1
    DNS1=192.168.11.2
    PEERDNS="yes"
    NM_CONTROLLED=no
    

    然后编辑以太网网络脚本/ etc / sysconfig / network-scripts / ifcfg-eth0

    $ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0

    具有以下内容( 注意 :硬件地址取决于您的NIC,此处使用任意MAC地址):

    DEVICE="eth0"
    HWADDR="00:2C:C2:85:29:A3"
    ONBOOT="yes"
    BRIDGE=br0
    NM_CONTROLLED=no
    

    重新启动网络服务:

    $ sudo service network restart

    并验证bridge配置:

    $ brctl show

    bridge name bridge id STP enabled interfaces
    br0 8000.002cc28529a3 no eth0
    ...

    配置iptables以允许所有流量通过网桥转发:

    $ sudo iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
    $ sudo service iptables save
    $ sudo service iptables restart

    防止桥接流量被iptables规则处理,这提高了网桥的性能。 在/etc/sysctl.conf中附加以下行:

    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0

    重新加载使用sysctl配置的内核参数:

    $ sudo sysctl -p /etc/sysctl.conf

    重新启动libvirt守护进程:

    $ sudo service libvirtd reload