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を使用してください:)

おすすめ記事