ID de hardware do Raspberry Pi

22

Existe a possibilidade de armazenar um ID de hardware para cada dispositivo baseado em Raspberry Pi?

Digamos que eu tenha 10 dispositivos personalizados baseados na plataforma Raspberry Pi usados ​​para tarefas distribuídas. Em algum momento, por algum motivo, quero apagar tudo de um deles. Como posso identificar novamente o quadro depois disso?

O Pi possui um chip que armazena um ID exclusivo, como um número de série, para cada placa? Caso contrário, posso adicionar uma memória (somente leitura) (que pode armazenar um valor simples, mesmo quando não estiver ligado), para poder me comunicar com ela através do GPIO a qualquer momento?

Quais são as alternativas?

Alexandru Irimiea
fonte
Por favor, não faça uma pergunta e, com base na resposta, decida que você realmente deseja fazer ou tem outra pergunta. Isso desperdiça o tempo das pessoas que você está pedindo ajuda. Por esse motivo, revirei sua edição. Se você tiver outra pergunta, faça outra pergunta.
goldilocks
@ goldilocks: Você está correto. Eu deveria ter dividido esta pergunta em duas.
Alexandru Irimiea
E o 'ZERO'? nenhum endereço MAC aqui ... qualquer outro ID exclusivo?
fcm

Respostas:

23

Sim, cada placa possui um número de série. Os métodos para recuperar isso são descritos aqui: Como obtenho o número de série?

Ralph
fonte
Esta não é uma resposta completa, pois trata apenas do Linux e não menciona janelas. Seria interessante saber como fazê-lo no Windows também.
Andrew Savinykh
@ Savinykh ... linux e Mac OS. Awk, grep e cut são ferramentas disponíveis em ambos os sistemas operacionais, mas concordo que o Windows é deixado de fora, pois não possui essas ferramentas úteis de linha de comando.
ripat
9
Você não pode executar o Mac OS no Pi, então isso não é relevante. Você só pode executar a edição sem cabeça do Win10 IOT no Pi que acredito. Realisticamente, 99% dos usuários de Pi estão usando Linux.
Pjc50
@ ripat, você pode executar o Mac OS no raspberry pi embora? De alguma forma eu duvido.
Andrew Savinykh
6

A seguir, é mais fácil usar um: Endereço MAC via configuração automática NDP IPv6. Este é um método universal aplicável a qualquer interface de rede.

Cada placa de rede, incluindo a USB usada no Pi, tem um endereço MAC de 48 bits, por exemplo 14:cf:92:20:26:3c.

Cada endereço MAC de 48 bits possui um mapeamento um para um exclusivo para um endereço EUI-64, mascarando os dois últimos bits no terceiro byte ( 92para 90) e inserindo os bytes feffentre o terceiro e o quarto byte. A descrição acima de 48 bits MAC pode ser mapeado para o EUI-64: 14cf:90fe:ff20:263c.

O processo de configuração automática de endereço IPv6 usa o protocolo NDP para descobrir o endereço de rede de 64 bits no endereço de 128 bits. Esse processo concederá a todos os seus dispositivos na mesma rede o mesmo prefixo de 64 bits. O EUI-64 mencionado acima é usado para preencher o endereço da estação de 64 bits, resultando em um endereço IPv6 globalmente exclusivo de 128 bits. Portanto, se você tiver o prefixo de rede IPv6 2001:470:d:472::/64, a placa de rede mencionada acima, quando usada nesta rede, terá um endereço IPv6 roteável globalmente 2001:470:d:472:14cf:90fe:ff20:263c. Desde que sua ferramenta de gerenciamento esteja configurada para usar o IPv6, basta conectar esse endereço a ele e deve ser bom.

Maxthon Chan
fonte
esta é a melhor maneira de responder a essa pergunta na minha opinião. O MAC é único. você pode fazer um hash um pouco, se quiser, mas apenas confiar no endereço MAC pode ser feito em qualquer plataforma.
Havnar
@Havnar Melhor que isso, isso traduz o endereço MAC diretamente em um endereço IPv6 globalmente roteável que pode ser usado para enviar pacotes diretamente para o Pi (qualquer protocolo de camada de aplicativo, desde que funcione sobre o IPv6 que é a maioria deles, funcionará aqui)
Maxthon Chan
Não conheço muitas pessoas que realmente usam o ipv6 em casa ou na produção.
Havnar 19/02/16
@Havnar Implantei o túnel IPv6 na minha rede doméstica, a ponto de todos os dispositivos em minha casa, com exceção do próprio roteador, poderem funcionar sem o IPv4 ativado.
Maxthon Chan
5

Como na outra resposta, o Pi tem um ID exclusivo, relacionado ao MAC.

Na prática, é mais conveniente que a rede tenha um único hostname. Eu uso o seguinte script para definir os nomes com base 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
fonte
Porém, é claro que o As e o Zeros, sem uma conexão Ethernet, não terão um MAC para usar! Um adaptador WiFi funcionará, mas mover o adaptador entre Pis significará que o ID exclusivo seguirá o adaptador!
SlySven 4/16
@SlySven Eu não tenho um Zero (e ainda não consigo pensar em nenhum motivo válido), mas devo modificar meu script para ignorar a falta do MAC. Eu suponho que não haverá/sys/class/net/eth0/address
Milliways 4/16
Outra maneira de identificar qualquer Pi Com uma identificação única é fazer com que a sua máquina-id dbus que não é a interface dependente cat /var/lib/dbus/machine-id leitura mais
ripat
... esqueceu de creditar o link "leia mais" no meu comentário acima ao seu autor: Lennart Poettering, o pai do systemd.
ripat
2

Se não tivesse um ID (que, como parece, veja a resposta de Ralph ), uma alternativa poderia ser um chip de número de série I2C. Eles são realmente fáceis de conectar (interface serial) e fornecem um número de série exclusivo.

Alguns exemplos:

  • Número de série I²C / SMBus Silicon da Maxim, por exemplo, DS2401, DS28CM00
  • Produtos de chip de identificação exclusiva da Microchip, por exemplo, 24AA02UID, 24AA025UID
  • EEPROM I²C auto-programada
Ghanima
fonte
É melhor usar um chip I2C EEPROM com soquete e programar um ID exclusivo para ele. AT24C32 são relativamente baratos quando comprados a granel.
Maxthon Chan