Ich habe ein seltsames Problem, das recht einfach erscheint, mir aber bisher nicht gelingen konnte. Ich versuche, eine Legacy-Anwendung zu unterstützen, die einen fest codierten Ethernet-Gerätenamen („eth0“) hat. Diese Festcodierung, so wurde mir gesagt, wird sich nicht ändern.
Jetzt versuchen wir, diese Software in ein viel moderneres Betriebssystem (Fedora 17) zu integrieren, das persistente Gerätenamen verwendet und daher keine „eth0“-Schnittstelle hat. Darüber hinaus erfordert diese Bemühung, dass ich die Loopback-Schnittstelle zur Kommunikation mit einem anderen Modul als Teil einer Virtualisierungsbemühung verwende (es passiert hier tatsächlich VIEL mehr, aber das zu beschreiben würde viel zu lange dauern).
Mir ist bewusst, dass es möglich ist, einen Alias der Form „lo:0“ zu erstellen. Die Software sucht jedoch explizit nach „eth0“ und meine bisherigen Untersuchungen und Tests haben ergeben, dass nur das Benennungsschema „iface:N“ unterstützt wird.
Also, kurz gesagt:
Gibt es eine Möglichkeit, eine virtuelle Schnittstelle mit dem Namen „eth0“ zu erstellen, die über lo kommuniziert?
Antwort1
Es gibt vielleicht einen einfacheren Weg. Wenn Sie jedoch Ihren eigenen Kernel kompilieren möchten, können Sie einen Treiber erstellen, der aufder vorhandene Loopback-Treiber, ändern Sie den Namen (Zeile 193 in dieser Version) und laden Sie das Modul. Sie erhalten eine zweite Loopback-Schnittstelle mit dem gewünschten Namen.
Edit: Genauer gesagt meine ich das Hinzufügenein andererLoopback-Treiber, der den vorhandenen nicht ersetzt. Nachdem Sie drivers/net/loopback.c nach drivers/net/loopback2.c kopiert haben, wenden Sie den folgenden Patch an (auf 3.8 ausgeführt):
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;
Mir ist klar, dass das bloße Laden des Moduls nicht ausreicht, da dadurch Code in net/core/dev.c geändert wird. Sie müssen außerdem den gepatchten Kernel installieren.