很久以前,搭建好openstack的时候,惊奇地发现,
一个虚拟机可以绑定很多个interface,或者说port。

图片加载失败

奇怪的事情是,如果在创建虚拟机时,绑定多个接口,初始化出来的虚拟机,将会无法连接。
也就是说,多个接口并没有成功初始化。

图片加载失败

绑定多个interface,在虚拟机看来就是插入了多张网卡。
观察机器的启动日志,发现初始化时只会启动一张网卡,也就是顺序最靠前的网卡,
但是哪张最靠前,是随机的。所以,通常是因为两张卡中只有一张是连接到外部网络的,
如果第一张初始化的就是内部网络的,就没法连接到机器上了。

这一点应该可以通过修改镜像里的初始化操作来让他多个卡都初始化,
这里先不谈如何全自动,讨论一下如何手动操作。

首先,按正常的操作,选取一个网络加入,创建虚拟机。
这时能够正常ssh到机器上。

以ubuntu为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# Source interfaces
# Please check /etc/network/interfaces.d before changing this file
# as interfaces may have been defined in /etc/network/interfaces.d
# See LP: #1262951
source /etc/network/interfaces.d/*.cfg

interfaces.d里只有一个文件

1
2
3
4
5
6
7
8
9
10
11
# interfaces.d/50-cloud-init.cfg
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
auto lo
iface lo inet loopback

auto ens3
iface ens3 inet dhcp

这里定义了网卡的配置,通常来说,
一个接口要生效,需要配置自身的IP地址,DNS Server,接入的子网掩码。
像这个文件里只写了一行,dhcp,因为dhcp协议会通过广播去请求这些数据,
dhcp server会告诉我们应该用什么ip、dns。

接下来,给机器绑定更多的接口。

图片加载失败

然后在连接到机器上,用ip addr命令查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

sudo ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:33:0f:58 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.54/16 brd 10.0.255.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe33:f58/64 scope link
valid_lft forever preferred_lft forever
4: ens7: <BROADCAST,MULTICAST> mtu 1450 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether fa:16:3e:ca:fb:f5 brd ff:ff:ff:ff:ff:ff

可以看到,多了一个ens7。
使用ifup ens7

1
2
3
sudo ifup ens7

Unknown interface ens7

现在还无法启动这个interface,因为还没有配置。
转到/etc/network/interfaces,添加ens7的配置。

1
2
3
4
5
6
7
8
9
# /etc/network/interfaces.d/50-cloud-init.cfg
auto lo
iface lo inet loopback

auto ens3
iface ens3 inet dhcp

auto ens7
iface ens7 inet dhcp

然后,sudo ifup ens7

1
2
3
4
5
6
7
8
9
10
11
12
13
Internet Systems Consortium DHCP Client 4.3.3
Copyright 2004-2015 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/ens7/fa:16:3e:ca:fb:f5
Sending on LPF/ens7/fa:16:3e:ca:fb:f5
Sending on Socket/fallback
DHCPDISCOVER on ens7 to 255.255.255.255 port 67 interval 3 (xid=0x8924d41)
DHCPREQUEST of 10.1.0.8 on ens7 to 255.255.255.255 port 67 (xid=0x414d9208)
DHCPOFFER of 10.1.0.8 from 10.1.0.2
DHCPACK of 10.1.0.8 from 10.1.0.2
bound to 10.1.0.8 -- renewal in 34076 seconds.

配置完毕,现在就拥有了两个网卡。

如果和一个网络建立多个interfaces,就相当于有多根网线插入到一个交换机上。
然后将其中一个网卡交给dpdk管理,监听另一个网卡,就可以实现一个机器测试dpdk功能了。

需要注意的是,关闭掉interface的security功能,避免dpdk编程时,一些包被openstack丢弃。

图片加载失败

图片加载失败