ID de hardware de Raspberry Pi

22

¿Existe la posibilidad de almacenar una identificación de hardware para cada dispositivo basado en Raspberry Pi?

Digamos que tengo 10 dispositivos personalizados basados ​​en la plataforma Raspberry Pi que se utilizan para tareas distribuidas. En algún momento, por alguna razón, quiero borrar todo de uno de ellos. ¿Cómo puedo volver a identificar el tablero después de eso?

¿Pi tiene un chip que almacena una identificación única como un número de serie para cada placa? Si no es así, ¿puedo agregar una memoria (de solo lectura) (que puede almacenar un valor simple incluso cuando no está encendida) para poder comunicarme a través de GPIO en cualquier momento?

Cuales son las alternativas?

Alexandru Irimiea
fuente
Por favor, no haga una pregunta, luego, sobre la base de la respuesta, decida que realmente desea hacer o tener otra pregunta. Esto desperdicia el tiempo de las personas a las que solicita ayuda. Por esta razón, he revertido su edición. Si tiene otra pregunta, haga otra pregunta.
Ricitos de oro
@goldilocks: tienes razón. Debería haber dividido esta pregunta en dos.
Alexandru Irimiea
¿Qué hay de 'CERO'? sin dirección MAC aquí ... ¿alguna otra identificación única?
fcm

Respuestas:

23

Sí, cada placa tiene un número de serie. Los métodos para recuperar esto se describen aquí: ¿Cómo obtengo el número de serie?

Ralph
fuente
Esta no es una respuesta completa, ya que solo trata con Linux y no menciona ventanas en absoluto. Sería interesante saber cómo hacerlo también en Windows.
Andrew Savinykh
@Savinykh ... Linux y Mac OS. Awk, grep y cut son herramientas disponibles en ambos SO, pero estoy de acuerdo en que Windows se omite ya que carece de estas prácticas herramientas de línea de comandos.
Ripat
99
No puede ejecutar Mac OS en Pi, por lo que no es relevante. Solo puedo ejecutar la edición Win10 IOT sin cabeza en el Pi, creo. Siendo realistas, el 99% de los usuarios de Pi están usando Linux.
pjc50
@ripat, ¿puedes ejecutar Mac OS en Raspberry Pi? De alguna manera lo dudo.
Andrew Savinykh
6

Aquí hay uno más fácil de usar: dirección MAC a través de la configuración automática de IPv6 NDP. Este es un método universal que se aplica a cualquier interfaz de red.

Cada NIC, incluido el USB utilizado en el Pi, tiene una dirección MAC de 48 bits, por ejemplo 14:cf:92:20:26:3c.

Cada dirección MAC de 48 bits tiene una asignación única de uno a uno a una dirección EUI-64 enmascarando los dos últimos bits en el tercer byte ( 92a 90) e inserta los bytesfeff entre el tercer y el cuarto byte. El antes mencionado de 48 bits MAC se puede asignar a la EUI-64: 14cf:90fe:ff20:263c.

El proceso de configuración automática de la dirección IPv6 utiliza el protocolo NDP para descubrir la dirección de red de 64 bits en la dirección de 128 bits. Este proceso le dará a todos sus dispositivos dentro de la misma red el mismo prefijo de 64 bits. El mencionado EUI-64 se utiliza para completar la dirección de la estación de 64 bits, lo que da como resultado una dirección IPv6 global de 128 bits. Entonces, si tiene el prefijo de red IPv6 2001:470:d:472::/64, la tarjeta de red mencionada anteriormente, cuando se use en esta red, tendrá una dirección IPv6 globalmente enrutable 2001:470:d:472:14cf:90fe:ff20:263c. Mientras su herramienta de administración esté configurada para usar IPv6, simplemente conecte esta dirección y debería estar lista.

Maxthon Chan
fuente
Esta es la mejor manera de responder esta pregunta en mi opinión. MAC es único. puede analizarlo un poco si lo desea, pero solo puede confiar en la dirección MAC en cualquier plataforma.
Havnar
@Havnar Mejor que eso, esto traduce la dirección MAC directamente en una dirección IPv6 enrutable globalmente que se puede usar para enviar paquetes directamente a Pi (cualquier protocolo de capa de aplicación, siempre que funcione sobre IPv6, que es la mayoría de ellos, funcionará aquí)
Maxthon Chan
No conozco a muchas personas que realmente usan ipv6 en casa o en producción.
Havnar
@Havnar He implementado el túnel IPv6 en mi red doméstica hasta el punto de que todos los dispositivos dentro de mi hogar, con la excepción del enrutador mismo, pueden funcionar sin IPv4 habilitado.
Maxthon Chan
5

Como en la otra respuesta, el Pi tiene una identificación única, que está relacionada con el MAC.

En la práctica, es más conveniente que las redes tengan un carácter único hostname. Utilizo el siguiente script para establecer los nombres en función de 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
fuente
Aunque, por supuesto, los As y los Ceros, sin una conexión Ethernet, ¡no tendrán un MAC para usar! Un adaptador WiFi lo hará, pero mover el adaptador entre Pis significará que la identificación única seguirá al adaptador.
SlySven
@SlySven No tengo un cero (y aún no se me ocurre ninguna razón válida), pero debería modificar mi script para ignorar la falta de MAC. Supongo que no habrá/sys/class/net/eth0/address
Milliways
Otra forma de identificar ninguna de Pi con un identificador único es conseguir su máquina de dbus-id que no depende de una interfaz cat /var/lib/dbus/machine-id de lectura más
ripat
... olvidé acreditar el enlace "leer más" en mi comentario anterior a su autor: Lennart Poettering, el padre de systemd.
ripat
2

Si no tuviera una identificación (que tiene, como parece, ver la respuesta de Ralph ), una alternativa podría ser un chip de número de serie I2C. Esos son realmente fáciles de conectar (interfaz en serie) y proporcionan un número de serie único.

Algunos ejemplos:

  • Número de serie de silicio I²C / SMBus de Maxim, p. Ej. DS2401, DS28CM00
  • Productos de chip de identificación únicos de Microchip, por ejemplo, 24AA02UID, 24AA025UID
  • EEPROM I²C autoprogramada
Ghanima
fuente
También podría usar un chip EEPROM I2C enchufable y programar una identificación única en eso. AT24C32 son bastante baratos cuando se compran a granel.
Maxthon Chan