Tenho um problema estranho que parece bastante simples, mas que me escapou até agora. Estou tentando oferecer suporte a um aplicativo legado que possui um nome de dispositivo Ethernet codificado ("eth0"). Disseram-me que essa codificação não mudará.
Agora, estamos tentando trazer este software em um sistema operacional muito mais moderno (Fedora 17) que usa nomeação persistente de dispositivos e, como tal, não possui interface "eth0". Além disso, esse esforço exige que eu use a interface de loopback para comunicação com outro módulo como parte de um esforço de virtualização (na verdade, há MUITO mais coisas acontecendo aqui, mas isso levaria muito tempo para ser descrito).
Estou ciente de que é possível criar um alias no formato "lo:0", porém o software está procurando explicitamente por "eth0" e minha pesquisa e testes até agora indicaram que o esquema de nomenclatura "iface:N" é o apenas um suportado.
Então, resumindo:
Existe alguma maneira de criar uma interface virtual chamada "eth0" que se comunique por lo?
Responder1
Pode haver uma maneira mais simples. Mas se compilar seu próprio kernel for uma opção, você poderá criar um driver baseado emo driver de loopback existente, altere o nome (linha 193 nessa versão) e carregue o módulo. Você teria uma segunda interface de loopback com o nome desejado.
Editar: para ser mais específico, quero dizer adicionaroutrodriver de loopback, não substituindo o existente. Depois de copiar drivers/net/loopback.c para drivers/net/loopback2.c, aplique o seguinte patch (feito em cima do 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;
Estou percebendo que simplesmente carregar o módulo não será suficiente, pois isso modifica o código em net/core/dev.c. Você também terá que instalar o kernel corrigido.