GNU/Linux >> Tutoriels Linux >  >> Linux

Gérer votre matériel connecté sous Linux avec systemd-udevd

Linux fait un excellent travail en reconnaissant, chargeant et exposant automatiquement les périphériques matériels connectés d'innombrables fournisseurs. En fait, c'est cette fonctionnalité qui, il y a de nombreuses années, m'a convaincu d'insister pour que mon employeur convertisse toute son infrastructure à Linux. Le problème était qu'une certaine entreprise de Redmond ne pouvait pas charger les pilotes de la carte réseau intégrée sur nos ordinateurs de bureau Compaq alors que Linux le faisait sans effort.

Au cours des années qui ont suivi, la bibliothèque Linux de périphériques reconnus s'est énormément développée avec la sophistication du processus. Et la star de cette émission est udev. Le travail d'Udev consiste à écouter les événements du noyau Linux impliquant des modifications de l'état d'un périphérique. Il peut s'agir d'un nouveau périphérique USB branché ou débranché, ou d'une souris sans fil qui se déconnecte car elle est noyée dans du café renversé.

Le travail d'Udev consiste à gérer tous les changements d'état, par exemple en attribuant les noms ou les autorisations par lesquelles les appareils sont accessibles. Un enregistrement de ces modifications est accessible via dmesg. Étant donné que dmesg crache généralement des milliers d'entrées, il est judicieux de filtrer les résultats. L'exemple ci-dessous montre comment Linux identifie mon interface Wi-Fi. Il montre le chipset utilisé par mon appareil sans fil (ath9k ), le nom d'origine qui lui a été attribué au début du processus (wlan0 ), et le gros et laid nom permanent qu'il utilise actuellement (wlxec086b1ef0b3 ):

