Grub - 将 IP 分配给给定的 MAC 地址

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 address that I know I want to add the address to. Predefined MAC Address
set mac_address="00:00:00:00:00:01"

# by default no active card is selected
set active_card=""

for card in net_ls_cards; do
    # TODO: find a way to get mac address from $card and set $mac
    set mac=""
    # TODO: find way to get the card name for the given $card and set $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. 我怎样才能从这个条目中提取card nameand ,使其最终成为andmac addressefinet2 00:00:00:00:00:01$name=efinet2$mac=00:00:00:00:00:01

任何投入将不胜感激!

答案1

我从未听说过在不重新配置硬件的情况下 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"

我应该(未经测试)为该特定 NIC 获取一个名为 extnic0 的设备 - 如果该卡不存在,则该名称不会用于其他用途。

.....或者仅使用 DHCP 进行静态分配:)

相关内容