Prediction de nom des interfaces reseau de systemd

Rédigé par Paulo Aucun commentaire
Classé dans : Python, Linux, Systemd Mots clés : reseau

Extrait du fichier src/udev/udev-builtin_id.c
/*
 * Predictable network interface device names based on:
 *  - firmware/bios-provided index numbers for on-board devices
 *  - firmware-provided pci-express hotplug slot index number
 *  - physical/geographical location of the hardware
 *  - the interface's MAC address
 *
 * http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames
 *
 * Two character prefixes based on the type of interface:
 *   en -- ethernet
 *   sl -- serial line IP (slip)
 *   wl -- wlan
 *   ww -- wwan
 *
 * Type of names:
 *   b<number>                             -- BCMA bus core number
 *   ccw<name>                             -- CCW bus group name
 *   o<index>[d<dev_port>]                 -- on-board device index number
 *   s<slot>[f<function>][d<dev_port>]     -- hotplug slot index number
 *   x<MAC>                                -- MAC address
 *   [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>]
 *                                         -- PCI geographical location
 *   [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
 *                                         -- USB port number chain

En Résumé

  • deux caracteres pour le type d'interface
    en : Ethernet
    wl : Wireless Lan (WLAN)
    ww : Wireless WIde Area (WWAN)
  • x caracteres pour le type de périphériques reseau
    o(index) : on-board device index number
    p<bus>s<slot>[f<function>][d<dev_id>] : PCI
    p<bus>s<slot>[f<function>][u<port>]

 

un extrait de la base udev montre qu'une interface possede plusieurs noms
commande : udevadm info -e
  • ID_NET_NAME_MAC
  • ID_NET_NAME_PATH
  • ID_NET_NAME_SLOT
#
lst='ID_NET_NAME_MAC ID_NET_NAME_PATH ID_NET_NAME_SLOT'
#
for i in $lst;do echo $i;udevadm info -e|grep &nbsp;$i;echo;done
ID_NET_NAME_MAC
E: ID_NET_NAME_MAC=enx98be9410e830
E: ID_NET_NAME_MAC=enx98be9410e838
E: ID_NET_NAME_MAC=enx0a94ef0f7cbb
E: ID_NET_NAME_MAC=enx0894ef0f7cb4
E: ID_NET_NAME_MAC=enx0894ef0f7cb5
E: ID_NET_NAME_MAC=enx0894ef0f7cb6
E: ID_NET_NAME_MAC=enx0894ef0f7cb7

ID_NET_NAME_PATH
E: ID_NET_NAME_PATH=enp1s0f0
E: ID_NET_NAME_PATH=enp1s0f1
E: ID_NET_NAME_PATH=enp0s20u1u5
E: ID_NET_NAME_PATH=enp22s0f0
E: ID_NET_NAME_PATH=enp22s0f1
E: ID_NET_NAME_PATH=enp22s0f2
E: ID_NET_NAME_PATH=enp22s0f3

ID_NET_NAME_SLOT
E: ID_NET_NAME_SLOT=ens3f0
E: ID_NET_NAME_SLOT=ens3f1

 

Choix du nom final :
A partir du code udev : src/udev/net/link-config.c, on constate que la recherche de nom se fait séquentiellement : 
  • ID_NET_NAME_FROM_DATABASE
  • ID_NET_NAME_ONBOARD
  • ID_NET_NAME_SLOT
  • ID_NET_NAME_PATH
  • ID_NET_NAME_MAC

La première correspondance trouvée donne le nom à l'interface....

if (ctx->enable_name_policy && config->name_policy) {
        NamePolicy *policy;
 
        for (policy = config->name_policy;
             !new_name && *policy != _NAMEPOLICY_INVALID; policy++) {
                switch (*policy) {
                        case NAMEPOLICY_KERNEL:
                                respect_predictable = true;
                                break;
                        case NAMEPOLICY_DATABASE:
                                new_name = udev_device_get_property_value(device, "ID_NET_NAME_FROM_DATABASE");
                                break;
                        case NAMEPOLICY_ONBOARD:
                                new_name = udev_device_get_property_value(device, "ID_NET_NAME_ONBOARD");
                                break;
                        case NAMEPOLICY_SLOT:
                                new_name = udev_device_get_property_value(device, "ID_NET_NAME_SLOT");
                                break;
                        case NAMEPOLICY_PATH:
                                new_name = udev_device_get_property_value(device, "ID_NET_NAME_PATH");
                                break;
                        case NAMEPOLICY_MAC:
                                new_name = udev_device_get_property_value(device, "ID_NET_NAME_MAC");
                                break;
                        default:
                                break;
                }
        }
}

On peut donc intervenir au niveau des règles afin de selectionner le type de nommage désiré.
Ex : utilisation de regles udev utiliser le PATH (desactivation de ONBARD et SLOT)

#copie d'un fichier de règle
cp /usr/lib/udev/rules.d/80-net-name-slot.rules   /etc/udev/rules.d/

#adaptation des noms d'interface souhaitée
sed -i '/ID_NET_NAME_ONBOARD/s/^/#/' /etc/udev/rules.d/80-net-name-slot.rules
sed -i '/ID_NET_NAME_SLOT/s/^/#/' /etc/udev/rules.d/80-net-name-slot.rules

 

 

Extrait doc RedHat sur la procédure d'affectations de noms des périphériques: ici
  • /usr/lib/udev/rules.d/60-net.rules : cherche dans tous les fichiers ifcfg-suffix si il existe une @Mac qui correspond à l'interface et renomme l'interface avec le nom donné daans le fichir par la directive "DEVICE".
     
  • /usr/lib/udev/rules.d/71-biosdevname.rules instruit biosname de nommer les interfaces (si non renommé par l'étape précédente).
     
  • /usr/lib/udev/rules.d/75-net-description.rules permet à udev de remplir les valeurs des propriétés du périphérique ID_NET_NAME_ONBOARD, ID_NET_NAME_SLOT, ID_NET_NAME_PATH, ID_NET_NAME_MAC.
    Certaines propriétés peuvent ne pas être définies.
     
  • /usr/lib/udev/rules.d/80-net-name.rules instruit udev de renommer l'interface si pas déjà fait par les étapes 1 ou 2

 

En vrac 
udevadm info -e|grep -A 23 ^P.*ens3f0
   P: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/net/ens3f0
   E: DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/net/ens3f0  
   E: ID_BUS=pci
   E: ID_MODEL_FROM_DATABASE=OneConnect NIC (Skyhawk)
   E: ID_MODEL_ID=0x0720
   E: ID_NET_DRIVER=be2net
   E: ID_NET_NAME_MAC=enx98be9410e830
   E: ID_NET_NAME_PATH=enp1s0f0
   E: ID_NET_NAME_SLOT=ens3f0
   E: ID_OUI_FROM_DATABASE=IBM
   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=Emulex Corporation
   E: ID_VENDOR_ID=0x10df
   E: IFINDEX=4
   E: INTERFACE=ens3f0
   E: SUBSYSTEM=net
   E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/ens3f0
   E: TAGS=:systemd:
   E: USEC_INITIALIZED=460971

 

 

Les commentaires sont fermés.