Вопрос или проблема
Мне нужно создать второй отдельный виртуальный интерфейс в Linux.
Я выбираю dummy
. И делаю следующие шаги:
$ cat /etc/modules-load.d/dummy.conf
# Загружаем dummy.ko при загрузке
dummy
$ cat /etc/sysconfig/network-scripts/ifcfg-ethdummy1
NAME=ethdummy1
DEVICE=ethdummy1
MACADDR=00:22:22:ff:ff:ff
IPADDR=10.10.10.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
Кажется, все работает. Но в интернете я вижу, что люди также делают эти строки:
$ cat /etc/modprobe.d/dummy.conf
install dummy /sbin/modprobe --ignore-install dummy; /sbin/ip link set name ethdummy1 dev dummy0
В чем суть этой строки? Спасибо.
Люди, которые написали этот файл dummy.conf
, сделали это для обхода ограничения конфигурации network-scripts, найденной, например, в CentOS 7: нет способа запустить произвольную команду, чтобы помочь создать виртуальный интерфейс (как это возможно в основном используемом в Debian файле interfaces с записью pre-up
). Если кто-то подскажет простой способ запустить такой скрипт (т.е. не создавая полный новый ifup-dummy скрипт), я буду рад отредактировать свой ответ.
Модуль dummy имеет опцию по умолчанию numdummies=1
(опцию можно найти с помощью modinfo -p dummy
). Это значит, что когда модуль dummy загружается в первый раз, он также автоматически создаст (в начальном сетевом пространстве имен) dummy интерфейс. Имя по умолчанию – это dummy
+ первое доступное целое число, поэтому dummy0.
Настройка modprobe гарантирует, что когда модуль dummy загружен (как сказал автор вопроса, он загружается при загрузке), этот подразумеваемый интерфейс dummy0 будет немедленно переименован в ethdummy1, и --ignore-install
предназначен для предотвращения бесконечного цикла, потому что он просто будет продолжать заменять загрузку модуля dummy загрузкой модуля dummy.
Это позволяет конфигурации ifcfg-ethdummy1 работать правильно: ожидаемый интерфейс находится так, как будто это обычный Ethernet интерфейс.
Можно продолжать таким образом (несмотря на крайне неуклюже), редактируя файл dummy.conf
следующим образом (я поставил параметры ссылки в естественном порядке, кстати):
install dummy /sbin/modprobe --ignore-install dummy numdummies=2; /sbin/ip link set dev dummy0 name ethdummy1; /sbin/ip link set dev dummy1 name ethdummy2
Добавление опции модуля numdummies=2
создало два интерфейса dummy dummy0 и dummy1, и они были “немедленно” переименованы в их окончательные имена ethdummy1 и ethdummy2. Теперь вы можете добавить соответствующий конфигурационный файл ifcfg-ethdummy2.
Если вы только что добавили новую конфигурацию и не хотите перезагружать или терять интерфейсы, вы можете добавить интерфейс вручную, чтобы команда ifup все еще была успешной после этого:
ip link add ethdummy2 type dummy
Почему я нахожу обходной путь в dummy.conf неудобным? Потому что это не будет работать для той же системы (например, CentOS 7), работающей в контейнере: интерфейсы всегда добавляются в начальное сетевое пространство имен, поэтому контейнер никогда не увидит их (и обычно контейнеру запрещено явно загружать модуль, даже если контейнер все еще может косвенно инициировать загрузку, например, используя ip link add type dummy
).
Лично я предпочел бы использовать для dummy.conf
это: options numdummies=0
: не создавать интерфейс по умолчанию и разбираться с этим по мере необходимости. По крайней мере, результат был бы последовательным независимо от того, используете ли вы контейнер или нет.
Я также не нашел, чтобы NetworkManager поддерживал интерфейсы dummy нативно, но, по крайней мере, его можно настраивать с помощью сценариев. Вы можете проверить решения, предложенные по этой ссылке: Dummy interface on RHEL. Они добавляют скрипт для NetworkManager или используют инициализацию сервиса systemd для создания интерфейса, начиная его с выбранного имени.
Если вы позже используете дистрибутив, похожий на Debian, то это легко решается с помощью pre-up ip link add ethdummy2 type dummy 2>/dev/null || :
в разделе interfaces.
Ответ или решение
Создание Dummy Интерфейса в Linux: Полное Руководство
Вопрос о создании виртуального интерфейса в Linux, в частности использования модуля dummy
, представляет собой актуальную задачу для специалистов в области информационных технологий. Давайте разберемся, как правильно создать такой интерфейс и понять, зачем нужна дополнительная конфигурация в dummy.conf
.
Что такое Dummy Интерфейс?
Dummy интерфейс — это виртуальный сетевой интерфейс, который используется для тестирования, создания изолированных сетей или для разработки приложений, требующих сетевого взаимодействия. Он не связан с физическим оборудованием, что делает его удобным инструментом в различных задачах администрирования сети.
Шаги по Созданию Dummy Интерфейса
Вы уже выполнили некоторые шаги по созданию виртуального интерфейса. Давайте проанализируем их подробнее.
-
Загрузка Модуля:
Создание файла/etc/modules-load.d/dummy.conf
с содержимым:dummy
Этот файл указывает системе загружать модуль
dummy
при старте. -
Конфигурация Интерфейса:
Файл конфигурации/etc/sysconfig/network-scripts/ifcfg-ethdummy1
:NAME=ethdummy1 DEVICE=ethdummy1 MACADDR=00:22:22:ff:ff:ff IPADDR=10.10.10.1 NETMASK=255.255.255.0 ONBOOT=yes TYPE=Ethernet NM_CONTROLLED=no
Этот файл описывает параметры вашего виртуального интерфейса.
Значение Дополнительной Конфигурации в dummy.conf
Вы упомянули следующий фрагмент:
install dummy /sbin/modprobe --ignore-install dummy; /sbin/ip link set name ethdummy1 dev dummy0
Эта строка необходима для переименования интерфейса, который автоматически создается при загрузке модуля dummy
. По умолчанию создается интерфейс dummy0
. Из-за ограничений network-scripts
в таких дистрибутивах, как CentOS 7, не существует прямого способа запустить произвольные команды при создании интерфейса, как это делается в других системах.
Пояснение к --ignore-install
Ключ --ignore-install
предотвращает потенциальную бесконечную загрузку модуля dummy
, так как выполнение указанной строки может попытаться снова и снова загрузить модуль. Вместо этого вы переименовываете dummy0
в ethdummy1
, что позволяет системе автоматически находить и использовать этот интерфейс, как обычный Ethernet-интерфейс.
Создание Нескольких Dummy Интерфейсов
Вы можете расширить данную конфигурацию до нескольких интерфейсов, добавив следующее:
install dummy /sbin/modprobe --ignore-install dummy numdummies=2; /sbin/ip link set dev dummy0 name ethdummy1; /sbin/ip link set dev dummy1 name ethdummy2
Здесь numdummies=2
создает два интерфейса — dummy0
и dummy1
, которые затем переименовываются в ethdummy1
и ethdummy2
.
Управление Интерфейсами в Контейнерах
Следует отметить, что описанный способ может не сработать в контейнерных виртуализированных средах, так как интерфейсы всегда будут добавляться к первоначальному сетевому пространству имен. Наилучшим подходом может быть использование опции numdummies=0
, что позволяет вам создавать интерфейсы по мере необходимости.
Заключение
Создание dummy интерфейсов в Linux — это мощный инструмент, полезный для тестирования и разработки. Правильное использование конфигурационных файлов и команд позволяет избежать возможных ограничений и оптимизировать работу сети. Если вы используете дистрибутивы, такие как Debian, вы можете просто использовать конструкции, предоставляемые в конфигурациях интерфейсов, чтобы создавать интерфейсы до их использования.
Это руководство поможет вам эффективно настроить dummy интерфейсы в средах Linux, обеспечивая стабильную работу сетевых функций для разнообразных приложений.