hexiaohu
作者hexiaohu2019-11-06 16:31
软件开发工程师, IBM

在LinuxOne服务器上安装配置KVM客户机

字数 6043阅读 592评论 0赞 2

前提

IBM LinuxOne服务器基于KVM开源技术提供了强大的虚拟化能力,基于LinuxOne的KVM虚拟机能够充分利用LinuxOne的高容量,高负载,高安全的运行环境,是运行区块链的理想服务器。下面简单介绍一下怎样在LinuxOne上配置KVM客户机

 目标

在基于s390x架构的LinuxOne服务器上 (操作系统是Ubuntu)安装运行KVM客户机,并且配置KVM客户机能够跟外网互通

相关软件介绍

KVM虚拟机架构

什么是KVM

KVM ( 全称是kernel-based virtual machine基于内核的虚拟机)是基于支持虚拟化扩展的硬件(如 intel VT 或 AMD-V)的linux 全虚拟化解决方案。
KVM包含两部分,一个部分是能提供核心虚拟化能力的可加载的Linux内核模块,另一部分是具体硬件处理器相关的模块(kvm-intel.ko or kvm-amd.ko)
KVM是开源软件,其内核模块代码已经从Linux  2.6.20合入Linux主线代码,其用户模块代码已经从QEMU 1.3合入QEMU主线代码。

什么是QEMU

QEMU(全称Quick Emulator 快速模拟器) 是独立虚拟软件,QEMU能够独立模拟一整套硬件系统包括处理器及挂载的外围硬件设备。QEMU的内核模拟加速器是可选的,比如KVM。 kqemu是该软件的加速软件。

KVM和QEMU的关系

KVM只是提供了内核虚拟化能力,不能模拟一整套硬件系统。
QEMU不依赖KVM,能够独立模拟整套硬件系统,并且能够在一种硬件上跑多种操作系统,指令集需要转换,速度慢。
QEMU在Linux操作系统上跑Linux操作系统的虚拟机时,可以和KVM集成,利用KVM提供的虚拟化能力,大部分虚拟机的指令能够以原生的方式在宿主机上跑, 不需要转换,性能几乎没有损失。
从KVM来说,KVM 并不需要QEMU进行虚拟处理,只是需要QEMU的上层管理界面进行虚拟机控制。

什么是libvirt

libvirt是虚拟化平台的管理层,提供了一套虚拟化平台的管理API, 这些API能够用来执行虚拟机管理的各种任务,比如生命周期的管理:创建,删除,启动,停止...

软件安装

KVM 内核模块在LinuxOne上是缺省支持的,不需要额外加载
安装qemu-kvm和libvirt

# sudo apt update
# sudo apt-get install qemu-kvm libvirt-bin bridge-utils

检测libvirt和qemu-kvm安装

# virsh -c qemu:///system list

KVM虚拟机的安装

1. 准备一个基于s390x的Linux操作系统的安装ISO文件, 保存为: /var/lib/libvirt/images/ubuntu-18.04.2-server-s390x.iso
2. 创建一个qumu 磁盘文件,这个磁盘文件会配置成虚拟机的硬盘

# sudo qemu-img create -f qcow2 -o preallocation=metadata,size=120G /var/lib/libvirt/images/qemu-img-file.qcow2
  1. 使用一个XML文件来定义一个KVM domain, 这个domain可以用来配置一个虚拟机,及定义虚拟机的外围硬件设备,多少个vCPU, 多少内存,网卡,硬盘,光驱.... s390x上一个典型的xml domain (~/kvm-guest.xml)定义如下:
    <domain type="kvm">
    <name>kvm-guest</name>
    <memory unit="GiB">10</memory>
    <vcpu>4</vcpu>
    <os>
     <type arch='s390x' machine='s390-ccw-virtio-bionic'>hvm</type>
     <boot dev='cdrom'/>
    </os>
    <iothreads>1</iothreads>
    <on_crash>preserve</on_crash>
    <devices>
     <disk type='file' device='cdrom'>
       <source file='/var/lib/libvirt/images/ubuntu-18.04.2-server-s390x.iso'/>
       <target dev='hdb' bus="virtio"/>
     </disk>
     <disk type="file" device="disk">
       <driver name="qemu" type="qcow2" cache="none" iothread="1" io="native"/>
       <source file="/var/lib/libvirt/images/ qemu-img-file.qcow2"/>
       <target dev="vda" bus="virtio"/>
     </disk>
     <interface type="network">
        <source network="default"/>
     </interface>
     <console type="pty">
       <target type="sclp"/>
     </console>
     <memballoon model="none"/>
    </devices>
    </domain>

    4. 使用libvirt的命令行接口工具 "virsh" 来管理虚拟机的生命周期

  • 创建虚拟机
    #virsh define ~/kvm-guest.xml

    在后台其实是libvirt调用qemu-kvm, 全命令类似如下:

    # qemu-system-s390x -machine accel=kvm -name TestVM -S -machine pc-i440fx-1.6,accel=kvm,usb=off -m 4000 -realtime mlock=off -smp 2,sockets=2,cores=1,threads=1 -uuid 39ac4786-1eca-1092-034c-edb6f93d291c -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/TestVM.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/dev/vms/TestVM,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 -netdev tap,fd=27,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:a5:cd:61,bus=pci.0,addr=0x3,bootindex=1 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device usb-tablet,id=input0 -vnc 127.0.0.1:2 -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 

     - 启动并安装虚拟机

    #virsh start kvm-guest  --console
  • 关闭虚拟机
    #virsh shutdown kvm-guest

 KVM客户机网络配置

