Grub – Назначить IP для заданного MAC-адреса

Вопрос или проблема

У меня есть простой grub.cfg:

net_add_addr efinet1 efinet1 10.1.1.10

net_add_route default 10.2.1.100/32 'gw' 10.1.1.254
configfile (http,10.2.1.100:8080)/grub

Как видно, net_add_addr статически настроен на использование efinet1. Однако я хочу написать что-то, как показано ниже, чтобы динамически получать карту на основе заранее заданного MAC-адреса, который я настраиваю в grub.cfg:

# MAC-адрес, который я знаю, к которому хочу добавить адрес. Предварительно заданный MAC-адрес
set mac_address="00:00:00:00:00:01"

# по умолчанию не выбрана активная карта
set active_card=""

for card in net_ls_cards; do
    # TODO: найти способ получить MAC-адрес из $card и установить $mac
    set mac=""
    # TODO: найти способ получить имя карты для заданного $card и установить $name
    set name=""
    if [ "$mac" == "$mac_address" ]; then
        set active_card="$name"
        break
    fi
done

net_add_addr $active_card $active_card 10.1.1.10

net_add_route default 10.2.1.100/32 'gw' 10.1.1.254
configfile (http,10.2.1.100:8080)/grub

Причина, по которой я не хочу использовать статическую карту, заключается в том, что 80% времени, до сих пор, net_ls_cards давал мне непоследовательные результаты. Вот несколько примеров:

Пример 1:

> net_ls_cards
efinet2 00:00:00:00:00:01
efinet1 00:00:00:00:00:02
efinet0 00:00:00:00:00:03

В этом случае я хочу, чтобы была выбрана efinet2, и $active_card должно быть $active_card=efinet2

После перезагрузки я иногда получал следующее:

Пример 2:

> net_ls_cards
efinet0 00:00:00:00:00:01

В этом случае я хочу, чтобы была выбрана efinet0, и $active_card должно быть $active_card=efinet0

Требования к ответу

Так что в основном я спрашиваю:

  1. Правильна ли моя синтаксис для for loop?
  2. Как я смогу извлечь имя карты и MAC-адрес из этой записи efinet2 00:00:00:00:00:01, чтобы это стало $name=efinet2 и $mac=00:00:00:00:00:01

Любая помощь будет очень признательна!

Я никогда не слышал о том, чтобы название устройства NIC менялось без перенастройки оборудования – но это может произойти, когда вы меняете карты местами.

То, как я решал эту проблему в прошлом, было через правила udev, хотя то, как я это делал тогда, не будет работать ТОЧНО так же сейчас….

Обнаруженные карты перечислены в /sys/class/net/. Если вы запросите эти файлы, вы увидите, что udev может видеть MAC-адрес, например:

udevadm info /sys/class/net/enp1s0
P: /devices/pci0000:00/0000:00:1c.0/0000:01:00.0/net/enp1s0
E: DEVPATH=/devices/pci0000:00/0000:00:1c.0/0000:01:00.0/net/enp1s0
E: ID_BUS=pci
E: ID_MM_CANDIDATE=1
E: ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
E: ID_MODEL_ID=0x8168
E: ID_NET_DRIVER=r8169
E: ID_NET_LINK_FILE=/lib/systemd/network/99-default.link
E: ID_NET_NAME_MAC=enx4ccc6a160bd3
E: ID_NET_NAME_PATH=enp1s0
E: ID_OUI_FROM_DATABASE=Micro-Star INTL CO., LTD.
E: ID_PATH=pci-0000:01:00.0
E: ID_PATH_TAG=pci-0000_01_00_0
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd.
E: ID_VENDOR_ID=0x10ec
E: IFINDEX=2
E: INTERFACE=enp1s0
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp1s0
E: TAGS=:systemd:
E: USEC_INITIALIZED=1000132

В частности здесь: ID_NET_NAME_MAC=enx4ccc6a160bd3

Так что если бы я добавил правило udev (в /etc/udev/rules.d/) с чем-то вроде:

SUBSYSTEM=="net",ACTION=="add",ATTR{ID_NET_NAME_MAC}=="enx4ccc6a160bd3",ATTR{type}=="1",NAME="extnic0"

Я должен (не тестировал) получить устройство с именем extnic0 для этой конкретной NIC – и имя не использовалось бы для чего-либо другого, если карта не была бы присутствующей.

…..или просто использовать DHCP с статической настройкой 🙂

Ответ или решение

Использование GRUB для динамического назначения IP-адреса по MAC-адресу

В этой статье рассмотрим, как настроить конфигурацию GRUB для динамического назначения IP-адреса сетевому интерфейсу на основе известного MAC-адреса. Это улучшит гибкость и стабильность вашей сетевой конфигурации.

Задача

У вас есть статическая конфигурация, которая использует фиксированный интерфейс (efinet1). Однако из-за непостоянства в отображении доступных сетевых карт вы хотите модифицировать вашу конфигурацию, чтобы динамически определять нужный интерфейс по MAC-адресу.

Шаги для реализации

  1. Синтаксис цикла for: Ваша основная идея о использовании цикла for для перебора доступных интерфейсов правильна. Однако GRUB не поддерживает встроенные конструкции, такие как циклы и условия, так как это зависит от версии GRUB. Вы можете использовать набор команд, но в основном вам нужно проверить доступные интерфейсы с помощью net_ls_cards.

  2. Извлечение MAC-адреса и имени интерфейса: Для извлечения имени интерфейса и MAC-адреса вам необходимо разбить строку, возвращаемую net_ls_cards. В данной строке каждая пара (имя интерфейса и MAC-адрес) разделена пробелом. Применим коды для извлечения этих значений.

Пример реализации

Если вы находитесь в среде GRUB, ваш код может выглядеть как-то так:

# Задаем известный MAC-адрес
set mac_address="00:00:00:00:00:01"

# По умолчанию выбран ни один интерфейс
set active_card=""

# Перебираем доступные сетевые карты
while read card; do
    # Разбиваем строку на имя интерфейса и MAC-адрес
    set name=`echo $card | cut -d ' ' -f 1`
    set mac=`echo $card | cut -d ' ' -f 2`

    # Проверяем, совпадает ли MAC-адрес с нужным
    if [ "$mac" == "$mac_address" ]; then
        set active_card="$name"
        break
    fi
done < <(net_ls_cards)

# Если активный интерфейс был найден, настраиваем его
if [ "$active_card" != "" ]; then
    net_add_addr $active_card $active_card 10.1.1.10
    net_add_route default 10.2.1.100/32 'gw' 10.1.1.254
    configfile (http,10.2.1.100:8080)/grub
else
    echo "Указанный MAC-адрес не найден."
fi

Дополнительные рекомендации

  • Если вы хотите избежать проблем с динамическим именованием сетевых карт, рассмотрите возможность использования udev-правил в вашей операционной системе, которые могут назначать фиксированные имена вашим сетевым интерфейсам на базе MAC-адресов.

  • Можно также использовать DHCP с привязкой статического IP-адреса для обеспечения устойчивой сетевой конфигурации, если это возможно.

Такой подход поможет вам избежать трудностей при загрузке и дисфункциях, связанных с изменением имен сетевых интерфейсов. Следуйте указанным рекомендациям, и вы сможете оптимизировать вашу сетевую конфигурацию в GRUB.

Оцените материал
Добавить комментарий

Капча загружается...