KVM(基于内核的虚拟机)是一款为类 Linux 系统提供的开源的全虚拟化解决方案,KVM 使用虚拟化扩展(如 Intel VT 或 AMD-V)提供虚拟化功能。无论何时我们在任何 Linux 机器上安装 KVM,都会通过加载诸如 kvm-intel.ko(基于 Intel 的机器)和 kvm-amd.ko(基于 amd 的机器)的内核模块,使其成为管理程序hyervisor(LCTT 译注:一种监控和管理虚拟机运行的核心软件层)。
KVM 允许我们安装和运行多个虚拟机(Windows 和 Linux)。我们可以通过 virt-manager 的图形用户界面或使用 virt-install 和 virsh 命令在命令行界面来创建和管理基于 KVM 的虚拟机。
首先检查CPU是否支持虚拟化
egrep -c '(svm|vmx)' /proc/cpuinfo
上面命令执行结果如果返回0,表示CPU不支持虚拟化技术。当然主板BIOS中的虚拟化技术也可能不是默认开启的,如果没有开启需要手动开启一下
KVM安装在ubuntu18.10上安装比较简单
sudo apt update sudo apt install cpu-checker sudo apt install qemu qemu-kvm bridge-utils virt-manager
qemu-kvm -为KVM管理程序提供硬件仿真的软件。
bridge-utils -一组用于配置以太网桥的命令行工具。
virt-manager -易于使用的GUI界面和支持命令行工具,用于通过libvirt管理虚拟机
安装完成以后可以使用以下命令检查您的系统是否可以运行硬件加速的KVM虚拟机
kvm-ok
如果未在BIOS中禁用处理器虚拟化功能,则输出将如下所示
INFO: /dev/kvm exists KVM acceleration can be used
安装软件包后,libvirt守护程序将自动启动。您可以通过键入以下内容进行验证:
sudo systemctl is-active libvirtd
输出:
active
将libvirtd添加自启动
sudo systemctl start libvirtd.service sudo systemctl enable libvirtd.service
在安装过程中会创建一个名为“ virbr0”的网桥。该设备使用NAT将来宾计算机连接到外界
您可以使用该brctl
工具列出当前网桥及其连接的接口
为了能够创建和管理虚拟机,您需要将用户添加到“ libvirt”和“ kvm”组中
sudo usermod -aG libvirt $USER sudo usermod -aG kvm $USER
KVM安装完成后,首先需要进行网络设定,KVM支持四种网络模式:
桥接模式
NAT模式
用户网络模式
直接分配设备模式
主要讲一下前两种
桥接(Bridge)模式
在桥接模式下,宿主机和虚拟机共享同一个物理网络设备,虚拟机中的网卡和物理机中的网卡是平行关系,所以虚拟机可以直接接入外部网络,虚拟机和宿主机有平级的IP
原本宿主机是通过网卡eth0连接外部网络的,网桥模式会新创建一个网桥br0,接管eth0来连接外部网络,然后将宿主机和虚拟机的网卡eth0都绑定到网桥上。
使用桥接模式需要进行以下操作:
编辑/etc/network/interfaces,增加如下内容
auto br0 iface br0 inet dhcp # 网桥使用DHCP模式,从DHCP服务器获取IP bridge_ports enp3s0 # 网卡名称,网桥创建前连接外部的网卡,可通过ifconfig命令查看,有IP地址的就是 bridge_stp on # 避免数据链路出现死循环 bridge_fd 0 # 将转发延迟设置为
接下来需要重启networking服务(如果是通过SSH连接到宿主机上的,这一步会导致网络中断,如果出现问题可能导致连不上宿主机,最好在宿主机上直接操作)
systemctl restart networking.service
使用ifconfig命令查看IP是否从enp3s0(网桥创建前的网卡)变到了br0上,如果没有变化则需要重启。如果宿主机ip已经成功变到网桥上,并且宿主机能正常上网而虚拟机获取不到ip,可能是ufw没有允许ip转发导致的,编辑/etc/default/ufw允许ip转发。
DEFAULT_FORWARD_POLICY="ACCEPT"
重启ufw服务让设置生效
systemctl restart ufw.service
NAT(Network Address Translation)模式
NAT模式是KVM默认的网络模式,KVM会创建一个名为virbr0的虚拟网桥,但是宿主机和虚拟机对于网桥来说不是平等的了,网桥会把虚拟机藏在背后,虚拟机会被分配一个内网IP,而从外网访问不到虚拟机,我们平时主要使用桥接模式
安装Linux虚拟机
因为在ubuntu18.10上安装的可以直接使用Virtual Machine Manager进行管理,做完以上操作可能直接打开Virtual Machine Manager会报错,建议重启下系统
最后附上KVM虚拟机操作命令
virsh --help #查看命令帮忙 virsh list #显示正在运行的虚拟机 virsh list --all #显示所有的虚拟机 virsh start vm-node1 #启动vm-node1虚拟机 virsh shutdown vm-node1 #关闭vm-node1虚拟机 virsh destroy vm-node1 #虚拟机vm-node1强制断电 virsh suspend vm-node1 #挂起vm-node1虚拟机 virsh resume vm-node1 #恢复挂起的虚拟机 virsh define vm-node1.xml #根据定义的xml文件创建虚拟机 virsh undefine vm-node1 #删除虚拟机,慎用 virsh dominfo vm-node1 #查看虚拟机的配置信息 virsh domiflist #查看网卡配置信息 virsh domblklist vm-node1 #查看该虚拟机的磁盘位置 virsh edit vm-node1 #修改vm-node1的xml配置文件,亦可直接关闭虚拟机修改/etc/libvirt/qemu/vm-node1.xml文件 virsh dumpxml vm-node1 #查看KVM虚拟机当前配置 virsh dumpxml vm-node1 > vm-node1.bak.xml #备份vm-node1虚拟机的xml文件,原文件默认路径/etc/libvirt/qemu/vm-node1.xml virsh autostart vm-node1 #KVM物理机开机自启动虚拟机,配置后会在此目录生成配置文件/etc/libvirt/qemu/autostart/vm-node1.xml virsh autostart --disable vm-node1 #取消开机自启动 virt-clone -o vm-node1 -n new-wm-node -f /data/new-wm-node.raw #-o被克隆的虚拟机名字 -n克隆的新虚拟机名字 -f指定新虚拟机磁盘存储路径