임의의 이름을 사용하여 루프백 인터페이스의 별칭 만들기

임의의 이름을 사용하여 루프백 인터페이스의 별칭 만들기

간단해 보이지만 지금까지 나를 괴롭혀온 이상한 문제가 있습니다. 하드코드된 이더넷 장치 이름("eth0")이 있는 이전 응용 프로그램을 지원하려고 합니다. 이 하드코딩은 변경되지 않을 것이라고 들었습니다.

우리는 이제 이 소프트웨어를 지속적인 장치 이름 지정을 사용하므로 "eth0" 인터페이스가 없는 최신 운영 체제(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의 코드가 수정되므로 모듈을 로드하는 것만으로는 충분하지 않다는 것을 깨달았습니다. 패치된 커널도 설치합니다.

관련 정보