$ dmesg | grep wlan
[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3 :renommé depuis wlan0

Dans cet article, je vais expliquer pourquoi quelqu'un pourrait vouloir utiliser un nom comme celui-là. En cours de route, j'explorerai l'anatomie des fichiers de configuration udev, puis je montrerai comment apporter des modifications aux paramètres udev, y compris comment modifier la façon dont le système nomme les périphériques. Cet article est basé sur un module de mon nouveau cours, Optimisation du système Linux.

Comprendre le système de configuration udev

Sur les machines systemd, les opérations udev sont gérées par le systemd-udevd démon. Vous pouvez vérifier l'état du démon udev de la manière systemd habituelle en utilisant systemctl status systemd-udevd .

Plus de ressources Linux

  • Aide-mémoire des commandes Linux
  • Aide-mémoire des commandes Linux avancées
  • Cours en ligne gratuit :Présentation technique de RHEL
  • Aide-mémoire sur le réseau Linux
  • Aide-mémoire SELinux
  • Aide-mémoire sur les commandes courantes de Linux
  • Que sont les conteneurs Linux ?
  • Nos derniers articles Linux

Techniquement, udev fonctionne en essayant de faire correspondre chaque événement système qu'il reçoit avec des ensembles de règles trouvés dans /lib/udev/rules.d/ ou /etc/udev/rules.d/ répertoires. Les fichiers de règles incluent des clés de correspondance et des clés d'affectation. L'ensemble de clés de correspondance disponibles inclut action , nom , et sous-système . Cela signifie que si un périphérique avec un nom spécifié faisant partie d'un sous-système spécifié est détecté, une configuration prédéfinie lui sera attribuée.

Ensuite, les couples clé/valeur « affectation » sont utilisés pour appliquer la configuration souhaitée. Vous pouvez, par exemple, attribuer un nouveau nom au périphérique, l'associer à un lien symbolique du système de fichiers ou restreindre l'accès à un propriétaire ou à un groupe particulier. Voici un extrait d'une telle règle de mon poste de travail :

$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Utilisez des noms basés sur MAC pour les interfaces réseau qui sont directement ou indirectement
# sur USB et avoir une adresse MAC universellement administrée (stable) (le deuxième bit
# est 0). Ne le faites pas lorsque ifnames est désactivé via la ligne de commande du noyau ou
# personnalisant/désactivant 99-default.link (ou précédemment 80-net-setup-link.rules).

IMPORT {cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

ACTION=="add", SUBSYSTEM=="net ", SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules .d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id" , NAME="$env{ID_NET_NAME_MAC}"

L'ajout l'action indique à udev de se lancer chaque fois qu'un nouveau périphérique est branché qui fait partie du sous-système réseau et est un périphérique USB. De plus, si je comprends bien, la règle ne s'appliquera que lorsque l'appareil a une adresse MAC composée de caractères dans une certaine plage et, en plus, uniquement si le 80-net-setup-link.rules et 99-default.link les fichiers ne le font pas existent.

En supposant que toutes ces conditions sont remplies, l'ID d'interface sera modifié pour correspondre à l'adresse MAC de l'appareil. Rappelez-vous l'entrée dmesg précédente montrant comment mon nom d'interface a été changé de wlan0 à ce méchant wlxec086b1ef0b3 Nom? C'était le résultat de l'exécution de cette règle. Comment puis-je savoir? Parce que ec:08:6b:1e:f0:b3 est l'adresse MAC de l'appareil (moins les deux-points) :

$ ifconfig -a
wlxec086b1ef0b3 :flags=4163  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255 :8 et 8 0
:7484:3120:c6a3:e3d1  prefixlen 64  scopeid 0x20
        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet)
        Paquets RX 682098  octets 714517869 Mo (71)  

Cette règle udev existe par défaut dans Linux. Je n'ai pas eu à l'écrire moi-même. Mais pourquoi s'embêter, surtout vu à quel point il est difficile de travailler avec une telle désignation d'interface ? Jetez un deuxième coup d'œil aux commentaires inclus avec la règle :

# Utilisez des noms basés sur MAC pour les interfaces réseau qui sont directement ou indirectement
# sur USB et ont une adresse MAC universellement administrée (stable) (le deuxième bit
# est 0). Ne le faites pas lorsque ifnames est désactivé via la ligne de commande du noyau ou
# personnalisant/désactivant 99-default.link (ou précédemment 80-net-setup-link.rules).

Notez comment cette règle est conçue spécifiquement pour les interfaces réseau USB. Contrairement aux cartes d'interface réseau (NIC) PCI, les périphériques USB sont susceptibles d'être retirés et remplacés de temps à autre. Cela signifie qu'il n'y a aucune garantie que leur ID ne changera pas. Il peut s'agir de wlan0 un jour et wlan3 le suivant. Pour éviter de confondre les applications, attribuez aux appareils des identifiants absolus, comme celui donné à mon interface USB.

Manipulation des paramètres udev

Pour ma prochaine astuce, je vais récupérer l'adresse MAC et l'ID actuel de l'interface réseau Ethernet sur une machine virtuelle VirtualBox, puis utiliser ces informations pour créer une nouvelle règle udev qui modifiera l'ID d'interface. Pourquoi? Eh bien, je prévois peut-être de travailler avec l'appareil à partir de la ligne de commande, et devoir taper ce long nom peut être ennuyeux. Voici comment cela fonctionnera.

Avant de pouvoir modifier mon identifiant, je dois désactiver la configuration réseau actuelle de Netplan. Cela obligera Linux à prêter attention à la nouvelle configuration. Voici mon fichier de configuration d'interface réseau actuel dans le /etc/netplan/ répertoire :

$ less /etc/netplan/50-cloud-init.yaml
# Ce fichier est généré à partir des informations fournies par
# la source de données. Les modifications apportées ne persisteront pas sur une instance.
# Pour désactiver les capacités de configuration réseau de cloud-init, écrivez un fichier
# /etc/cloud/cloud.cfg.d/99-disable-network-config .cfg par les éléments suivants :
# réseau :{config :désactivé}
réseau :
    ethernets :
        enp0s3 :
             adresses :[]
            dhcp4 :vrai
   version :2

Le 50-cloud-init.yaml contient une définition d'interface très basique. Mais il inclut également des informations importantes sur la désactivation de la configuration dans les commentaires. Pour ce faire, je vais passer à /etc/cloud/cloud.cfg.d répertoire et créez un nouveau fichier appelé 99-disable-network-config.cfg et ajoutez le réseau :{config :disabled} chaîne.

Bien que je n'aie pas testé cette méthode sur des distributions autres qu'Ubuntu, elle devrait fonctionner sur n'importe quelle version de Linux avec systemd (qui est presque toutes). Quoi que vous utilisiez, vous aurez un bon aperçu de l'écriture des fichiers de configuration udev et de leur test.

Ensuite, je dois rassembler des informations sur le système. Exécution de l'ip la commande signale que mon interface Ethernet s'appelle enp0s3 et son adresse MAC est 08:00:27:1d:28:10 :

$ ip a
2 :enp0s3 : mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1d:28 :10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.115/24 brd 192.168.0.255 étendue dynamique globale enp0s3

Maintenant, je vais créer un nouveau fichier appelé peristent-net.rules dans le fichier /etc/udev/rules.d annuaire. Je vais donner au fichier un nom qui commence par un petit chiffre, 10 :

$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00 :27:1d:28:10",NAME="eth3"

Plus le nombre est bas, plus tôt Linux exécutera le fichier, et je veux que celui-ci aille tôt. Le fichier contient du code qui donnera le nom eth3 à un périphérique réseau lorsqu'il est ajouté, tant que son adresse correspond à 08:00:27:1d:28:10 , qui est l'adresse MAC de mon interface.

Une fois que j'ai enregistré le fichier et redémarré la machine, mon nouveau nom d'interface devrait être en jeu. Je devrai peut-être me connecter directement à ma machine virtuelle et utiliser dhclient pour que Linux demande manuellement une adresse IP sur ce réseau nouvellement nommé. L'ouverture de sessions SSH peut être impossible sans le faire au préalable :

$ sudo dhclient eth3 

Fait. Vous pouvez donc maintenant forcer udev à faire en sorte que votre ordinateur se réfère à une carte réseau comme vous le souhaitez. Mais plus important encore, vous disposez des outils nécessaires pour comprendre comment gérer tout appareil qui se comporte mal.


Linux
  1. Utilisez lspci sous Linux pour voir votre matériel

  2. Surveillez votre système Linux dans votre terminal avec procps-ng

  3. Analysez votre sécurité Linux avec Lynis

  4. Commandes Linux pour afficher les informations sur votre matériel

  5. Gestion des partitions sous Linux avec fdisk

Épicez votre bureau Linux avec Cinnamon

Modernisez votre bureau Linux avec Enlightenment

Baignez-vous sur votre terminal Linux avec asciiquarium

Trouver des informations sur le matériel du système Linux avec Hwinfo

Comment surveiller vos serveurs Linux avec Checkmk

Gérez vos serveurs avec Cockpit Linux