1.检查虚拟化、KVM和selinux
(1)查看是否支持虚拟化
egrep -o '(vmx|svm)' /proc/cpuinfo
有vmx或svm输出则支持虚拟化。svm 对应 AMD,vmx 对应 Intel。
(2)查看是否加载KVM
lsmod | grep kvm
如果没有与图上类似的输出,执行命令modprobe kvm
因本文部分内容是基于virt-manager实现的,安装QEMU/KVM以及virt-manager可参考文章
(3)关闭selinux
vim /etc/sysconfig/selinux
将SELINUX的值改为disabled
2.安装 bridge-utils 软件包
bridge-utils 提供 brctl 工具来配置网桥
yum install bridge-utils
3.加载 tun 和 bridge 模块
[root@lianxiji ~]# lsmod | grep tun
tun 40260 1
[root@lianxiji ~]# lsmod | grep bridge
bridge 155432 1 ebtable_broute
stp 12976 1 bridge
llc 14552 2 stp,bridge
4.创建 brdige
将物理机工作的网口绑定到 brdige 上,将网口 IP 清除,让 bridge 获取 IP
[root@lianxiji ~]# brctl addbr br0
[root@lianxiji ~]# brctl addif br0 ens3
[root@lianxiji ~]# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.525400d4a53d no ens3
[root@lianxiji ~]# brctl stp br0 on
[root@lianxiji ~]# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.525400d4a53d yes ens3
[root@lianxiji ~]# ifconfig ens3
ens3: flagS=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.32 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::7652:7a66:c319:cc4c prefixlen 64 scopeid 0x20<link>
inet6 2408:8207:60d4:c4f1:21c0:elf2:182:cfdb prefixlen 64 scopeid 0x0<global>
inet6 2408:8207:60d4:c4f1::99e prefixlen 128 scopeid 0x0<global>
ether 52:54:00:d4:a5:3d txqueuelen 1000 (Ethernet)
Rx packets 40959 bytes 13269505(12.6 MiB)
RX errors 0 dropped 2298 overruns 0 frame 0
TX packets 3618 bytes 369812(361.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@lianxiji ~]# ifconfig br0
br0: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 52:54:00:d4:a5:3d txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@lianxiji ~]# ifconfig ens3 0 up
[root@lianxiji ~]# ifconfig br0 up
[root@lianxiji ~]# dhclient br0
5.修改ifcfg-ens3和ifcfg-br0
ifcfg-br0文件需创建,均修改完成后需要重启网络sudo systemctl restart network
# ifcfg-ens3,需在原文件最后添加BRIDGE="br0"
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens3"
UUID="49e59602-31be-439d-846e-3340cd79bf0d"
DEVICE="ens3"
ONBOOT="yes"
BRIDGE="br0"
# ifcfg-br0,新创建的文件
DEVICE=br0
ONBOOT=yes
PREFIX=24
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.10.32
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
6.查看配置情况
[root@lianxiji ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.32 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::5054:ff:fed4:a53d prefixlen 64 scopeid 0x20<link>
inet6 2408:8207:60d4:c4f1:5054:ff:fed4:a53d prefixlen 64 scopeid 0x0<global>
ether 52:54:00:d4:a5:3d txqueuelen 1000 (Ethernet)
RX packets 69 bytes 15042 (14.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 4629 (4.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@lianxiji ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::7652:7a66:c319:cc4c prefixlen 64 scopeid 0x20<link>
inet6 2408:8207:60d4:c4f1:21c0:e1f2:182:cfdb prefixlen 64 scopeid 0x0<global>
inet6 2408:8207:60d4:c4f1::99e prefixlen 128 scopeid 0x0<global>
ether 52:54:00:d4:a5:3d txqueuelen 1000 (Ethernet)
RX packets 42090 bytes 13547440 (12.9 MiB)
RX errors 0 dropped 2298 overruns 0 frame 0
TX packets 4144 bytes 397173 (387.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
7.准备 qemu-ifup/qemu-ifdown 脚本
在虚拟机启动网络前执行的脚本由 script 参数配置(默认 /etc/qemu-ifup)。
该脚本是将 QEMU 自动创建的 TAP 设备绑定到网桥上。
虚拟机关闭时,QEMU 会自动解除 TAP 设备的绑定,删除 TAP 设备。所以 qemu-ifdown 是不用配置的。
编辑/etc/qemu-ifup的内容如下
#!/bin/bash
switch=br0
ifconfig $1 up
brctl addif $switch $1
8.配置后启动虚拟机
(1)创建虚拟机
使用virt-manager创建新的虚拟机,然后先不启动。
(2)配置虚拟机网络为桥接模式
在宿主机中进入qemu目录,修改xml文件
[root@lianxiji ~]# cd /etc/libvirt/qemu
[root@lianxiji qemu]# vim kvmtest.xml
主要将interface type改为bridge桥接模式,以及将source network改为前面设定的网卡名称br0
注意在virt-manager中更改宿主机和虚拟机的虚拟网络接口。
(3)启动虚拟机
通过virt-manager启动虚拟机后,查看虚拟机网络
[root@kvmtest network-scripts]# cd /etc/sysconfig/network-scripts/
[root@kvmtest network-scripts]# cat ifcfg-ens3
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens3"
UUID="a7ff358f-c738-4597-b6b6-b8b7611ff52a"
DEVICE="ens3"
ONBOOT="yes"
9.查看虚拟机状态
[root@kvmtest ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:ba:5f:88 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.29/24 brd 192.168.10.255 scope global noprefixroute dynamic eth0
valid_lft 6807sec preferred_lft 6807sec
inet6 2408:8207:60d4:c4f1::1d0/128 scope global noprefixroute dynamic
valid_lft 6808sec preferred_lft 6808sec
inet6 2408:8207:60d4:c4f1:f529:d0d0:caef:d317/64 scope global noprefixroute dynamic
valid_lft 231442sec preferred_lft 145042sec
inet6 fe80::9a:aa40:48e8:e2fb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@kvmtest ~]# ip route
default via 192.168.10.1 dev eth0 proto dhcp metric 100
192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.29 metric 100
检查宿主机 bridge 状态
[root@lianxiji qemu]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.525400d4a53d yes ens3
vnet0
virbr0 8000.52540066aa8d yes virbr0-nic
10.ping测试
宿主机ip地址为:192.168.10.32
虚拟机ip地址为:192.168.10.29
其他虚拟机的ip地址为:192.168.10.28