Linux 上的虚拟接口

Edv*_*nas 5 linux modprobe interface network-interface

我需要在 Linux 上创建第二个单独的虚拟接口。

我选择dummy。并执行以下步骤:

$ cat /etc/modules-load.d/dummy.conf
# Load dummy.ko at boot
Run Code Online (Sandbox Code Playgroud)

假的

$ cat /etc/sysconfig/network-scripts/ifcfg-ethdummy1
NAME=ethdummy1
DEVICE=ethdummy1
MACADDR=00:22:22:ff:ff:ff
IPADDR=10.10.10.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
Run Code Online (Sandbox Code Playgroud)

似乎一切正常。但在网上我看到人们也这样做:

$ cat /etc/modprobe.d/dummy.conf 
install dummy /sbin/modprobe --ignore-install dummy; /sbin/ip link set name ethdummy1 dev dummy0
Run Code Online (Sandbox Code Playgroud)

这条线有什么意义?谢谢。

A.B*_*A.B 0

编写此文件的人dummy.conf这样做是为了解决CentOS 7 中发现的网络脚本配置的限制:无法运行任意命令来帮助创建虚拟接口(就像在 Debian 中可能的那样)使用带有条目的接口文件pre-up)。如果有人提供了运行此类脚本的简单方法的线索(即:不必创建全新的ifup-dummy脚本),我将很乐意编辑我的答案。

虚拟模块有一个默认选项numdummies=1(该选项可以通过 找到modinfo -p dummy)。这意味着当第一次加载虚拟模块时,它还将自动创建(在初始网络命名空间上)一个虚拟接口。默认命名是dummy+第一个可用整数,因此dummy0

modprobe设置的作用是确保当加载虚拟模块时(正如OP所说,它是在启动时加载的),这个隐式dummy0接口将立即重命名为ethdummy1,并且--ignore-install是为了防止无限循环,因为它只会不断替换通过...加载虚拟模块来加载虚拟模块

这使得ifcfg-ethdummy1配置能够正常工作:找到预期的接口,就好像它是常用的以太网接口一样。

dummy.conf通过像这样编辑文件(顺便说一下,我将链接参数按自然顺序放置),可以继续这种方式(尽管非常尴尬):

install dummy /sbin/modprobe --ignore-install dummy numdummies=2; /sbin/ip link set dev dummy0 name ethdummy1; /sbin/ip link set dev dummy1 name ethdummy2
Run Code Online (Sandbox Code Playgroud)

添加 module 选项numdummies=2创建了两个虚拟接口dummy0dummy1,并且它们“立即”重命名为其最终名称ethdummy1ethdummy2。现在您可以添加相应的配置文件ifcfg-ethdummy2

如果您刚刚添加了新配置并且不想重新启动或丢失接口,则可以手动添加接口,以便ifup命令在以下情况后仍然会成功:

ip link add ethdummy2 type dummy
Run Code Online (Sandbox Code Playgroud)

为什么我觉得dummy.conf中的解决方法很尴尬?因为这不适用于在容器中运行的同一系统(例如 CentOS 7):接口始终添加到初始网络命名空间,因此容器永远不会看到它们(并且通常会阻止容器显式加载模块,即使容器仍然可以间接触发加载,例如通过使用ip link add type dummy)。

就我个人而言,我宁愿使用dummy.conf这个::options numdummies=0默认情况下不创建接口,并根据需要处理它。至少无论使用还是不使用容器,结果都是一致的。

我也没有发现 NetworkManager 支持本机虚拟接口,但至少它是可编写脚本的。您可以查看此链接中提供的解决方案:RHEL 上的虚拟接口。他们为 NetworkManager 添加脚本,或者使用 systemd 的服务实例化来创建一个接口,方法是使用所选名称启动该接口。

如果您以后使用类似 Debian 的发行版,那么可以通过pre-up ip link add ethdummy2 type dummy 2>/dev/null || :接口' 节中使用来轻松解决这个问题。