Создание псевдонима для интерфейса Loopback с произвольным именем

Создание псевдонима для интерфейса Loopback с произвольным именем

У меня странная проблема, которая кажется достаточно простой, но до сих пор ускользала от меня. Я пытаюсь поддерживать устаревшее приложение, в котором жестко закодировано имя устройства Ethernet ("eth0"). Мне сказали, что это жесткое кодирование не изменится.

Теперь мы пытаемся перенести это программное обеспечение в гораздо более современную ОС (Fedora 17), которая использует постоянное именование устройств и, как таковая, не имеет интерфейса "eth0". Кроме того, эта работа требует, чтобы я использовал интерфейс обратной связи для связи с другим модулем в рамках работы по виртуализации (на самом деле здесь происходит МНОГО больше, но это заняло бы слишком много времени, чтобы описать).

Я знаю, что можно создать псевдоним в форме «lo:0», однако программное обеспечение явно ищет «eth0», а мои исследования и тестирования на данный момент показали, что поддерживается только схема именования «iface:N».

Итак, вкратце:

Есть ли способ создать виртуальный интерфейс с именем «eth0», который будет взаимодействовать через lo?

решение1

Может быть, есть более простой способ. Но если компиляция собственного ядра — это вариант, вы можете создать драйвер на основесуществующий драйвер обратной связи, измените имя (строка 193 в этой версии) и загрузите модуль. У вас будет второй интерфейс обратной связи с именем, которое вам нужно.

Редактировать: Если говорить точнее, я имею в виду добавлениедругойДрайвер loopback, не заменяя существующий. После копирования 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. Вам также придется установить пропатченное ядро.

Связанный контент