2009-10-29 41 views
1

我写的udev规则自动重命名和编号具有特定MAC地址的网卡。使用udev自动重命名和编号nics使用udev

产生的规则应该这样做几乎相同75-persistent-net-generator.rules不(符合前3个字节网卡的MAC地址,这取决于如何此供应商的多卡安装它命名为“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等的第二张卡。

由于提前, flokra

回答

0

如果设置了ENV {接口}为“mycard0”呼叫write_net_rules之前,它会找到第一个未使用mycardN你,写出它的规则,并返回名称在ENV {INTERFACE_NEW}中。

+0

几乎就是这样。留下一个问题:编写的规则具有'KERNEL == mycard *'而不是'KERNEL == eth *',因此不适用。我今天早上写了一个完整的解决方案,并在我回家时发布。 – flokra 2009-11-06 15:19:25

0

OK,这里是我的解决方案(我已经在Debian 5.0和Ubuntu 9.04进行了测试,所以我不知道这是否与其他发行版的udev进行的实现工作):

  1. 75-持久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" 
    
  2. 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 $0" 
         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}="mycard0",它设置卡片应该获得的名称以及match="$match, KERNEL==\"eth*\""位于write_mycard_rules中,这迫使udev不使用新名称覆盖已使用的内核子系统。