충분히 단순해 보이지만 지금까지 나를 회피한 이상한 문제가 있습니다. 하드 코딩된 이더넷 장치 이름("eth0")이 있는 레거시 응용 프로그램을 지원하려고 합니다. 이 하드코딩은 변하지 않을 것이라고 들었습니다.
이제 우리는 영구 장치 이름 지정을 사용하고 따라서 "eth0" 인터페이스가 없는 훨씬 더 현대적인 OS(Fedora 17)에 이 소프트웨어를 도입하려고 시도하고 있습니다. 또한 이러한 노력을 위해서는 가상화 노력의 일환으로 다른 모듈과의 통신을 위해 루프백 인터페이스를 사용해야 합니다(실제로 여기서는 더 많은 작업이 진행되고 있지만 설명하기에는 너무 오래 걸립니다).
나는 "lo:0" 형식의 별칭을 만드는 것이 가능하다는 것을 알고 있습니다. 그러나 소프트웨어는 명시적으로 "eth0"을 찾고 있으며 지금까지의 연구와 테스트에 따르면 "iface:N" 명명 체계가 하나만 지원됩니다.
간단히 말해서:
lo를 통해 통신하는 "eth0"이라는 가상 인터페이스를 만드는 방법이 있습니까?
답변1
더 간단한 방법이 있을 수 있습니다. 그러나 자체 커널을 컴파일하는 것이 옵션인 경우 다음을 기반으로 드라이버를 만들 수 있습니다.기존 루프백 드라이버, 이름을 변경하고(해당 버전에서는 193행) 모듈을 로드합니다. 원하는 이름의 두 번째 루프백 인터페이스가 있습니다.
편집 : 더 구체적으로 말하면 추가하는 것을 의미합니다.또 다른루프백 드라이버는 기존 드라이버를 교체하지 않습니다. 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의 코드가 수정되기 때문입니다. 패치된 커널도 설치해야 합니다.