在网上找了些关于kvm部署资料,发现大部分都是单台主机安装kvm,然后在本机直接创建管理虚拟机。其实需要部署虚拟化环境的往往是服务器,并且都没有安装桌面环境,KVM安装后通过客户端进行远程管理,就像vm的exsi一样,所以决定整理一份c/s模式的安装部署资料。
- 服务器端安装kvm
- 系统信息
操作系统:CentOS Linux release 7.9.2009
CPU: Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz
内存:32G
硬盘:4T
- 安装KIM
yum install qemu-kvm libvirt libvirt-devel libvirt-client virt-install virt-viewer bridge-utils -y
- 配置libvirt服务
# vi /etc/libvirt/libvirtd.conf
listen_tls=0
listen_tcp=1
auth_tcp="none"
LIBVIRTD_ARGS="--listen"
修改配置文件以上内容,如果没有手动添加。LIBVIRTD_ARGS="--listen"这项很重要,如果没有配置服务启动后并不会监听端口。
- 配置服务开机自启
# systemctl enable --now libvirtd
- 为虚拟机创建桥接网络
nmcli con add type bridge ifname br0 con-name br0 autoconnect yes
##创建桥接网络
nmcli con mod br0 ipv4.addresses 192.168.10.17/24 ipv4.gateway 192.168.10.254
##给网桥设置固定ip
nmcli con modify eno1 connection.autoconnect no
##关闭默认网卡自动连接
nmcli con add type bridge-slave ifname eno1 master br0
##将物理网卡接入到桥接网络中
systemctl restart NetworkManager
##重启网络服务
nmcli dev reapply eno1
##重新加载eno1配置
firewall-cmd --add-masquerade --permanent
##开启防火墙ip转发功能,这个非常重要,如果没有开启ip转发,虚拟机与主机可以ping通,但主机使用ssh连接或者访问虚拟机指定端口都会显示"No route to host"的错误。
firewall-cmd --reload
##重载防火墙配置
##如果防火墙服务没有开启,必需在系统配置中开启ip转发
vi /etc/sysctl.conf
##添加以下内容
net.ipv4.ip_forward = 1
##立即生效
sysctl -p
以上将关闭网卡eno1的连接,br0被重新设定新ip,如果服务器只有这一张网卡,通过客户端的ssh连接到服务器将会被断开,需要重新连接。
- 客户端安装kvm管理软件
- 系统信息
PRETTY_NAME="Ubuntu 22.04.4 LTS"
- 安装kvm客户端管理软件
apt install virt-manager
- 使用virt-manager连接服务器的kvm
如果kvm连接使用ssh协议并通过密码登陆,需要首先安装ssh-askpass
apt install ssh-askpass
打开virt-manager--添加连接
建议使用ssh-key进行验证,添加连接时选择自定义连接,输入自定义url,如
qemu+ssh://root@192.168.10.17/system?keyfile=/home/drs/.ssh/kpy_rsa
- 创建虚拟机
将系统镜像文件上传到服务器/var/lib/libvirt/images目录下,双击virt-manager中创建的连接,新建虚拟机按向导配置完成虚拟机创建
网络选择之前创建的桥接设备‘br0’,最好勾选“在安装前自定义配置”,这样可以在启动虚拟机前先对虚拟机配置进行调整,因为默认配置不会配置光驱引导,不会配置显示协议,造成启动虚拟机后双击无法进入虚拟机控制台,总是运行ssh-askpass提示输入密码,密码输入正确仍然无法进入控制台。
修改虚拟机配置
引导选项--勾选“IDE-CDROM1”
IDE-CDROM1--选择服务器上传的iso文件
显示协议配置如下
“地址”这一项一定要“所有接口”否则服务端不会有显示协议监听,双击虚拟机提示输入密码且无法打开控制台。如果服务器开启了防火墙,请开放5900/tcp端口。
- 遇到的路由知识补充
当服务器有2张网卡,1张用于本地连接1张用于kvm虚拟网桥,且希望虚拟网桥与本地连接都使用同一网段,会生成2条相同路由,造成路由冲突,客户端ping服务器的2个ip都没有延时,但使用ssh连接时非常慢。
使用ip route查看产生这一现像的服务器路由表如下:
192.168.10.0/24 dev eno1 proto kernel scope link src 192.168.10.7 metric 102
192.168.10.0/24 dev br0 proto kernel scope link src 192.168.10.17 metric 425
原因分析:
路由中metric的值会影响节点之间路径的成本、质量或优先级,值越大路由计算成本延时越高,2条同样路由会造成数据包选择通讯接口时产生不确定性,影响网络性能,造成较大网络延时。
解决办法:
调整br0的metric值为100
nmcli con mod br0 ipv4.route-metric 100
nmcli dev reapply br0
调整后重新使用ssh连接马上就能连上了。
- 疑问:
metric影响ssh连接,可对http请求似乎没有影响,有大神路过欢迎指点。
- 针对服务器有多张网卡的情况,最好将多张网卡进行bond,然后再加入到桥接网络,再提供给kvm使用,这可避免路由冲突,并提网络可靠性。
nmcli con add type bond con-name bond0 ifname bond0 mode active-backup miimon 100 primary eno1 connection.master bridge0 connection.slave-type bridge
nmcli con add type bond-slave con-name bond0-eno1 ifname eno1 master bond0
nmcli con add type bond-slave con-name bond0-eno2 ifname eno2 master bond0
我这使用的是主备模式bond,可根据实际需要修改模式。将bond接入到bridge后,bond手动配置的ip地址等信息被自动复盖,需要固定ip可以在bridge中进行配置。