Linux
使用任意名稱創建到 Loopback 介面的別名
我有一個奇怪的問題,看起來很簡單,但到目前為止我都躲開了。我正在嘗試支持具有硬編碼乙太網設備名稱(“eth0”)的舊版應用程序。有人告訴我,這種硬編碼不會改變。
現在,我們正試圖將該軟體引入一個更現代的作業系統(Fedora 17)中,該作業系統使用持久設備命名,因此沒有“eth0”介面。此外,這項工作要求我使用環回介面與另一個模組進行通信,作為虛擬化工作的一部分(實際上這裡還有很多事情要做,但這需要太長時間來描述)。
我知道可以創建形式為“lo:0”的別名,但是該軟體正在明確尋找“eth0”,到目前為止我的研究和測試表明“iface:N”命名方案是只支持一個。
所以,簡而言之:
有沒有辦法創建一個名為“eth0”的虛擬介面,通過 lo 進行通信?
可能有更簡單的方法。但是,如果可以選擇編譯自己的核心,則可以基於現有的 loopback driver創建一個驅動程序,更改名稱(該版本中的第 193 行),然後載入模組。您將擁有第二個具有所需名稱的環回介面。
編輯:更具體地說,我的意思是添加另一個環回驅動程序,而不是替換現有的驅動程序。將驅動程序/net/loopback.c 複製到驅動程序/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 中的程式碼。您還將安裝已修補的核心。