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

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

一見単純な問題ですが、これまで解決できなかった奇妙な問題があります。私は、ハードコードされたイーサネット デバイス名 ("eth0") を持つレガシー アプリケーションをサポートしようとしています。このハードコードは変更されないと言われています。

現在、私たちはこのソフトウェアを、永続的なデバイス命名を使用する、したがって「eth0」インターフェイスのない、はるかに新しい OS (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 のコードが変更されるため、十分ではないことがわかりました。パッチを適用したカーネルもインストールする必要があります。

関連情報