IBM LinuxOne服务器基于KVM开源技术提供了强大的虚拟化能力,基于LinuxOne的KVM虚拟机能够充分利用LinuxOne的高容量,高负载,高安全的运行环境,是运行区块链的理想服务器。下面简单介绍一下怎样在LinuxOne上配置KVM客户机
在基于s390x架构的LinuxOne服务器上 (操作系统是Ubuntu)安装运行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(全称Quick Emulator 快速模拟器) 是独立虚拟软件,QEMU能够独立模拟一整套硬件系统包括处理器及挂载的外围硬件设备。QEMU的内核模拟加速器是可选的,比如KVM。 kqemu是该软件的加速软件。
KVM只是提供了内核虚拟化能力,不能模拟一整套硬件系统。
QEMU不依赖KVM,能够独立模拟整套硬件系统,并且能够在一种硬件上跑多种操作系统,指令集需要转换,速度慢。
QEMU在Linux操作系统上跑Linux操作系统的虚拟机时,可以和KVM集成,利用KVM提供的虚拟化能力,大部分虚拟机的指令能够以原生的方式在宿主机上跑, 不需要转换,性能几乎没有损失。
从KVM来说,KVM 并不需要QEMU进行虚拟处理,只是需要QEMU的上层管理界面进行虚拟机控制。
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
创建一个qumu 磁盘文件,这个磁盘文件会配置成虚拟机的硬盘
# sudo qemu-img create -f qcow2 -o preallocation=metadata,size=120G /var/lib/libvirt/images/qemu-img-file.qcow2
使用一个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>
使用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
在同一个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>
基于NAT的虚拟网络,外网不能访问KVM客户机。s390x上的KVM客户机支持配置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
<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>
# 设置缺省网管
> 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
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞2
添加新评论0 条评论