Grub - 주어진 MAC 주소에 IP 할당

Grub - 주어진 MAC 주소에 IP 할당

나는 간단합니다 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

내가 정적 카드를 사용하고 싶지 않은 이유는 net_ls_cards지금까지 80%의 경우 일관되지 않은 결과를 제공하기 때문입니다. 여기 몇 가지 예가 있어요.

예시 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 name이 항목에서 and를 추출하여 다음과 같이 되도록 하려면 어떻게 해야 합니까?mac 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를 사용하세요 :)

관련 정보