Вопрос или проблема
Класс машин Linux, которые мы поддерживаем/собираем, имеет до 8 сетевых интерфейсов, и все, кроме одного, не подключены на этапе сборки.
Я хотел бы ускорить процесс сборки, сказав initrd игнорировать все, кроме подключенного, но не могу найти параметры ядра, которые можно добавить в параметры загрузки для этого.
Проблема не в PXE, а в том, что initrd сканирует все интерфейсы, чтобы затем загрузить базовый образ через NFS и приступить к фактической установке на целевой машине. Мы рассмотрим возможность скрытия интерфейсов из BIOS (как предложил Маркус), хотя ожидание двух дополнительных длинных POST, вероятно, сводит на нет цель (сокращение времени обратного обращения).
Может ли кто-то предложить другой подход, чтобы избежать длительного ожидания окончания времени ожидания каждого присутствующего сетевого интерфейса при сетевой загрузке?
Ответ или решение
Для решения задачи ускорения процесса сборки Линукс-систем с несколькими сетевыми интерфейсами, когда исключительно один из них подключен на этапе сборки, необходимо сосредоточиться на оптимизации загрузочного процесса, чтобы избежать длительных таймаутов, возникающих при попытке инициализации всех сетевых интерфейсов.
Теоретическая основа
Управление сетевыми интерфейсами при загрузке
При использовании систем автоматической установки, таких как Fully Automated Installation (FAI), и метода загрузки через сеть (PXE), загрузочное окружение выполняется с использованием начального RAM-диска (initrd). Этот RAM-диск отвечает за детектирование оборудования, включая сетевые интерфейсы, что может привести к затягиванию процесса из-за попыток подключения через каждый интерфейс.
Одним из решений является применение корректных параметров ядра или модификация initrd для явного исключения ненужных интерфейсов на этапе загрузки. Хотя стандартные параметры ядра (например, ip=
, net.ifnames=0
) не обеспечивают возможность указания конкретного интерфейса для использования, есть другие подходы для решения этой проблемы.
Пример решения на практике
Для оптимизации процесса загрузки при наличии множества сетевых интерфейсов можно использовать следующие подходы:
-
Модификация initrd:
- Развёртка и модификация initrd для добавления пользовательского скрипта, который отключает неиспользуемые интерфейсы. Это может быть выполнено с использованием
dracut
илиbusybox
. Скрипт может идентифицировать активный интерфейс на основании таких факторов, как наличие линков, и отключать остальные интерфейсы.
- Развёртка и модификация initrd для добавления пользовательского скрипта, который отключает неиспользуемые интерфейсы. Это может быть выполнено с использованием
-
Использование udev правил:
- Создайте специфичные правила udev, которые могут инициировать скрипт отключения неиспользуемых интерфейсов сразу же после их обнаружения. Это снижает общую нагрузку на процессор и ускоряет загрузку.
-
Настройка параметров BIOS/UEFI:
- Некоторые серверы позволяют в настройках BIOS/UEFI отключать неиспользуемые сетевые контроллеры. Таким образом, система их не будет инициализировать.
Применение на практике
Для иллюстрации приведём пример того, как такие принципы могут быть применены:
-
Изменение initrd:
- Извлеките текущий initrd ведя следующие команды:
mkdir /tmp/initrd cd /tmp/initrd gzip -dc /boot/initrd.img-$(uname -r) | cpio -idmv
- Добавьте скрипт для отключения интерфейсов, например, только интерфейс с определённым MAC-адресом останется активным:
#!/bin/sh for iface in /sys/class/net/*; do iface=$(basename $iface) if [ "$iface" != "eth0" ]; then ip link set $iface down fi done
- Затем запакуйте initrd обратно:
find . | cpio -o -H newc | gzip > /boot/new-initrd.img
- Извлеките текущий initrd ведя следующие команды:
-
Создание udev правила:
- Разместите это правило в
/etc/udev/rules.d/70-ignore-nics.rules
:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}!="xx:xx:xx:xx:xx:xx", RUN+="/sbin/ip link set dev $name down"
- Замените
xx:xx:xx:xx:xx:xx
на MAC-адрес вашего активного интерфейса.
- Разместите это правило в
Применяя указанные подходы, вы сможете значительно сократить время, затрачиваемое на пост-биосные таймауты каждого неиспользуемого сетевого интерфейса и, следовательно, ускорить процесс автоматизированной установки операционной системы.