🔌 Diagnostic rĂ©seau OT/IT · au shell Linux

Chapitre 02
Couche physique & liaison (L1/L2)

Objectifs du chapitre

1. Lister et nommer les interfaces

Avant de diagnostiquer un lien, il faut savoir lequel. Sur Linux moderne, on n'utilise plus ifconfig mais ip, de la suite iproute2. Pour un inventaire lisible d'un coup d'Ɠil :

$ ip -brief link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0             UP             b8:27:eb:4a:1c:70 <BROADCAST,MULTICAST,UP,LOWER_UP>
enp3s0           DOWN           00:1b:21:8f:33:a2 <BROADCAST,MULTICAST>

La sortie complĂšte, plus verbeuse, se lit avec ip link :

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:4a:1c:70 brd ff:ff:ff:ff:ff:ff

Trois champs comptent ici. Le mot-clé UP dit que l'administrateur a activé le port (cÎté logiciel). LOWER_UP dit que la porteuse est présente : un cùble est branché et le lien physique est établi. Enfin state UP résume l'état effectif. Un port branché mais mal cùblé donnera UP sans LOWER_UP, et state DOWN.

Un mot sur les noms. Le noyau nommait historiquement les cartes eth0, eth1
 dans l'ordre de dĂ©tection — instable d'un boot Ă  l'autre. Les distributions rĂ©centes utilisent des noms prĂ©visibles dĂ©rivĂ©s de la position physique : enp3s0 = bus PCI 3, slot 0. Sur l'edge Debian tu croiseras souvent ces noms ; sur WSL2, l'interface reste eth0. Le cours Ă©crit eth0 par convention, remplace-le par le vrai nom (ip -brief link) sur ton matĂ©riel.

Activer un port Ă©teint cĂŽtĂ© logiciel :

# Activer / désactiver l'interface (cÎté administratif)
sudo ip link set eth0 up
sudo ip link set eth0 down

ip -brief link et ip -brief addr sont tes deux réflexes d'entrée : un tableau serré, une interface par ligne. Ajoute -c (ip -c -br link) pour la couleur : les interfaces UP ressortent en vert, tu vois l'état du parc en une seconde.

2. L'état du lien : débit, duplex, auto-négociation

ip link dit si le lien est lĂ , mais pas Ă  quelle vitesse ni en quel mode. Pour cela, l'outil de rĂ©fĂ©rence est ethtool, qui interroge directement le PHY (la puce d'interface physique) de la carte :

$ sudo ethtool eth0
Settings for eth0:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Supported pause frame use: Symmetric
	Supports auto-negotiation: Yes
	Advertised link modes:  10baseT/Half 10baseT/Full
	                        100baseT/Half 100baseT/Full
	                        1000baseT/Full
	Advertised auto-negotiation: Yes
	Speed: 100Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHY address: 1
	Auto-negotiation: on
	Link detected: yes

Trois lignes Ă  lire en prioritĂ©. Link detected: yes confirme la porteuse (Ă©quivalent de LOWER_UP). Speed et Duplex donnent le rĂ©gime nĂ©gociĂ©. En Profinet, un port device est presque toujours 100 Mbit/s Full duplex : c'est le rĂ©gime nominal d'un ET 200SP, d'un CPU S7-1500 ou d'un port Scalance. Le duplex intĂ©gral supprime les collisions ; c'est ce que le temps rĂ©el exige.

Un port tombĂ© en 10 Mbit/s ou surtout en Half duplex est une panne silencieuse : le lien « marche », le ping passe, mais l'auto-nĂ©gociation a mal tournĂ© — souvent un cĂąble mĂ©diocre, une paire coupĂ©e, un connecteur oxydĂ©, ou un cĂŽtĂ© fixĂ© en manuel face Ă  un cĂŽtĂ© en auto. En half-duplex, l'Ă©mission et la rĂ©ception ne peuvent pas coexister : collisions, retransmissions, jitter. Le Profinet RT le dĂ©teste — tu verras des IO-devices « clignoter » (Station failure intermittent) sans jamais comprendre pourquoi si tu ne regardes pas Speed/Duplex.

Quand un lien est douteux, compare le régime négocié (Speed, Duplex) à ce que les deux cÎtés annoncent (Advertised link modes). Si un cÎté n'annonce plus le Gigabit alors qu'il le supporte, c'est le symptÎme classique d'une paire de cuivre défaillante : la négociation retombe sur le plus petit dénominateur commun.

Sur le CPU S7-1500, chaque port a un voyant Link/Activity vert. Dans TIA Portal, la vue « Diagnostic en ligne » d'un port physique affiche exactement Vitesse de transmission et Mode (Full/Half), et lĂšve un dĂ©faut de diagnostic si le lien tombe sous le rĂ©gime attendu. ethtool est la mĂȘme information, mais lue cĂŽtĂ© poste de diagnostic, sans ouvrir le projet d'ingĂ©nierie ni ĂȘtre en ligne sur l'automate.

