Ідентифікатор апаратури Raspberry Pi


22

Чи є можливість зберігати ідентифікатор обладнання для кожного пристрою на основі Raspberry Pi?

Скажімо, у мене є 10 користувацьких пристроїв на базі платформи Raspberry Pi, які використовуються для розподілених завдань. У якийсь момент я чомусь хочу стерти все з одного з них. Як я можу повторно визначити дошку після цього?

Чи має Pi чіп, який зберігає унікальний ідентифікатор, як серійний номер для кожної плати? Якщо ні, чи можу я додати пам'ять (лише для читання) (яка може зберігати просте значення, навіть коли вона не працює), щоб мати можливість спілкуватися з нею через GPIO в будь-який час?

Які альтернативи?


Будь ласка, не задайте питання, то на основі відповіді вирішіть, що ви дійсно хотіли задати, або маєте інше питання. Це витрачає час людей, яких ви просите про допомогу. З цієї причини я відкрутив вашу редакцію назад. Якщо у вас є інше питання, поставте інше питання.
goldilocks

@goldilocks: Ви маєте рацію. Я мав би розділити це питання надвоє.
Олександру Ірімею

Що з "ZERO"? тут немає MAC-адреси ... будь-який інший унікальний ідентифікатор?
fcm

Відповіді:


23

Так, на кожній дошці є порядковий номер. Способи її отримання описані тут: Як отримати серійний номер?


Це не є повною відповіддю, оскільки він стосується лише Linux і зовсім не згадує про Windows. Було б цікаво знати, як це зробити і на Windows.
Андрій Савіних

@Savinykh ... Linux та Mac OS. Awk, grep and cut - це інструменти, доступні для обох ОС, але я погоджуюсь, що Windows залишається осторонь, оскільки не вистачає цих зручних інструментів командного рядка.
ripat

9
Ви не можете запустити Mac OS на Pi, тому це не актуально. Ви можете запустити безголову версію Win10 IOT на Pi I believe. Реально 99% користувачів Pi використовують Linux.
pjc50

@ripat, чи можна запустити Mac OS на малиновому пі? Я якось сумніваюся в цьому.
Андрій Савіних

6

Ось простіший у використанні: MAC-адреса через автоматичну конфігурацію IPv6 NDP. Це універсальний метод, застосовний до будь-якого мережевого інтерфейсу.

Кожен NIC, включаючи USB, який використовується на Pi, має, наприклад, 48-бітну MAC-адресу 14:cf:92:20:26:3c.

Кожна 48-розрядна MAC-адреса має унікальне відображення "один на один" на адресу EUI-64, маскуючи останні два біти в третьому байті ( 92до 90) і вставляючи байти feffміж третім і четвертим байтом. Вище 48-бітові МАС можуть бути відображені в EUI-64: 14cf:90fe:ff20:263c.

Процес автоматичного налаштування адреси IPv6 використовує протокол NDP для виявлення 64-бітної мережевої адреси в 128-бітній адресі. Цей процес дасть всім вашим пристроям в одній мережі однаковий 64-бітний префікс. Вищезгаданий EUI-64 використовується для заповнення 64-бітної адреси станції, в результаті чого 128-бітна глобально унікальна IPv6-адреса. Отже, якщо у вас є мережний префікс IPv6 2001:470:d:472::/64, вищезгадана мережева карта при використанні в цій мережі гарантовано матиме IPv6 глобальну маршрутизовану адресу 2001:470:d:472:14cf:90fe:ff20:263c. Поки ваш інструмент управління налаштований на використання IPv6, просто підключіть цю адресу до нього, і це має бути добре.


це кращий спосіб відповісти на це питання, на мою думку. MAC унікальний. Ви можете трохи зафіксувати його, якщо хочете, але просто покладаючись на MAC-адресу можна зробити на будь-якій платформі.
Гавнар

@Havnar Краще, ніж це, це переводить MAC-адресу безпосередньо в глобально маршрутизовану IPv6-адресу, яку можна використовувати для надсилання пакетів на Pi безпосередньо (будь-який протокол рівня додатків, якщо він працює над IPv6, який є більшістю з них, буде працювати тут)
Maxthon Chan

Я не знаю багатьох людей, які насправді використовують ipv6 вдома або у виробництві.
Хавнар

@Havnar Я розгорнув тунель IPv6 у своїй домашній мережі до того, що всі пристрої в моєму будинку, за винятком самого маршрутизатора, можуть функціонувати без включення IPv4.
Макшон Чан

5

Як і в іншій відповіді, Pi має унікальний ідентифікатор, який пов'язаний з MAC.

На практиці для мереж зручніше мати унікальний hostname. Я використовую наступний сценарій для встановлення імен на основі 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

Хоча, звичайно, As і Zeros, без підключення до Ethernet, не матимуть MAC від цього! WiFi адаптер буде, але переміщення адаптера між Pis означатиме, що за адаптером буде слідувати унікальний ідентифікатор!
SlySven

@SlySven У мене немає нуля (і досі не можу припустити жодної вагомої причини), але я повинен змінити свій сценарій, щоб ігнорувати відсутні MAC. Я припускаю, що цього не буде/sys/class/net/eth0/address
Milliways

Ще один спосіб ідентифікувати будь-який Pi з унікальним ідентифікатором - це отримати його dbus machine-id, який не залежить від інтерфейсу. cat /var/lib/dbus/machine-id Читайте більше
ripat

... забув зарахувати посилання "читати більше" у своєму коментарі вище своєму автору: Леннарт Поеттерінг, батько системд.
ripat

2

Якщо у нього не буде ідентифікатора (який, як здавалося б, див . Відповідь Ральфа ), альтернативою може бути мікросхем серійного номера I2C. Вони справді прості для підключення (серійний інтерфейс) та надають унікальний серійний номер.

Деякі приклади:

  • Серійний номер кремнію I²C / SMBus Maxim, наприклад DS2401, DS28CM00
  • Унікальні мікросхеми Microchip, наприклад, 24AA02UID, 24AA025UID
  • самопрограмований I²C EEPROM

Можна також просто використовувати розетку I2C EEPROM чип і запрограмувати в ньому унікальний ідентифікатор. AT24C32 коштують досить дешево, купуючи оптом.
Макшон Чан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.