Himbeer-Pi-Hardware-ID

22

Gibt es eine Möglichkeit, eine Hardware-ID für jedes Raspberry Pi-basierte Gerät zu speichern?

Angenommen, ich habe 10 benutzerdefinierte Geräte auf Basis der Raspberry Pi-Plattform, die für verteilte Aufgaben verwendet werden. Irgendwann möchte ich aus irgendeinem Grund alles von einem von ihnen löschen. Wie kann ich das Board danach neu identifizieren?

Hat Pi einen Chip, der eine eindeutige ID wie eine Seriennummer für jede Karte speichert? Wenn nicht, kann ich einen (schreibgeschützten) Speicher hinzufügen (in dem ein einfacher Wert gespeichert werden kann, auch wenn er nicht mit Strom versorgt wird), um jederzeit über GPIO mit ihm kommunizieren zu können?

Was sind die Alternativen?

Alexandru Irimiea
quelle
Bitte stellen Sie keine Frage und entscheiden Sie dann anhand der Antwort, ob Sie wirklich eine Frage stellen möchten oder eine andere haben. Dies verschwendet die Zeit der Leute, die Sie um Hilfe bitten. Aus diesem Grund habe ich Ihre Bearbeitung zurückgesetzt. Wenn Sie eine andere Frage haben, stellen Sie eine andere Frage.
Goldlöckchen
@ Goldilocks: Sie sind richtig. Ich hätte diese Frage in zwei Teile teilen sollen.
Alexandru Irimiea
Was ist mit 'ZERO'? Keine MAC-Adresse hier ... irgendeine andere eindeutige ID?
fcm

Antworten:

23

Ja, jede Karte hat eine Seriennummer. Methoden, um dies abzurufen, werden hier beschrieben: Wie erhalte ich die Seriennummer?

Ralph
quelle
Dies ist keine vollständige Antwort, da es sich nur um Linux handelt und Windows überhaupt nicht erwähnt. Es wäre interessant zu wissen, wie dies auch unter Windows funktioniert.
Andrew Savinykh
@ Savinykh ... Linux und Mac OS. Awk, grep und cut sind Tools, die auf beiden Betriebssystemen verfügbar sind, aber ich stimme zu, dass Windows ausgelassen wird, da diese praktischen Befehlszeilen-Tools fehlen.
Ripat
9
Sie können Mac OS nicht auf dem Pi ausführen, das ist also nicht relevant. Ich glaube, Sie können die kopflose Win10 IOT-Edition nur auf dem Pi ausführen. Realistisch gesehen verwenden 99% der Pi-Benutzer Linux.
pjc50
@ Ripat, können Sie Mac OS auf Himbeer-Pi obwohl ausführen? Ich bezweifle es irgendwie.
Andrew Savinykh
6

Dies ist eine einfachere Methode: MAC-Adresse über die automatische IPv6-NDP-Konfiguration. Dies ist eine universelle Methode, die auf jede Netzwerkschnittstelle anwendbar ist.

Jede Netzwerkkarte, einschließlich der auf dem Pi verwendeten USB-Karte, verfügt beispielsweise über eine 48-Bit-MAC-Adresse 14:cf:92:20:26:3c.

Jede 48-Bit-MAC-Adresse verfügt über eine eindeutige Eins-zu-Eins-Zuordnung zu einer EUI-64-Adresse, indem die letzten beiden Bits im dritten Byte ( 92bis 90) ausgeblendet und die Bytes feffzwischen dem dritten und vierten Byte eingefügt werden. Die zuvor erwähnte 48-Bit - MAC kann auf die EUI-64 abgebildet werden: 14cf:90fe:ff20:263c.

Der automatische IPv6-Adresskonfigurationsprozess verwendet das NDP-Protokoll, um die 64-Bit-Netzwerkadresse in der 128-Bit-Adresse zu ermitteln. Durch diesen Vorgang erhalten alle Geräte im selben Netzwerk dasselbe 64-Bit-Präfix. Das oben erwähnte EUI-64 wird zum Auffüllen der 64-Bit-Stationsadresse verwendet, was zu einer global eindeutigen 128-Bit-IPv6-Adresse führt. Wenn Sie also das IPv6-Netzwerkpräfix haben 2001:470:d:472::/64, wird der oben genannten Netzwerkkarte bei Verwendung in diesem Netzwerk eine global routbare IPv6-Adresse garantiert 2001:470:d:472:14cf:90fe:ff20:263c. Solange Ihr Management-Tool für die Verwendung von IPv6 konfiguriert ist, schließen Sie diese Adresse einfach an und schon kann es losgehen.

Maxthon Chan
quelle
Dies ist meiner Meinung nach die bessere Möglichkeit, diese Frage zu beantworten. MAC ist einzigartig. Sie können es ein wenig hacken, wenn Sie möchten, aber Sie können sich auf jeder Plattform auf die MAC-Adresse verlassen.
Havnar
@ Havnar Besser als das, dies übersetzt die MAC-Adresse direkt in eine global routbare IPv6-Adresse, die zum direkten Senden von Paketen an den Pi verwendet werden kann hier)
Maxthon Chan
Ich kenne nicht viele Leute, die ipv6 tatsächlich zu Hause oder in der Produktion verwenden.
Havnar
@ Havnar Ich habe einen IPv6-Tunnel in meinem Heimnetzwerk bereitgestellt, sodass alle Geräte in meinem Heimnetzwerk mit Ausnahme des Routers ohne IPv4-Aktivierung funktionieren können.
Maxthon Chan
5

Wie in der anderen Antwort hat der Pi eine eindeutige ID, die sich auf den MAC bezieht.

In der Praxis ist es für die Vernetzung praktischer, ein eindeutiges Merkmal zu haben hostname. Ich benutze das folgende Skript, um die Namen basierend auf festzulegen 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
quelle
Natürlich haben die As und Zeros ohne Ethernet-Verbindung keinen MAC, der verwendet werden kann! Ein WiFi-Adapter wird, aber das Verschieben des Adapters zwischen Pis bedeutet, dass die eindeutige ID dem Adapter folgt!
SlySven
@SlySven Ich habe keine Null (und kann mir noch keinen gültigen Grund vorstellen), aber ich sollte mein Skript so ändern, dass fehlende MACs ignoriert werden. Ich nehme an, es wird keine/sys/class/net/eth0/address
Milliways
Eine andere Möglichkeit, Pi's mit einer eindeutigen ID zu identifizieren, besteht darin, ihre nicht schnittstellenabhängige dbus-Maschinen-ID cat /var/lib/dbus/machine-id
abzurufen.
... habe vergessen, den "read more" -Link in meinem obigen Kommentar seinem Autor zuzuschreiben: Lennart Poettering, dem Vater von systemd.
Ripat
2

Wenn es keine ID hätte (die, wie es scheint, Ralphs Antwort zeigt ), könnte eine Alternative ein I2C-Seriennummer-Chip sein. Diese sind sehr einfach anzuschließen (serielle Schnittstelle) und geben eine eindeutige Seriennummer an.

Einige Beispiele:

  • Maxim I²C / SMBus-Silizium-Seriennummer, z. B. DS2401, DS28CM00
  • Die einzigartigen ID-Chip-Produkte von Microchip, z. B. 24AA02UID, 24AA025UID
  • Selbstprogrammiertes I²C-EEPROM
Ghanima
quelle
Verwenden Sie auch einfach einen I2C-EEPROM-Chip mit Sockel und programmieren Sie eine eindeutige ID in diesen. AT24C32 sind ziemlich billig, wenn sie in loser Schüttung gekauft werden.
Maxthon Chan