udevを使用したNICの自動名前変更と番号付け
-
10-07-2019 - |
質問
特定のMACアドレスを持つNICの名前を自動的に変更して番号を付けるために、udevルールを書いています。
結果のルールは、 75-persistent-net-generator.rules
とほぼ同じになります(カードのMACアドレスの最初の3バイトに一致し、その量に応じて「mycard *」と命名します)このベンダーのカードがインストールされている場合、名前変更ルールを 70-persistent-net.rules
)に書き込みます。
これは、私がこれまでに到達した距離です。
# udev rules to name rename cards to mycard
ACTION!="add", GOTO="persistent_mycard_generator_end"
SUBSYSTEM!="net", GOTO="persistent_mycard_generator_end"
# ignore the interface if a name has already been set
NAME=="mycard*", GOTO="persistent_mycard_generator_end"
# device name whitelist
KERNEL!="eth*", GOTO="persistent_mycard_generator_end"
# read MAC address
ENV{MATCHADDR}="$attr{address}"
# match interface type
ENV{MATCHIFTYPE}="$attr{type}"
# ignore non mycard MAC addresses
ENV{MATCHADDR}!="00:11:22:*", GOTO="persistent_mycard_generator_end"
# default comment
ENV{COMMENT}=="", ENV{COMMENT}="mycard connected through ($attr{driver})"
#### THIS IS THE PART I DON'T GET ####
# write rule
DRIVERS=="?*", IMPORT{program}="write_net_rules"
# rename interface if needed
ENV{INTERFACE_NEW}=="?*", NAME="mycard*"
#### THIS IS THE END OF THE PART I DON'T GET ####
LABEL="persistent_mycard_generator_end
タスク「取得できない部分」カードの名前を変更し(eth3と言う)、mycard0に変更するか、一致するMACアドレスがmycard1のシステム内の2番目のカードである場合など。
事前に感謝します、 フロクラ
解決
ENV {INTERFACE}を" mycard0"に設定した場合write_net_rulesを呼び出す前に、最初に使用されていないmycardNを見つけ、そのルールを書き出して、ENV {INTERFACE_NEW}に名前を返します。
他のヒント
OK、ここに私の解決策があります(Debian 5.0およびUbuntu 9.04でテストしたので、他のディストリビューションのudev実装で動作するかどうかわかりません):
-
75-persistent-mycard-generator.rules
ACTION!="add", GOTO="persistent_mycard_generator_end" SUBSYSTEM!="net", GOTO="persistent_mycard_generator_end" # ignore the interface if a name has already been set NAME=="?*", GOTO="persistent_mycard_generator_end" # device name whitelist KERNEL!="eth*", GOTO="persistent_mycard_generator_end" # by default match on the MAC address and interface type ENV{MATCHADDR}="$attr{address}" ENV{MATCHIFTYPE}="$attr{type}" # match interface dev_id ATTR{dev_id}=="?*", ENV{MATCHDEVID}="$attr{dev_id}" # by default match on the MAC address and interface type ENV{MATCHADDR}="$attr{address}" ENV{MATCHIFTYPE}="$attr{type}" # match interface dev_id ATTR{dev_id}=="?*", ENV{MATCHDEVID}="$attr{dev_id}" # terminate processing if card is not a mycard ENV{MATCHADDR}!="AA:BB:CC:*", GOTO="persistent_mycard_generator_end" # provide nice comments for the generated rules SUBSYSTEMS=="pci", ENV{COMMENT}="PCI device $attr{vendor}:$attr{device}" SUBSYSTEMS=="pcmcia", ENV{COMMENT}="PCMCIA device $attr{card_id}:$attr{manf_id}" SUBSYSTEMS=="usb", ENV{COMMENT}="USB device 0x$attr{idVendor}:0x$attr{idProduct}" ENV{COMMENT}=="", ENV{COMMENT}="Unknown $env{SUBSYSTEM} device($env{DEVPATH})" ATTRS{driver}=="?*", ENV{COMMENT}="$env{COMMENT} ($attr{driver})" # add mycard to comment ENV{COMMENT}="$env{COMMENT} (mycard)" # set interface name to mycard0 (initially) ENV{INTERFACE}="mycard0" # generate and write the rule DRIVERS=="?*", IMPORT{program}="write_mycard_rules" # rename the interface if requested ENV{INTERFACE_NEW}=="?*",NAME="$env{INTERFACE_NEW}" LABEL="persistent_mycard_generator_end"
-
write_mycard_rules
RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules' . /lib/udev/hotplug.functions interface_name_taken() { local value="$(find_all_rules 'NAME=' $INTERFACE)" if [ "$value" ]; then return 0 fi return 1 } find_next_available() { raw_find_next_available "$(find_all_rules 'NAME=' "$1")" } write_rule() { local match="$1" local name="$2" local comment="$3" { if [ "$PRINT_HEADER" ]; then PRINT_HEADER= echo "# This file was automatically generated by the <*>" echo "# program run by the persistent-mycard-generator.rules rules file." echo "#" echo "# You can modify it, as long as you keep each rule on a single line." fi echo "" [ "$comment" ] && echo "# $comment" echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\"" } >> $RULES_FILE } if [ -z "$INTERFACE" ]; then echo "missing \$INTERFACE" >&2 exit 1 fi # Prevent concurrent processes from modifying the file at the same time. lock_rules_file # Check if the rules file is writeable. choose_rules_file # the DRIVERS key is needed to not match bridges and VLAN sub-interfaces if [ "$MATCHADDR" ]; then match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\"" fi if [ "$MATCHDRV" ]; then match="$match, DRIVERS==\"$MATCHDRV\"" fi if [ "$MATCHDEVID" ]; then match="$match, ATTR{dev_id}==\"$MATCHDEVID\"" fi if [ "$MATCHID" ]; then match="$match, KERNELS==\"$MATCHID\"" fi if [ "$MATCHIFTYPE" ]; then match="$match, ATTR{type}==\"$MATCHIFTYPE\"" fi if [ -z "$match" ]; then echo "missing valid match" >&2 unlock_rules_file exit 1 fi basename=${INTERFACE%%[0-9]*} match="$match, KERNEL==\"eth*\"" if [ "$INTERFACE_NAME" ]; then # external tools may request a custom name COMMENT="$COMMENT (custom name provided by external tool)" if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then INTERFACE=$INTERFACE_NAME; echo "INTERFACE_NEW=$INTERFACE" fi else # if a rule using the current name already exists, find a new name if interface_name_taken; then INTERFACE="$basename$(find_next_available "$basename[0-9]*")" echo "INTERFACE_NEW=$INTERFACE" fi fi write_rule "$match" "$INTERFACE" "$COMMENT" unlock_rules_file exit 0
最も重要な変更は、75-persistent-mycard-generator.rulesの ENV {INTERFACE} =&quot; mycard0&quot;
です。これは、カードが取得する名前と match =&quot;を設定します。 write_mycard_rulesの$ match、KERNEL == \&quot; eth * \&quot;&quot;
は、udevが使用されるカーネルサブシステムを新しい名前で上書きしないようにします。