3. Les compteurs d'erreurs matériels

Un lien « 100 Full, Link yes » peut quand mĂȘme ĂȘtre malade : il transporte des trames, mais une partie arrive corrompue et se fait jeter. Ces rejets sont comptĂ©s par le matĂ©riel. Vue synthĂ©tique avec ip -s link :

$ ip -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:4a:1c:70 brd ff:ff:ff:ff:ff:ff
    RX:  bytes packets errors dropped  missed   mcast
    481203344  912774   2183       0       0   118402
    TX:  bytes packets errors dropped carrier collsns
    390115820  874009      0       0       0       0

Ici RX errors 2183 : plus de deux mille trames reçues, jetĂ©es Ă  l'entrĂ©e. Pour savoir pourquoi, on descend au dĂ©tail par-compteur du pilote avec ethtool -S :

$ sudo ethtool -S eth0 | grep -iE 'err|crc|drop|coll|frame'
     rx_errors: 2183
     rx_crc_errors: 2181
     rx_frame_errors: 2
     rx_dropped: 0
     tx_errors: 0
     tx_dropped: 0
     collisions: 0

Le verdict est net : presque toutes les erreurs sont des CRC (contrĂŽle FCS ratĂ©). La trame est arrivĂ©e abĂźmĂ©e sur le fil — le contenu ne correspond plus Ă  sa somme de contrĂŽle. C'est un problĂšme de couche physique, pas de configuration : cĂąble pincĂ© ou trop long, blindage coupĂ©, connecteur RJ45 mal serti, ou bruit Ă©lectromagnĂ©tique — un variateur de frĂ©quence qui commute juste Ă  cĂŽtĂ© du cĂąble dans l'armoire est un coupable classique.

RepÚres d'interprétation des compteurs RX :

La vraie question : est-ce que ça grimpe ?

Un compteur Ă  2183 depuis le dernier boot il y a trois mois n'est pas alarmant : peut-ĂȘtre un dĂ©branchement Ă  chaud ancien. Ce qui compte, c'est de savoir s'il augmente maintenant. On fait deux relevĂ©s espacĂ©s et on regarde le delta :

Relever un compteur, attendre, relever Ă  nouveau, et lire la diffĂ©rence :

$ ethtool -S eth0 | awk '/rx_crc_errors/{print $2}'; sleep 10; \
  ethtool -S eth0 | awk '/rx_crc_errors/{print $2}'
2181
2199          # +18 CRC en 10 s → dĂ©rive active, cĂąble Ă  suspecter

Pour surveiller en direct pendant qu'on manipule un cĂąble, la boucle watch rafraĂźchit chaque seconde et fait clignoter les chiffres qui bougent :

$ watch -n1 -d "ethtool -S eth0 | grep -i err"

Bouge le cùble, tape sur le chemin de cùbles, éloigne du variateur : si les CRC s'emballent au geste, tu tiens le coupable physique.

Un compteur figĂ© pendant que la ligne fonctionne = lien sain. Un compteur qui monte rĂ©guliĂšrement mĂȘme Ă  faible cadence = dĂ©gradation en cours, Ă  corriger avant qu'elle ne provoque des pertes de cycle Profinet.

ethtool ne voit que ta propre carte et le seul segment qui la relie Ă  son port de switch. Il ne dit rien des autres liens du rĂ©seau. Si un ET 200SP distant dĂ©croche Ă  cause de son cĂąble (segment « switch ↔ device » auquel ton poste n'appartient pas), tu ne verras rien monter dans ethtool -S eth0 — c'est normal. Les erreurs de ce segment sont comptĂ©es par le port du switch managĂ© en face du device : on les lit en SNMP (ifInErrors, cf. chapitre 10), avec le mĂȘme raisonnement de delta. RĂšgle simple : un port n'observe que le lien auquel il touche.

4. Identifier la carte
 et le port physique

Quel pilote, quelle puce ? ethtool -i le dit — utile pour chercher un bug de driver ou vĂ©rifier une version de firmware :

$ sudo ethtool -i eth0
driver: igb
version: 5.15.0
firmware-version: 3.25, 0x800005d0
bus-info: 0000:03:00.0
supports-statistics: yes

Mais le problĂšme le plus frĂ©quent en armoire est trivial et pĂ©nible : quel port RJ45 de l'edge, parmi quatre identiques, est branchĂ© sur le CPU ? ethtool -p fait clignoter la LED du port ciblĂ© pendant N secondes :

# Faire clignoter la LED du port eth0 pendant 15 s pour le repérer
sudo ethtool -p eth0 15

Devant l'armoire, lance sudo ethtool -p eth0 30 et regarde quelle LED clignote anormalement : c'est physiquement ce port-lĂ . Bien plus fiable que de suivre un cĂąble Ă  la main dans un chemin de cĂąbles bondĂ©. Tous les pilotes ne supportent pas -p ; s'il ne se passe rien, retombe sur la mĂ©thode « dĂ©branchement » de l'exercice 3.

5. VLAN 802.1Q et MTU

Le Profinet RT circule frĂ©quemment dans un VLAN taguĂ© 802.1Q, avec la prioritĂ© 6 (classe temps rĂ©el) inscrite dans le champ PCP de la balise — c'est ainsi que les switches Scalance donnent la prioritĂ© au trafic cyclique face au reste. Pour voir les dĂ©tails de couche 2 d'une interface, dont son Ă©ventuelle appartenance VLAN, on ajoute -d :

$ ip -d link show eth0.100
7: eth0.100@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:4a:1c:70 brd ff:ff:ff:ff:ff:ff
    vlan protocol 802.1Q id 100 <REORDER_HDR> ...

Pour observer ou injecter du trafic dans un VLAN prĂ©cis depuis le poste de diagnostic, on crĂ©e une sous-interface tagĂ©e :

# Créer une sous-interface sur le VLAN 100, puis l'activer
sudo ip link add link eth0 name eth0.100 type vlan id 100
sudo ip link set eth0.100 up

# La retirer une fois le diagnostic terminé
sudo ip link delete eth0.100

Dernier point de couche 2 : la MTU, visible dans chaque sortie ip link (mtu 1500). Le Profinet cyclique tient dans de petites trames, mais les Ă©changes acycliques (paramĂ©trage d'un device, lecture d'enregistrements, mise Ă  jour) peuvent produire de gros paquets. Un MTU incohĂ©rent entre deux Ă©quipements (l'un Ă  1500, l'autre bridĂ© plus bas) laisse passer les petites trames et casse silencieusement les grosses : le lien « marche » mais certaines opĂ©rations acycliques Ă©chouent ou traĂźnent. VĂ©rifie que la MTU est homogĂšne de bout en bout.

Cùble / RJ45 couche 1 PHY (puce port) Speed / Duplex / Link Compteurs matériels rx_crc_errors, rx_dropped
 ethtool eth0 ethtool -S eth0 ip link (état)
Figure 2.1. OĂč chaque commande regarde. Le cĂąble (couche 1) entre dans le PHY, qui nĂ©gocie dĂ©bit et duplex et alimente les compteurs matĂ©riels. ip link donne l'Ă©tat administratif et la porteuse ; ethtool lit le rĂ©gime du PHY ; ethtool -S expose les erreurs comptĂ©es par le matĂ©riel — trois angles sur le mĂȘme port.

6. Un lien qui « flappe »

Le pire dĂ©faut de couche 1 n'est pas le lien mort, c'est le lien intermittent : un connecteur Ă  moitiĂ© enclenchĂ©, une soudure fatiguĂ©e, un cĂąble sectionnĂ© par des vibrations. Le lien monte, tombe, remonte — et Ă  chaque cycle le Profinet perd sa connexion IO. Le noyau journalise chaque transition ; on la suit en direct avec dmesg -w (mode follow) :

$ sudo dmesg -wT | grep -i eth0
[mar. 03 juil. 2026 14:22:07] igb 0000:03:00.0 eth0: Link is Down
[mar. 03 juil. 2026 14:22:09] igb 0000:03:00.0 eth0: Link is Up 100 Mbps Full Duplex, Flow Control: RX/TX
[mar. 03 juil. 2026 14:22:41] igb 0000:03:00.0 eth0: Link is Down
[mar. 03 juil. 2026 14:22:43] igb 0000:03:00.0 eth0: Link is Up 100 Mbps Full Duplex, Flow Control: RX/TX

Deux coupures en vingt secondes, à intervalle irrégulier : signature typique d'un contact mécanique intermittent. L'option -T horodate chaque ligne, ce qui permet de corréler les coupures avec un événement (une machine qui démarre, une porte d'armoire qu'on ferme, une vibration). Croise toujours dmesg avec le §3 : un flap s'accompagne souvent d'une bouffée de rx_crc_errors juste avant que le lien lùche.

Manipuler un cĂąble ou dĂ©brancher un port en production coupe le device Profinet correspondant — et selon le programme, peut figer une partie de process. Sur une installation vivante, on lit d'abord passivement (dmesg, compteurs, ethtool sans rien changer) et on ne dĂ©branche qu'aprĂšs avoir prĂ©venu et sĂ©curisĂ©. Les exercices ci-dessous se font sur banc de test.

Récapitulatif

Exercices

Exercice 1 — Ce port est-il sain ?

Sur ton edge Debian, l'interface cĂąblĂ©e sur le switch OT s'appelle eth0. Affiche son dĂ©bit, son duplex et l'Ă©tat du lien, puis juge si le port est dans le rĂ©gime attendu pour du Profinet. Qu'est-ce qui te ferait dire « non » ?

Voir la solution
$ sudo ethtool eth0 | grep -E 'Speed|Duplex|Link detected'
	Speed: 100Mb/s
	Duplex: Full
	Link detected: yes

100 Mb/s, Full, Link yes : c'est exactement le rĂ©gime nominal d'un port Profinet — port sain. Ce qui devrait t'alerter : Speed: 10Mb/s (nĂ©gociation retombĂ©e au plancher, cĂąble suspect), Duplex: Half (collisions garanties, jitter), ou Link detected: no (pas de porteuse — cĂąble dĂ©branchĂ© ou coupĂ©). Un Speed: 1000Mb/s n'est pas une faute en soi, mais s'il apparaĂźt lĂ  oĂč l'ingĂ©nierie attend du 100 Full, vĂ©rifie que le device et le switch sont d'accord.

Exercice 2 — Erreur ponctuelle ou dĂ©rive ?

Le lien entre ton edge et son port de switch est instable : la connexion se dĂ©grade par moments et tu suspectes ton cĂąble. RelĂšve les erreurs CRC de ton interface, attends, relĂšve Ă  nouveau, et conclus : s'agit-il d'un vieil incident figĂ© ou d'une dĂ©gradation active ? Donne la commande et le raisonnement. Enfin : si c'Ă©tait le cĂąble d'un ET 200SP distant qu'on suspectait, pourquoi ethtool ne suffirait-il pas, et quel outil faudrait-il ?

Voir la solution
$ ethtool -S eth0 | grep rx_crc_errors; sleep 30; \
  ethtool -S eth0 | grep rx_crc_errors
     rx_crc_errors: 40571
     rx_crc_errors: 40794     # +223 en 30 s

La valeur absolue (40 571) ne dit rien seule : elle a pu s'accumuler sur des mois. Le delta, lui, est parlant : +223 CRC en 30 secondes, soit une dĂ©rive franche et continue sur ton lien → couche physique en cause (cĂąble, blindage, ou EMI d'un variateur voisin). Si le second relevĂ© avait donnĂ© exactement 40 571 (delta nul), on aurait conclu Ă  un incident ancien et figĂ©, sans rapport avec l'instabilitĂ© actuelle. Pour confirmer visuellement pendant qu'on bouge le cĂąble :

$ watch -n1 -d 'ethtool -S eth0 | grep -i crc'

Et pour un ET 200SP distant ? ethtool ne lit que les compteurs de ta carte, donc uniquement le segment « ton port ↔ ton port de switch ». Le cĂąble « switch ↔ ET 200SP » est un autre segment, auquel tu n'appartiens pas : ses CRC sont comptĂ©s par le port du switch managĂ© qui fait face au device. On les lit alors en SNMP sur le switch (ifInErrors, ifOperStatus — cf. chapitre 10), avec exactement le mĂȘme raisonnement de delta : commande diffĂ©rente, logique identique.

Exercice 3 — Quel port va au CPU ?

L'edge a quatre ports RJ45 identiques ; tu ne sais pas lequel monte vers le CPU S7-1500 (192.168.0.1). Trouve-le de deux façons : d'abord sans rien débrancher, puis par une méthode de repli si la premiÚre échoue.

Voir la solution

MĂ©thode 1 — LED clignotante (non-intrusive). Fais clignoter chaque port et regarde l'armoire :

sudo ethtool -p eth0 20   # puis eth1, eth2
 en observant les LED

Le port dont la LED clignote anormalement pendant 20 s est physiquement celui que tu interroges. En suivant son cĂąble jusqu'au switch/CPU, tu identifies le bon lien sans jamais couper le trafic.

MĂ©thode 2 — corrĂ©lation par dĂ©branchement (si -p n'est pas supportĂ©). Sur banc de test uniquement : lance un suivi du lien, puis dĂ©branche/rebranche le cĂąble suspect :

$ sudo dmesg -wT | grep -iE 'eth[0-9]'
[... 14:31:02] igb ... eth2: Link is Down
[... 14:31:05] igb ... eth2: Link is Up 100 Mbps Full Duplex, Flow Control: RX/TX

C'est l'interface dont le lien tombe au débranchement (eth2 ici) qui porte le cùble du CPU. Vérifie en aval que ce segment porte bien 192.168.0.1. Cette méthode coupe le Profinet le temps de la manipulation : à réserver au banc, jamais en production sans accord.