Kvm虚拟机部署方案

解决方案选择

综上所述:KVM is absolutely your best option For enterprise-ready, production-critical, supported deployments of Virtualization stacks built upon Ubuntu Servers.[9]

libvirt管理qemu-kvm,libvirt是目前通用的虚拟机管理接口标准,除了vmware之外的所有虚拟机均支持此标准,所以我们的虚拟机主要使用此接口管理。[5]

有无libvirt管理的虚拟化比较

涉及的几个概念:

  1. Domain:虚拟机的一个运行实例,简单的理解,就是一个虚拟机虚拟出来的操作系统。它的叫法可是多种多样:instance,guest OS,virsual machine,其实都指的同一个概念。
  2. Hypervisor:指的就是虚拟机本身,比如qemu, kvm, xen...
  3. libvirt 由几个不同的部分组成,其中包括应用程序编程接口 (API) 库、一个守护进程 (libvirtd),以及一个默认命令行实用工具 (virsh),libvirtd守护进程负责对虚拟机的管理工作,在用各种工具对虚拟机进行管理的时候,这个守护进程一定要跑起来,而且这个进程可以分为两种,一种是root权限的libvirtd,一种是普通用户权限的libvirtd,前者权限大,可以虚拟计算机的各种设备。
  4. 开启root权限的libvirtd守护进程要以root身份去运行:sudo libvirtd --daemon

实际使用中发现libvirt会把串口视为终端,导致使用了串口的windows门禁系统无法启动,虽然可以物理host usb转串口转接线,但不能达到门禁需要的波特率,无法识别电子锁,所以用screen启动qemu-kvm,将ttyS0映射为windows门禁的com1口。

软件包安装

Socket文件:/var/run/libvirt/libvirt-sock,需在/etc/libvirt/libvirtd.conf中设定sock访问权限,并将需登录管理界面的用户添加到libvirtd。

Libvirtd服务默认为unixsocket方式侦听,只能从本地连接、或通过qumu+ssh//方式连接;也可修改/etc/libvirt/libvirtd.conf启用tcp方式。

虚拟系统安装

仅使用qemu时,进行虚拟系统的安装(在本地完成安装)。

libvirt+qemu-kvm环境搭建

此处为全手工配置libvirt的所有xml文件,也可使用virt-manager创建和管理xml文件。

开启TCP侦听

  • 修改VNC监听地址,让远程可以登录:/etc/libvirt/qemu.conf
    vnc_listen = "0.0.0.0"
    

    登录libvirt服务方法

    virsh -c qemu:///system                         # 本地登录libvirt控制台
    virsh -c qemu+ssh://root@172.17.20.20/system    # ssh远程登录libvirt控制台
    virsh -c qemu+tcp://172.17.20.20:16509/system   # tcp远程登录libvirt控制台
    virt-manager -c qemu+tcp://172.17.20.20:16509/system # 运行libvirt图形管理界面
    virt-manager -c qemu+ssh://root@172.17.20.20/system
    

    相关目录说明

    建立存储池

    导入虚拟磁盘

    将前面创建的虚拟磁盘移动进存储池的目录:

    mv windows2003.img /data/libvirt/images
    

    注册虚拟磁盘

    配置网络

    配置libvirt网络

    修改网卡配置文件

    编辑双网卡网络配置文件(/etc/network/interfaces)[7]

    网络由libvirt管理,/etc/network/interfaces只负责网桥启动后将eth0连上网桥,可选为在/etc/network/interfaces中为网桥指定ip,但此ip需和libvirt网络配置文件中同网桥定义的ip一致。

    Iptables策略需求

    iptables -A FORWARD -i virbr1 -j ACCEPT
    iptables -A FORWARD -i virbr2 -s "192.168.100.0/24" -d "192.168.100.0/24" -j ACCEPT
    iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "IPTABLES_FORWARD_NOMATCH:" --log-level 7
    
    # 另一种将允许所有桥类型端口转发的方式:
    iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
    
    # 或不将FORWARD流量交给iptables管理:
    #Alternatively, prevent bridged traffic from being processed by iptables rules. 
    #In /etc/sysctl.conf append the following lines:
    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0
    
    #Reload the kernel parameters configured with sysctl
    sysctl -p /etc/sysctl.conf
    

    重启networking

    建立虚拟机

    拷贝虚拟机

    virsh -c qemu:///system vol-clone --pool vm windows2003.img windows2003-doorcontrol.img

    然后将原虚拟机xml复制成windows2003-doorcontrol.xml,并修改uuid、虚拟机名称等信息。

    virsh -c qemu:///system create windows2003-doorcontrol.xml

    带串口的虚拟机

    门禁系统管理软件需使用串口与门禁终端联机,而因libvirt启动与windows的串口冲突,并且将usb转串口线host给windows之后发现,无法达到通讯所需速率,所以使用screen直接启动qemu-kvm用作门禁管理终端。

    之所以不使用start-stop-daemon是因为考虑连接控制终端的需要。

    维护可用资源

    qemu-img convert -c -f qcow2 -O qcow2 ubuntu1004-template.img ubuntu1004-template_copy.img

    ssh -o "ProxyCommand=connect -S 127.0.0.1:2021 192.168.100.253 22" dfjsb@192.168.100.253

    参考资料

    脚注

    其他

    qemu是一个仿真器,即可用于来宾操作系统的虚拟化,也可以作为完整的机器仿真器使用,运行使用主机 CPU 或其他 CPU 架构的操作系统。

    qemu 支持两种操作模式:用户模式仿真和系统模式仿真。

    1. 用户模式仿真 允许一个 CPU 构建的进程在另一个 CPU 上执行(执行主机 CPU 指令的动态翻译并相应地转换 Linux 系统调用)。
    2. 系统模式仿真 允许对整个系统进行仿真,包括处理器和配套的外围设备,这时就应该使用root权限的libvirtd。
      # qemu相关的命令:
      
      # 创建一个名为disk.img的128M大小的qcow格式的磁盘映像文件,这个文件充当来宾操作系统的硬盘。
      qemu-img create -f qcow disk.img 128M  
      
      # -hda指定磁盘映像文件,-cdrom指定光盘镜像文件,-boot指定从哪里引导系统,d是从CD-ROM引导,c表示从硬盘引导
      qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d  
      
      # 开始启动来宾操作系统
      qemu -hda disk.img