Identyfikator sprzętu Raspberry Pi

22

Czy istnieje możliwość przechowywania identyfikatora sprzętowego dla każdego urządzenia opartego na Raspberry Pi?

Załóżmy, że mam 10 niestandardowych urządzeń opartych na platformie Raspberry Pi, które są używane do zadań rozproszonych. W pewnym momencie, z jakiegoś powodu, chcę usunąć wszystko z jednego z nich. Jak mogę później ponownie zidentyfikować tablicę?

Czy Pi ma układ, który przechowuje unikalny identyfikator, taki jak numer seryjny dla każdej płyty? Jeśli nie, to czy mogę dodać pamięć (tylko do odczytu) (która może przechowywać prostą wartość, nawet gdy nie jest zasilana), aby móc się z nią komunikować przez GPIO w dowolnym momencie?

Jakie są alternatywy?

Alexandru Irimiea
źródło
Nie zadawaj pytania, a następnie na podstawie odpowiedzi zdecyduj, że naprawdę chciałeś zadać lub mieć inne pytanie. To marnuje czas ludzi, których prosisz o pomoc. Z tego powodu cofnąłem twoją edycję. Jeśli masz inne pytanie, zadaj kolejne pytanie.
goldilocks
@goldilocks: Masz rację. Powinienem podzielić to pytanie na dwie części.
Alexandru Irimiea
Co z „ZERO”? nie ma tutaj adresu MAC ... inny unikalny identyfikator?
fcm

Odpowiedzi:

23

Tak, każda płytka ma numer seryjny. Metody uzyskania tego są opisane tutaj: Jak uzyskać numer seryjny?

Ralph
źródło
To nie jest pełna odpowiedź, ponieważ dotyczy tylko Linuksa i w ogóle nie wspomina o systemie Windows. Interesujące byłoby wiedzieć, jak to zrobić również w systemie Windows.
Andrew Savinykh
@Savinykh ... Linux i Mac OS. Awk, grep i cut są narzędziami dostępnymi w obu systemach operacyjnych, ale zgadzam się, że Windows został pominięty, ponieważ brakuje tych przydatnych narzędzi wiersza poleceń.
ripat
9
Nie można uruchomić Mac OS na Pi, więc to nie ma znaczenia. Wierzę, że można uruchomić bezgłową wersję Win10 IOT na Pi. Realistycznie 99% użytkowników Pi korzysta z Linuksa.
pjc50
@ripat, czy możesz jednak uruchomić system Mac OS na Raspberry Pi? Jakoś w to wątpię.
Andrew Savinykh
6

Oto łatwiejszy w użyciu: adres MAC za pomocą automatycznej konfiguracji NDP protokołu IPv6. Jest to uniwersalna metoda, która ma zastosowanie do dowolnego interfejsu sieciowego.

Każda karta sieciowa, w tym USB używana w Pi, ma na przykład 48-bitowy adres MAC 14:cf:92:20:26:3c.

Każdy 48-bitowy adres MAC ma unikalne mapowanie jeden na jeden na adres EUI-64 poprzez maskowanie dwóch ostatnich bitów w trzecim bajcie ( 92do 90) i wstawienie bajtów feffmiędzy trzecim a czwartym bajtem. Wspomniany 48-bitowego adresu MAC może być odwzorowywane EUI-64: 14cf:90fe:ff20:263c.

Proces automatycznej konfiguracji adresu IPv6 wykorzystuje protokół NDP do wykrycia 64-bitowego adresu sieciowego w adresie 128-bitowym. Ten proces da wszystkim urządzeniom w tej samej sieci ten sam 64-bitowy prefiks. Wyżej wymieniony EUI-64 służy do zapełniania 64-bitowego adresu stacji, co daje 128-bitowy globalnie unikalny adres IPv6. Jeśli więc masz prefiks sieci IPv6 2001:470:d:472::/64, wspomniana karta sieciowa, jeśli zostanie użyta w tej sieci, będzie mieć globalny adres routowany przez IPv6 2001:470:d:472:14cf:90fe:ff20:263c. Tak długo, jak twoje narzędzie do zarządzania jest skonfigurowane do korzystania z IPv6, po prostu podłącz do niego ten adres i powinno być dobrze.

Maxthon Chan
źródło
według mnie jest to lepszy sposób na odpowiedź na to pytanie. MAC jest unikalny. jeśli chcesz, możesz go trochę zaszyfrować, ale poleganie na adresie MAC można wykonać na dowolnej platformie.
Havnar,
@Havnar Co więcej, to przekłada adres MAC bezpośrednio na globalnie rutowalny adres IPv6, którego można używać do wysyłania pakietów bezpośrednio do Pi (dowolny protokół warstwy aplikacji, o ile działa na IPv6, który jest większość z nich, będzie działał tutaj)
Maxthon Chan,
Nie znam wielu ludzi, którzy faktycznie używają ipv6 w domu lub w produkcji.
Havnar,
@Havnar Wdrożyłem tunel IPv6 w mojej sieci domowej do tego stopnia, że ​​wszystkie urządzenia w moim domu, z wyjątkiem samego routera, mogą działać bez włączonego IPv4.
Maxthon Chan,
5

Podobnie jak w drugiej odpowiedzi Pi ma unikalny identyfikator, który jest powiązany z MAC.

W praktyce wygodniej jest mieć w sieci unikalność hostname. Używam następującego skryptu, aby ustawić nazwy na podstawie 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
źródło
Chociaż oczywiście As i Zeros, bez połączenia Ethernet, nie będą miały z tego MAC! Adapter WiFi będzie, ale przeniesienie adaptera między Pis spowoduje, że unikalny identyfikator będzie podążał za adapterem!
SlySven
@SlySven Nie mam wartości zero (i nie mogę wymyślić żadnego ważnego powodu), ale powinienem zmodyfikować skrypt, aby zignorować brakujący adres MAC. Zakładam, że nie będzie/sys/class/net/eth0/address
Milliways
Innym sposobem na identyfikację dowolnego Pi z unikalnym identyfikatorem jest uzyskanie identyfikatora maszyny dbus, który nie zależy od interfejsu cat /var/lib/dbus/machine-id czytaj więcej
ripat
... zapomniałem przypisać link „czytaj więcej” w moim komentarzu powyżej autorowi: Lennartowi Poetteringowi, ojcu systemd.
ripat
2

Jeśli nie miałby identyfikatora (który, jak się wydaje, widzi odpowiedź Ralpha ), alternatywą może być układ z numerem seryjnym I2C. Są one naprawdę łatwe do podłączenia (interfejs szeregowy) i zapewniają unikalny numer seryjny.

Kilka przykładów:

  • Numer seryjny krzemu I²C / SMBus Maxima, np. DS2401, DS28CM00
  • Unikalne produkty Microchip, np. 24AA02UID, 24AA025UID
  • EEPROM z programowaniem I²C
Ghanima
źródło
Równie dobrze można użyć gniazdowego układu EEPROM I2C i zaprogramować w nim unikalny identyfikator. AT24C32 są dość tanie przy zakupie hurtowym.
Maxthon Chan,