임의의 이름을 사용하여 루프백 인터페이스에 대한 별칭 생성

임의의 이름을 사용하여 루프백 인터페이스에 대한 별칭 생성

충분히 단순해 보이지만 지금까지 나를 회피한 이상한 문제가 있습니다. 하드 코딩된 이더넷 장치 이름("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의 코드가 수정되기 때문입니다. 패치된 커널도 설치해야 합니다.

관련 정보