任意の名前を使用してループバックインターフェイスのエイリアスを作成する

任意の名前を使用してループバックインターフェイスのエイリアスを作成する

簡単に見えますが、今まで私を悩ませてきた奇妙な問題があります。ハードコードされたイーサネットデバイス名(「eth0」)を持つ古いアプリケーションをサポートしようとしています。このハードコーディングは変更されないと聞きました。

現在、このソフトウェアは永続的なデバイス命名を使用しているため、「eth0」インターフェースを持たない最新のオペレーティングシステム(Fedora 17)にインポートしようとしています。また、このタスクでは、仮想化タスクの一部として他のモジュールと通信するためにループバックインターフェイスを使用する必要があります(実際にはここではより多くのタスクが進行中ですが、説明には時間がかかりすぎます)。

「lo:0」形式のエイリアスを作成することが可能であることはわかっていますが、ソフトウェアは明示的に「eth0」を探しており、これまでの研究とテストでは、「iface:N」という命名体系のみがサポートされていることがわかりました。

簡単に言うと:

lo経由で通信するために「eth0」という仮想インターフェイスを作成する方法はありますか?

答え1

より簡単な方法があるかもしれません。ただし、独自のカーネルをコンパイルするオプションがある場合は、以下に基づいてドライバを作成できます。既存のループバックドライバ、名前を変更し(このバージョンでは193行目)、モジュールをロードします。目的の名前の2番目のループバックインターフェイスが作成されます。

編集:より具体的には、追加することを意味します。その他ドライバをループバックし、既存のドライバを交換しません。 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のコードが修正されているので、モジュールをロードするだけでは十分ではないことに気づきました。パッチ付きカーネルもインストールします。

関連情報