我想使用 Linux 网络绑定运行一些测试。我正在使用 qemu 虚拟机,并且使用自定义构建的内核来运行它们,我将其设置为具有静态链接的绑定。我在文档中看到可以在加载模块时设置绑定参数(如 miimon)。但是静态链接时如何设置这些值呢?
答案1
有两个 API 可以处理绑定接口,此外到过时的命令(在 Linux 上)ifconfig
和ifenslave
,它们可能无法创建新的绑定接口(因此要求绑定模块的max_bonds
参数非零)。
我可以注意到“最近”版本ifenslave
实际上依赖于系统文件系统API 和一些关于rtnetlinkAPI 通过ip link
.
您可能应该配置绑定来创建零个接口,而不是默认的一两个接口:这是一项历史功能,随着这两个 API 的出现而变得过时。这些接口可以稍后动态创建或删除。当然,对于一个非常小的系统,保留它或设置它以创建所需的数量仍然是一种选择。将其添加到内核命令行选项(通常在/etc/default/grub
的GRUB_CMDLINE_LINUX=
条目中找到,但正确执行此操作可能取决于发行版)应该可以做到:
bonding.max_bonds=0
使用 iproute2 手动配置绑定(
ip link
):警告:链接的文档相当不完整/过时,并且没有显示大多数(如果不是全部)粘合功能都可以通过
ip link
.您可以使用正确的命令创建删除更改设置奴役等
ip link
。该命令应包含关键字type bond
每当必须指定特定的命令时,纽带他们之后的选项。命令语法提醒,显示具体纽带设置:
ip link add type bond help
示例(接口在被奴役之前必须关闭,但可以在同一单个命令中进行设置,以防不知道以前的状态):
ip link add dev mybond0 type bond mode active-backup miimon 100 ip link set dev eth0 down master mybond0 ip link set dev eth1 down master mybond0 ip link set dev mybond0 up ip link set dev eth0 up ip link set dev eth1 up
更改设置:
ip link set dev mybond0 type bond miimon 200
ifenslave
相等的:ip link set dev mybond0 type bond active_slave eth1
当存在任何从属设备时,某些设置无法更改。例如,重新定义键类型:
# ip link set dev mybond0 type bond mode balance-rr RTNETLINK answers: Directory not empty
可以通过以下方式释放受控设备:
ip link set dev eth0 nomaster
可以使用以下命令删除 bond 设备:
ip link delete dev mybond0
与某个相关的各种信息纽带设备(或到债券奴隶设备)可以通过附加选项看到
-details
。在某些时候,使用 JSON 输出对于脚本来说会更容易(例如,这个 Q/A:iproute2:如何显示网络设备的类型?)。ip -detail link show dev mybond0 ip -detail link show dev eth0 ip -detail link show dev eth1
-
我认为今天使用这个 API 没有多大意义,除非特定功能无法通过
ip link
.它可能是之前创建的ip路由2工具可以处理所有这一切。也许在受限/嵌入式系统上的工具无法再访问命令的情况下,从中读取内容仍然会有所帮助ip link
,但即使这似乎也不太可能。如链接文档中所述,您可以创建和删除绑定接口,
/sys/class/net/bonding_masters
只要存在绑定模块(此处为内置模块),就会通过该接口出现。以下是上面的等效命令,只需
echo ... > ...
从根 shell 中使用(或者必须使用 解决重定向问题sudo echo ... | tee ...
):echo +mybond0 > /sys/class/net/bonding_masters echo active-backup > /sys/class/net/mybond0/bonding/mode echo 100 > /sys/class/net/mybond0/bonding/miimon
我没有看到任何方法可以通过以下方式设置接口系统文件系统反正。为了确保安全:
ip link set dev eth0 down ip link set dev eth1 down echo +eth0 > /sys/class/net/mybond0/bonding/slaves echo +eth1 > /sys/class/net/mybond0/bonding/slaves
再说一遍,没有其他办法:
ip link set dev mybond0 up ip link set dev eth0 up ip link set dev eth1 up
然后像前面的例子一样继续:
echo 200 > /sys/class/net/mybond0/bonding/miimon echo eth1 > /sys/class/net/mybond0/bonding/active_slave # echo balance-rr > /sys/class/net/mybond0/bonding/mode bash: echo: write error: Directory not empty echo -eth0 > /sys/class/net/mybond0/bonding/slaves echo -mybond0 > /sys/class/net/bonding_masters
具体的粘合信息可从那里获得:
cat /sys/class/net/bonding_masters grep ^ /sys/class/net/mybond0/bonding/* grep ^ /sys/class/net/eth0/bonding_slave/* grep ^ /sys/class/net/eth1/bonding_slave/*