간단해 보이지만 지금까지 나를 괴롭혀온 이상한 문제가 있습니다. 하드코드된 이더넷 장치 이름("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의 코드가 수정되므로 모듈을 로드하는 것만으로는 충분하지 않다는 것을 깨달았습니다. 패치된 커널도 설치합니다.