是否可以为每个基于Raspberry Pi的设备存储硬件ID?
假设我有10个基于Raspberry Pi平台的自定义设备,用于分布式任务。在某种程度上,出于某种原因,我想删除其中之一。之后,我如何重新确定董事会?
Pi是否有芯片来存储每个板的唯一ID(如序列号)?如果没有,我是否可以添加一个(只读的)内存(即使不上电也可以存储一个简单的值),以便可以随时通过GPIO与之通信?
有哪些选择?
是否可以为每个基于Raspberry Pi的设备存储硬件ID?
假设我有10个基于Raspberry Pi平台的自定义设备,用于分布式任务。在某种程度上,出于某种原因,我想删除其中之一。之后,我如何重新确定董事会?
Pi是否有芯片来存储每个板的唯一ID(如序列号)?如果没有,我是否可以添加一个(只读的)内存(即使不上电也可以存储一个简单的值),以便可以随时通过GPIO与之通信?
有哪些选择?
Answers:
是的,每个板都有序列号。此处描述了检索方法: 如何获得序列号?
这是一个更易于使用的方法:通过IPv6 NDP自动配置的MAC地址。这是适用于任何网络接口的通用方法。
每个NIC(包括Pi上使用的USB NIC)都有一个48位MAC地址,例如14:cf:92:20:26:3c
。
每个48位MAC地址通过屏蔽第三个字节(92
to 90
)的最后两位并将字节插入feff
第三个和第四个字节之间,具有唯一的一对一映射到EUI-64地址。上述48位MAC可以被映射到EUI-64: 14cf:90fe:ff20:263c
。
IPv6地址自动配置过程使用NDP协议在128位地址中发现64位网络地址。此过程将为同一网络中的所有设备提供相同的64位前缀。前面提到的EUI-64用于填充64位站地址,从而生成128位全局唯一的IPv6地址。因此,如果您具有IPv6网络前缀2001:470:d:472::/64
,则上述的网卡在该网络中使用时,将被保证具有IPv6全局可路由地址2001:470:d:472:14cf:90fe:ff20:263c
。只要将您的管理工具配置为使用IPv6,只需将此地址插入其中,就可以了。
与其他答案一样,Pi具有唯一的ID,该ID与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
/sys/class/net/eth0/address
如果它没有ID(看起来像Ralph的答案一样),则可以选择I2C序列号芯片。它们非常易于连接(串行接口)并提供唯一的序列号。
一些例子: