ID matériel Raspberry Pi

22

Existe-t-il une possibilité de stocker un ID matériel pour chaque appareil basé sur Raspberry Pi?

Disons que j'ai 10 appareils personnalisés basés sur la plate-forme Raspberry Pi qui sont utilisés pour des tâches distribuées. À un moment donné, pour une raison quelconque, je veux tout effacer de l'un d'eux. Comment puis-je ré-identifier le forum après cela?

Pi a-t-il une puce qui stocke un identifiant unique comme un numéro de série pour chaque carte? Sinon, puis-je ajouter une mémoire (en lecture seule) (qui peut stocker une valeur simple même lorsqu'elle n'est pas alimentée) pour pouvoir communiquer avec elle via GPIO à tout moment?

Quelles sont les alternatives?

Alexandru Irimiea
la source
S'il vous plaît ne posez pas de question, puis sur la base de la réponse, décidez que vous vouliez vraiment poser ou avoir une autre question. Cela fait perdre du temps aux personnes à qui vous demandez de l'aide. Pour cette raison, j'ai annulé votre modification. Si vous avez une autre question, posez une autre question.
goldilocks
@goldilocks: Vous avez raison. J'aurais dû diviser cette question en deux.
Alexandru Irimiea
Et «ZERO»? pas d'adresse MAC ici ... tout autre ID unique?
fcm

Réponses:

23

Oui, chaque carte a un numéro de série. Les méthodes pour récupérer ceci sont décrites ici: Comment puis-je obtenir le numéro de série?

Ralph
la source
Ce n'est pas une réponse complète, car elle ne concerne que Linux et ne mentionne pas du tout les fenêtres. Il serait également intéressant de savoir comment procéder sur Windows.
Andrew Savinykh
@Savinykh ... linux et Mac OS. Awk, grep et cut sont des outils disponibles sur les deux OS, mais je conviens que Windows est laissé de côté car il manque ces outils de ligne de commande pratiques.
ripat
9
Vous ne pouvez pas exécuter Mac OS sur le Pi, ce n'est donc pas pertinent. Vous ne pouvez exécuter l'édition sans tête Win10 IOT que sur le Pi je crois. De manière réaliste, 99% des utilisateurs de Pi utilisent Linux.
pjc50
@ripat, pouvez-vous exécuter Mac OS sur raspberry pi? J'en doute en quelque sorte.
Andrew Savinykh
6

En voici une plus facile à utiliser: l'adresse MAC via la configuration automatique IPv6 NDP. Il s'agit d'une méthode universelle applicable à toute interface réseau.

Chaque carte réseau, y compris celle USB utilisée sur le Pi, a une adresse MAC 48 bits, par exemple 14:cf:92:20:26:3c,.

Chaque adresse MAC 48 bits a un mappage un à un unique vers une adresse EUI-64 en masquant les deux derniers bits du troisième octet ( 92à 90) et en insérant les octets feffentre le troisième et le quatrième octet. Le 48-bit précité MAC peut être mis en correspondance avec le EUI-64: 14cf:90fe:ff20:263c.

Le processus de configuration automatique des adresses IPv6 utilise le protocole NDP pour découvrir l'adresse réseau 64 bits dans l'adresse 128 bits. Ce processus donnera à tous vos appareils du même réseau le même préfixe 64 bits. L'EUI-64 susmentionné est utilisé pour remplir l'adresse de station 64 bits, ce qui donne une adresse IPv6 unique au monde de 128 bits. Donc, si vous avez le préfixe de réseau IPv6 2001:470:d:472::/64, la carte réseau susmentionnée, lorsqu'elle sera utilisée dans ce réseau, sera garantie d'avoir une adresse IPv6 routable globalement 2001:470:d:472:14cf:90fe:ff20:263c. Tant que votre outil de gestion est configuré pour utiliser IPv6, branchez-y simplement cette adresse et cela devrait être bon.

Maxthon Chan
la source
c'est à mon avis la meilleure façon de répondre à cette question. MAC est unique. vous pouvez le hacher un peu si vous le souhaitez, mais simplement compter sur l'adresse MAC peut être fait sur n'importe quelle plate-forme.
Havnar
@Havnar Mieux que cela, cela traduit l'adresse MAC directement en une adresse IPv6 routable globalement qui peut être utilisée pour envoyer directement des paquets au Pi (tout protocole de couche application, tant qu'il fonctionne sur IPv6 qui est la plupart d'entre eux, fonctionnera ici)
Maxthon Chan
Je ne connais pas beaucoup de gens qui utilisent réellement ipv6 à la maison ou en production.
Havnar
@Havnar J'ai déployé le tunnel IPv6 dans mon réseau domestique au point que tous les appareils de ma maison, à l'exception du routeur lui-même, peuvent fonctionner sans IPv4 activé.
Maxthon Chan
5

Comme dans l'autre réponse, le Pi a un ID unique, qui est lié au MAC.

Dans la pratique, il est plus pratique pour le réseautage d'avoir un unique hostname. J'utilise le script suivant pour définir les noms en fonction CPUID.

#!/bin/bash
# script to set Pi hostname based on MAC (or Serial number)
# 2017-08-18
# This script should be run as root (or with sudo) to change names
# If run by a user it will report changes, but will NOT implement them
# Works for PiB (all models), Pi2, Pi3, PiZeroW with on board networking
# PiA models will set a unique Name based on Serial number

PDIR="$(dirname "$0")"  # directory containing script
CURRENT_HOSTNAME=$(cat /etc/hostname)
# Find MAC of eth0, or if not exist wlan0
if [ -e /sys/class/net/eth0 ]; then
    MAC=$(cat /sys/class/net/eth0/address)
elif [ -e /sys/class/net/enx* ]; then
    MAC=$(cat /sys/class/net/enx*/address)
else
    MAC=$(cat /sys/class/net/wlan0/address)
fi

# NOTE the last 6 bytes of MAC and CPUID are identical
CPUID=$(awk '/Serial/ {print $3}' /proc/cpuinfo | sed 's/^0*//')
echo "Current Name" $CURRENT_HOSTNAME
echo "MAC" $MAC
# If you want to specify hostnames create a file PiNames.txt with MAC hostname list e.g.
# b8:27:eb:01:02:03 MyPi
# If not found a unique Name based on Serial number will be set
NEW_HOSTNAME=$(awk /$MAC/' {print $2}' $PDIR"/PiNames.txt")
echo "Name found" $NEW_HOSTNAME
if [ $NEW_HOSTNAME == "" ]; then
    NEW_HOSTNAME="pi"$CPUID
fi

if [ $NEW_HOSTNAME = $CURRENT_HOSTNAME ]; then
    echo "Name already set"
else
    echo "Setting Name" $NEW_HOSTNAME
    echo $NEW_HOSTNAME > /etc/hostname
    sed -i "/127.0.1.1/s/$CURRENT_HOSTNAME/$NEW_HOSTNAME/" /etc/hosts
fi
Milliways
la source
Bien sûr, les As et Zeros, sans connexion Ethernet, n'auront pas de MAC à utiliser! Un adaptateur WiFi le fera, mais le déplacement de l'adaptateur entre Pis signifie que l'ID unique suivra l'adaptateur!
SlySven
@SlySven Je n'ai pas de zéro (et je ne vois pas encore de raison valable), mais je devrais modifier mon script pour ignorer le MAC manquant. Je suppose qu'il n'y aura pas/sys/class/net/eth0/address
Milliways
Une autre façon d'identifier tout Pi est avec un identifiant unique est d'obtenir sa dbus machine id qui est l' interface ne dépend pas de cat /var/lib/dbus/machine-id lecture plus
Ripat
... j'ai oublié de créditer le lien "lire la suite" dans mon commentaire ci-dessus à son auteur: Lennart Poettering, le père de systemd.
ripat
2

S'il n'avait pas d'ID (ce qu'il a, comme il semble, voir la réponse de Ralph ), une alternative pourrait être une puce de numéro de série I2C. Ceux-ci sont vraiment faciles à connecter (interface série) et fournissent un numéro de série unique.

Quelques exemples:

  • Numéro de série de silicium I²C / SMBus de Maxim, par exemple DS2401, DS28CM00
  • Produits à puce d'identification unique de Microchip, par exemple 24AA02UID, 24AA025UID
  • EEPROM I²C auto-programmée
Ghanima
la source
Pourrait tout aussi bien utiliser une puce EEPROM I2C enchâssée et y programmer un identifiant unique. Les AT24C32 sont assez bon marché lorsqu'ils sont achetés en vrac.
Maxthon Chan