1. 背景

上文 【云计算 | OpenStack】从零开始使用libvirt创建一个kvm虚机 中的虚机使用了基于Linux网桥的虚拟网卡,xml文件中关于interface的定义如下

#添加网络配置,基于网桥
   <interface type='bridge'>
    <source bridge='br0'/>
    <target dev='vnet1'/>
    <alias name='net1'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   </interface>

其网络架构如下图所示

kvm虚拟机控制不了屏幕 kvm虚拟机联网_云计算

对应到vmware虚机(kvm虚机的宿主机)里,如下图

kvm虚拟机控制不了屏幕 kvm虚拟机联网_kvm虚拟机控制不了屏幕_02

  • ens33:vmware虚机的网卡,类似物理机的物理网卡,用于连接外网。其ip地址是向无线路由器发起dhcp请求动态获取
  • vnet1:kvm虚机在Linux网桥上对应的端口
  • vnet2:kvm虚机在Linux网桥上对应的端口

现在需求是让kvm虚机能够访问外网,本文围绕这点展开试验

2. 实践

整体思路就是让物理网卡ens33也挂载到Linux网桥br0上,使kvm虚机能通过dhcp获取到无线路由器分配的ip地址,其网络架构图如下

kvm虚拟机控制不了屏幕 kvm虚拟机联网_kvm虚拟机控制不了屏幕_03

1、首先通过命令brctl addif br0 ens33给网桥添加物理网卡ens3(也可以在网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33中添加BRIDGE=br0
2、通过dhclient br0让网桥br0获取外部地址
3、通过ip a del 172.16.27.77/20 dev ens33删除网卡ens33的地址(这个地址如果不删除,可能存在一些网络问题。网上有说如果物理网卡加入了网桥,就相当于网桥上的一个端口,类似vnet1和vnet2,仅用来连接对端,所以可以不用配地址。至于原理尚不明晰,欢迎留言指出)

kvm虚拟机控制不了屏幕 kvm虚拟机联网_linux_04

4、获取kvm虚机的vnc端口,通过vncviewer :port进入kvm虚机

kvm虚拟机控制不了屏幕 kvm虚拟机联网_kvm虚拟机控制不了屏幕_05

5、通过dhclient ens3获取地址(此处网卡ens3已设置为开机自启并通过dhcp获取地址,所以如果重启虚机也可以直接获取地址)

kvm虚拟机控制不了屏幕 kvm虚拟机联网_linux_06

6、测试kvm虚机能否上外网

kvm虚拟机控制不了屏幕 kvm虚拟机联网_kvm虚拟机控制不了屏幕_07

3. 总结

  • kvm虚机采用基于Linux网桥的虚拟网卡时,可以将宿主机的物理网卡添加到Linux网桥,从而打通kvm虚机的外部网络