我有一个奇怪的问题,看起来很简单,但到目前为止一直困扰着我。我正在尝试支持具有硬编码以太网设备名称(“eth0”)的旧应用程序。我被告知,这种硬编码不会改变。
现在,我们正尝试将该软件引入更现代的操作系统(Fedora 17)中,该操作系统使用持久设备命名,因此没有“eth0”接口。此外,这项工作要求我使用环回接口与另一个模块进行通信,作为虚拟化工作的一部分(实际上这里还有很多事情要做,但这需要很长时间才能描述)。
我知道可以创建“lo:0”形式的别名,但是该软件明确寻找“eth0”,并且迄今为止我的研究和测试表明“iface:N”命名方案是仅支持一项。
所以,简而言之:
有没有办法创建一个名为“eth0”的虚拟接口,通过 lo 进行通信?
答案1
可能有更简单的方法。但是,如果可以选择编译自己的内核,则可以基于以下内容创建驱动程序现有的环回驱动程序,更改名称(该版本中的第 193 行),然后加载模块。您将拥有第二个环回接口,其名称为您想要的。
编辑:更具体地说,我的意思是添加其他环回驱动程序,不会替换现有的驱动程序。将 drivers/net/loopback.c 复制到 drivers/net/loopback2.c 后,应用以下补丁(在 3.8 之上完成):
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 335db78..cba692f 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_MACVLAN) += macvlan.o
obj-$(CONFIG_MACVTAP) += macvtap.o
obj-$(CONFIG_MII) += mii.o
obj-$(CONFIG_MDIO) += mdio.o
-obj-$(CONFIG_NET) += Space.o loopback.o
+obj-$(CONFIG_NET) += Space.o loopback.o loopback2.o
obj-$(CONFIG_NETCONSOLE) += netconsole.o
obj-$(CONFIG_PHYLIB) += phy/
obj-$(CONFIG_RIONET) += rionet.o
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 9ef07d0..ed9d82d 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2718,6 +2718,7 @@ static inline bool netif_supports_nofcs(struct net_device *dev)
}
extern struct pernet_operations __net_initdata loopback_net_ops;
+extern struct pernet_operations __net_initdata loopback2_net_ops;
/* Logging, debugging and troubleshooting/diagnostic helpers. */
diff --git a/net/core/dev.c b/net/core/dev.c
index f64e439..7c1cffb 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6834,6 +6834,9 @@ static int __init net_dev_init(void)
if (register_pernet_device(&loopback_net_ops))
goto out;
+ if (register_pernet_device(&loopback2_net_ops))
+ goto out;
+
if (register_pernet_device(&default_device_ops))
goto out;
我意识到仅仅加载模块是不够的,因为这会修改 net/core/dev.c 中的代码。您还将安装修补过的内核。