Linux 上的虚拟接口

Linux 上的虚拟接口

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

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

$ cat /etc/modules-load.d/dummy.conf
# Load dummy.ko at boot

假的

$ 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

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

$ cat /etc/modprobe.d/dummy.conf 
install dummy /sbin/modprobe --ignore-install dummy; /sbin/ip link set name ethdummy1 dev dummy0

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

答案1

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

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

什么是模组探针设置的作用是确保当假的模块已加载(正如OP所说,它是在启动时加载的),这是隐式的虚拟0界面将立即重命名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

添加模块选项numdummies=2创建了两个假的界面虚拟0虚拟1,并且他们“立即”更名为他们的最终名字ethdummy1ethdummy2.现在你可以添加相应的配置文件ifcfg-ethdummy2

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

ip link add ethdummy2 type dummy

为什么我找到解决方法虚拟配置文件尴尬的?因为这不适用于在容器中运行的同一系统(例如 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 || :接口’节。

相关内容