KVM基本介绍:
KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中,KVM目前已成为学术界的主流 VMM (virtual machine monitor,虚拟机监视器,也称为hypervisor)之一,也是当前各大云计算厂商广泛使用的虚拟化技术。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化,官方文档:http://www.ibm.com/developerworks/cn/linux/l-using-kvm/。
KVM的结构图如下:
KVM的基本原理及组件如下:
Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被KVM置于一种受限制的CPU模式下运行。 KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O拦截,Guest的部分I/O被KVM拦截后,交给 QEMU处理。 Qemu:纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件,正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,KVM完成复杂及要求比较高的设备虚拟化,而Qemu完成像鼠标、键盘等设备的虚拟化。
KVM管理工具:
KVM是运行在内核空间的组件模块,用户空间是无法直接使用的。因此需要安装用户空间的虚拟化管理工具,使用比较多的是libvirt。
libvirt结构图如下:
libvirt:使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。 virsh:是一个常用的管理KVM虚拟化的命令行工具,常用语管理运行在单个宿主机上的虚拟机,virsh是一个使用C语言编写调用libvirt API的虚拟化管理命令行工具。 virt-manager:virt-manager是一个虚拟化管理图形软件,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。
基于KVM的虚拟机创建:
1、验证是否开启虚拟化
CentOS7.X:
[root@kvm-node1 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
Ubuntu18.04:
root@ubuntu-kvm:~# grep -E "vmx|svm" /proc/cpuinfo
2、安装KVM工具包
CentOS7.X:
[root@kvm-node1 ~]#yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y [root@kvm-node1 ~]#systemctl start libvirtd [root@kvm-node1 ~]#systemctl enable libvirtd
Ubuntu18.04:
root@ubuntu-kvm:~# apt install qemu-kvm virt-manager libvirt-daemon-system -y root@ubuntu-kvm:~# kvm-ok #验证是否已经支持KVM INFO: /dev/kvm exists KVM acceleration can be used
验证是否生成NAT网卡virbr0:
3、创建磁盘:
[root@kvm-node1 ~]#ll /var//lib/libvirt/images/ #默认保存虚拟机磁盘的路径 total 0 #创建一个格式为raw大小为50G的裸磁盘 [root@kvm-node1 ~]#qemu-img create -f raw /var/lib/libvirt/images/CentOS-7-x86_64.raw 50G Formatting '/var/lib/libvirt/images/CentOS-7-x86_64.raw', fmt=raw size=53687091200 #创建一个格式为raw大小为50G的稀疏格式磁盘 [root@kvm-node1 ~]#qemu-img create -f qcow2 /var/lib/libvirt/images/CentOS-7-x86_64.qcow2 50G Formatting '/var/lib/libvirt/images/CentOS-7-x86_64.qcow2', fmt=qcow2 size=53687091200 encryption=off cluster_size=65536 lazy_refcounts=off
4、使用virsh-install命令创建虚拟机
virsh-install命令使用可以通过--help选项查看帮助:
[root@kvm-node1 ~]#virt-install --help usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options] 使用指定安装介质新建虚拟机。 optional arguments: -h, --help show this help message and exit --version show program's version number and exit --connect URI 使用 libvirt URI 连接到 hypervisor 通用选项: -n NAME, --name NAME 客户端事件名称 --memory MEMORY 配置虚拟机内存分配。例如: --memory 1024 (in MiB) --memory 512,maxmemory=1024 --vcpus VCPUS 为虚拟机配置的 vcpus 数。例如: --vcpus 5 --vcpus 5,maxcpus=10,cpuset=1-4,6,8 --vcpus sockets=2,cores=4,threads=2, --cpu CPU CPU 型号及功能。例如: --cpu coreduo,+x2apic --cpu host --metadata METADATA 配置虚拟机元数据。例如: --metadata name=foo,title="My pretty title",uuid=... --metadata description="My nice long description" 安装方法选项: --cdrom CDROM 光驱安装介质 -l LOCATION, --location LOCATION 安装源(例如:nfs:host:/path、http://host/path ftp://host/path)--pxe 使用 PXE 协议从网络引导 --import 在磁盘映像中构建虚拟机 --livecd 将光驱介质视为 Live CD -x EXTRA_ARGS, --extra-args EXTRA_ARGS 附加到使用 --location 引导的内核的参数 --initrd-inject INITRD_INJECT 使用 --location 为 initrd 的 root 添加给定文件 --os-variant DISTRO_VARIANT 在其中安装 OS 变体的虚拟机,比如 'fedora18'、'rhel6'、'winxp' 等等。 --boot BOOT 配置虚拟机引导设置。例如: --boot hd,cdrom,menu=on --boot init=/sbin/init (for containers) --idmap IDMAP 为 LXC 容器启用用户名称空间。例如: --idmap uid_start=0,uid_target=1000,uid_count=10 设备选项: --disk DISK 使用不同选项指定存储。例如: --disk size=10 (new 10GiB image in default location) --disk /my/existing/disk,cache=none --disk device=cdrom,bus=scsi --disk=? -w NETWORK, --network NETWORK 配置虚拟机网络接口。例如: --network bridge=mybr0 --network network=my_libvirt_virtual_net --network network=mynet,model=virtio,mac=00:11... --network none --network help --graphics GRAPHICS 配置虚拟机显示设置。例如: --graphics vnc --graphics spice,port=5901,tlsport=5902 --graphics none --graphics vnc,password=foobar,port=5910,keymap=ja --controller CONTROLLER 配置虚拟机控制程序设备。例如: --controller type=usb,model=ich9-ehci1 --input INPUT 配置虚拟机输入设备。例如: --input tablet --input keyboard,bus=usb --serial SERIAL 配置虚拟机串口设备 --parallel PARALLEL 配置虚拟机并口设备 --channel CHANNEL 配置虚拟机沟通频道 --console CONSOLE 配置虚拟机与主机之间的文本控制台连接 --hostdev HOSTDEV 将物理 USB/PCI/etc 主机设备配置为与虚拟机共享 --filesystem FILESYSTEM 将主机目录传递给虚拟机。例如: --filesystem /my/source/dir,/dir/in/guest --filesystem template_name,/,type=template --sound [SOUND] 配置虚拟机声音设备模拟 --watchdog WATCHDOG 配置虚拟机 watchdog 设备 --video VIDEO 配置虚拟机视频硬件。 --smartcard SMARTCARD 配置虚拟机智能卡设备。例如: --smartcard mode=passthrough --redirdev REDIRDEV 配置虚拟机重定向设备。例如:2.2.3:创建NAT网络虚拟机: --redirdev usb,type=tcp,server=192.168.1.1:4000 --memballoon MEMBALLOON 配置虚拟机 memballoon 设备。例如: --memballoon model=virtio --tpm TPM 配置虚拟机 TPM 设备。例如: --tpm /dev/tpm --rng RNG 配置虚拟机 RNG 设备。例如: --rng /dev/random --panic PANIC 配置虚拟机 panic 设备。例如: --panic default 虚拟机配置选项: --security SECURITY 设定域安全驱动器配置。 --numatune NUMATUNE 为域进程调整 NUMA 策略。 --memtune MEMTUNE 为域进程调整内粗策略。 --blkiotune BLKIOTUNE 为域进程调整 blkio 策略。 --memorybacking MEMORYBACKING 为域进程设置内存后备策略。例如: --memorybacking hugepages=on --features FEATURES 设置域 <features> XML。例如: --features acpi=off --features apic=on,eoi=on --clock CLOCK 设置域 <clock> XML。例如: --clock offset=localtime,rtc_tickpolicy=catchup --pm PM 配置 VM 电源管理功能 --events EVENTS 配置 VM 生命周期管理策略 --resource RESOURCE 配置 VM 资源分区(cgroups) 虚拟化平台选项: -v, --hvm 客户端应该是一个全虚拟客户端 -p, --paravirt 这个客户端一个是一个半虚拟客户端 --container 这台虚拟机需要一个容器客户端 --virt-type HV_TYPE 要使用的管理程序名称(kvm、qemu、xen 等等) --arch ARCH 模拟的 CPU 构架 --machine MACHINE 要模拟的机器类型 其它选项: --autostart 引导主机时自动启动域。 --wait WAIT 等待安装完成的分钟数。 --noautoconsole 不要自动尝试连接到客户端控制台 --noreboot 完成安装后不要引导虚拟机。 --print-xml [XMLONLY] 输出所生成域 XML,而不是创建虚拟机。 --dry-run 完成安装步骤,但不要创建设备或者定义 虚拟机。 --check CHECK 启用或禁用验证检查。例如: --check path_in_use=off --check all=off -q, --quiet 禁止无错误输出 -d, --debug 输入故障排除信息 使用 '--option=?' 或者 '--option h
上传系统IOS镜像到宿主机:
#提前上系统传安装镜像 [root@kvm-node1 ~]#ll /data/iso/CentOS-7-x86_64-Everything-1908.iso -rw-r--r-- 1 root root 11026825216 Dec 7 16:34 /data/iso/CentOS-7-x86_64-Everything-1908.iso
创建NAT网络虚拟机:
[root@kvm-node1 ~]#virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 2 --cdrom=/data/iso/CentOS-7-x86_64-Everything-1908.iso --disk path=/var/lib/libvirt/images/CentOS-7-x86_64.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
通过VNC客户端连接并安装虚拟机系统:
进入虚拟机系统安装步骤:
中间安装步骤过程省略,按照常规步骤安装完成虚拟机的系统即可。
此方式安装的虚拟机,创建的网络默认是nat模式,即虚拟机共享宿主机上virbr0网卡连接上外网,但外部无法直接通过网络访问到宿主机内部的虚拟机。如果需要让外部网络其他主机能访问到宿主机内部的虚拟机,则需要在宿主机上实现nat端口转发,或直接创建桥接网络的虚拟机。
创建桥接(bridge)网络的虚拟:
首先需要在宿主机上创建桥接网卡,宿主机内部的所有虚拟机是通过桥接网卡连接到宿主机的物理网卡与外部网络连通的。
创建br0桥接网卡:
centos7.X创建桥接网卡:
宿主机先创建br0桥接网卡 [root@kvm-node1 ~]# cd /etc/sysconfig/network-scripts [root@kvm-node1 ~]# vim ifcfg-br0 #新建br0接口配置文件 TYPE=Bridge BOOTPROTO=static NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=172.18.20.100 NETMASK=255.255.0.0 GATEWAY=172.18.0.1 DNS1=223.5.5.5 DNS2=223.6.6.6 [root@kvm-node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #修改eth0网卡配置 TYPE=Ethernet BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes BRIDGE=br0 [root@kvm-node1 ~]# systemctl restart network #重启网络服务
Ubuntu18.04系统创建桥接网卡:
#注意:Ubuntu系统网卡配置文件为yaml格式,需要严格注意格式缩进 root@ubuntu-kvm:~# vim /etc/netplan/01-netcfg.yaml # This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no dhcp6: no bridges: br0: dhcp4: no dhcp6: no addresses: [172.18.0.20/16] gateway4: 172.18.0.1 nameservers: addresses: [223.6.6.6] interfaces: - eth0 root@ubuntu-kvm:~# netplan apply #重启网络服务使配置生效
确认网卡配置生效:
通过virt-install命令创建bridge网络的虚拟机:
[root@kvm-node1 ~]#virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 2 --cdrom=/data/iso/CentOS-7-x86_64-Everything-1908.iso --disk path=/var/lib/libvirt/images/CentOS-7-x86_64.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
与创建nat网络虚拟机只是--network后的参数不同,安装虚拟机系统及VNC连接方式一样。
注意:创建多个虚拟机时,需要注意虚拟机磁盘文件不能重名,否则将导致原已经存在的虚拟机磁盘文件数据被覆盖。
通过virt-manager管理虚拟机:
上面是通过virt命令方式来安装,也可以通过libvirt服务中的图形管理工具virt-manager来创建安装虚拟机,方法如下:
通过xshell终端(需要开启X11转发)运行virt-manager命令,调出虚拟机控制终端即可进行操作系统安装。
[root@kvm-node1 ~]#virt-manager
通过virt-manager创建的虚拟机默认是使用spice server作为连接服务器,会导致虚拟机键盘无法操作,需要打开虚拟机详细配置修改Display项设置,如下:
查看虚拟机详细配置
登入虚拟机配置好IP地址后,即可通过ssh工具远程连接使用了。