基于NAT的虚拟网路

  • 允许KVM客户机访问外部网络,外部网络不能访问KVM客户机 - 在同一个Host上运行的KVM客户机可以相互访问 文件 "/etc/libvirt/qemu/networks/default.xml"定义了一个私有网路,并且提供了一个DHCP服务器,KVM客户机可以自动获取私有网络地址。default.xml如下:
    <network connections='1'>
      <name>default</name>
      <uuid>2b7feb48-e3d5-4b41-9a61-b42ca2835266</uuid>
      <forward mode='nat'>
        <nat>
          <port start='1024' end='65535'/>
        </nat>
      </forward>
      <bridge name='virbr0' stp='on' delay='0'/>
      <mac address='52:54:00:ac:05:11'/>
      <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>

    在Domain的配置XML文件里需要定义网络为default

    <interface type="network">
      <source network="default"/>
    </interface>

    基于MACVTAP的虚拟网络

    基于NAT的虚拟网络,外网不能访问KVM客户机。s390x上的KVM客户机支持配置MACVTAP网络,可以与外网互通
    - 一个MACVTAP端点是一种直接连接Host网络接口的字符设备
    - 每个 MACVTAP端点必须有自己的MAC地址,不能跟网络中的MAC地址重复,也不能跟Host的网络接口上的MAC地址相同
    - 在同一个Host上运行的KVM客户机在"bridge"模式下,能够相互之间直接通信

  • 限制:Host不能与在本Host上运行的KVM客户机之间通信

MACVTAP的网络配置

  - 检测Host上的macvtap内核模块是否已经加载

 # 检查内核模块有没有包含macvtap功能: 
 > lsmod|grep macvtap 
 macvtap 16384 2 
 macvlan 28672 1 macvtap 
 tap 24576 6 macvtap,vhost_net 

 # 检查内核符号表看看macvtap是不是被直接链接进内核里: 
 > grep macvtap  /proc/kallsyms
000003ff80be01e0 t macvtap_net_namespace [macvtap]
000003ff80be01f8 t macvtap_count_tx_dropped [macvtap]
000003ff80be0220 t macvtap_count_rx_dropped [macvtap]
000003ff80be0248 t macvtap_dellink [macvtap] 

# 如果内核模块没有加载,运行以下命令加载 
> modprobe macvtap

  - 在Domain XML配置文件修改并重新定义网络类型为"direct", MAC地址必须在网络里唯一, 下面是linuxOne上一个KVM客户机的一个配置

    <interface type='direct' trustGuestRxFilters='yes'>
      <mac address='fe:54:00:d1:03:d9'/>
      <source dev='vlan507' mode='bridge'/>
      <model type='virtio'/>
      <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0002'/>
    </interface>

  - 重起KVM客户机
  - 登录KVM客户机,配置客户机网络

# 设置缺省网管
> route add default gw 9.12.23.1

# 配置网络并且设置本机IP地址(外网能访问的IP地址)
> vim /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enc2:
      dhcp4: no
      addresses: [9.12.23.20/24]   #设置本机IP及掩码
      gateway4: 9.12.23.1   #设置网关
      nameservers:
          addresses: [114.114.114.114, 8.8.8.8]   #设置DNS

# 生效网络配置

> netplan apply

  - 从外网能够Ping KVM客户机

测试

  • 在同一LinuxOne服务器上 按照以上配置,启动另一台KVM客户机,两台KVM 客户机能够互相Ping
  • 可以在另一linuxOne服务器上按照以上配置,启动另一台KVM客户机,两台KVM 客户机能够互相Ping

KVM虚拟机的硬件配置限制参考

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

关于TWT  使用指南  社区专家合作  厂商入驻社区  企业招聘  投诉建议  版权与免责声明  联系我们
© 2019  talkwithtrend — talk with trend,talk with technologist 京ICP备09031017号-30