raspberry pi
我们都去过那里。 “我将试用Raspberry Pi 。它们看起来很酷。” 然后,就像企业上的小问题一样,您突然有了Kubernetes集群 , NFS服务器和Tor代理 。 甚至一个酒店预订系统 !
Pis盖在桌子上。 他们溅到地板上。 饭盒中安装的Raspberry Pi计算模块载板在架子上乱扔。
…或者也许就是我?
我敢打赌,如果您有一个Raspberry Pi,但是至少有两个,而天哪,它们看起来都一样。
这是我最近在测试在一个Raspberry Pi上设置的网络文件系统(NFS)服务器时发现的情况。 我需要插入USB硬盘驱动器,但是…哪一个? Ol'Lingonberry Pi是选定的主机,我被SSH接到了她,但是她是哪一个实际的物理 RPi? 没有办法知道...
还是在那里?
在上一份工作中,我有时会在数据中心的服务器上工作,其中一些服务器具有简洁的功能:服务器正面的ID按钮,按下该按钮时,服务器正面和背面的LED闪烁。 如果需要处理服务器的另一侧,则可以按ID按钮,然后沿着所有方式走到机架的另一侧,然后轻松找到合适的服务器。
Pis上没有任何按钮,但是有LED,经过Google的快速搜索后,我知道其中之一是可控的 。 提示狂笑。
要知道三个重要的方面。 首先,LED路径:在Raspberry Pis上,至少运行Ubuntu 20.04的那些LED,在/sys/class/leds/led0
可以找到前端(和用户可控制)的LED。 如果导航到该目录,则会发现它是指向其中包含许多文件的目录的符号链接。 两个重要文件是trigger
和brightness
。
trigger
文件控制什么使LED点亮。 如果你cat
这个文件,你会发现一个列表:
none usb-gadget usb-host rc-feedback rfkill-any
rfkill-none kbd-scrolllock kbd-numlock kbd-capslock
kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock
kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock
kbd-ctrlrlock timer oneshot disk-activity disk-read
disk-write ide-disk mtd nand-disk heartbeat backlight
gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic
mmc1 [mmc0] bluetooth-power rfkill0
unimac-mdio--19:01:link unimac-mdio--19:01:1Gbps
unimac-mdio--19:01:100Mbps unimac-mdio--19:01:10Mbps
括号中的项目表示触发LED的原因。 在上面的示例中,它是[mmc0]
-SD卡插入Raspberry Pi时的磁盘活动。 触发文件不是普通文件。 无需直接编辑,而是通过将触发器之一回显到文件中来更改触发器。
为了识别Lingonberry,我需要暂时禁用[mmc0]
触发器,以便使LED能够按我希望的方式工作。 在脚本中,我通过在触发器文件中回显“ none”来禁用所有触发器:
# You must be root to do this
$
echo none
> trigger
$
cat trigger
[ none
] usb-gadget usb-host rc-feedback rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot disk-activity disk-read disk-write ide-disk mtd nand-disk heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic mmc1 mmc0 bluetooth-power rfkill0 unimac-mdio--
19 :01:link unimac-mdio--
19 :01:1Gbps unimac-mdio--
19 :01:100Mbps unimac-mdio--
19 :01:10Mbps
在上面的触发器文件的内容中,您可以看到[none]
现在已成为选定的触发器。 现在,LED熄灭并且不闪烁。
接下来是brightness
文件。 您可以通过将0或1回显到文件中来控制LED是亮(1)还是灭(0)。 交替设置1和0将使LED闪烁,并且在中间睡眠一秒钟会产生规律的开/关闪烁,这与触发LED的任何活动不同。 这非常适合识别Raspberry Pi。
最后,如果不将触发器文件设置回触发器,它将保持关闭状态。 大多数情况下,这不是您想要的-最好查看磁盘活动。 这意味着您必须确保编写的任何脚本在触发器完成或中断时都会重置触发器。 这需要一个信号陷阱 。 陷阱将捕获SIGINT
或SIGTERM
(或其他)信号,并在退出之前执行一些代码。 这样,如果脚本被中断(例如,如果您按CTRL + C停止它),它仍然可以重置触发器。
有了这些新发现的知识,我就可以很快地敲出一个脚本(根据MIT许可证提供 ),并将其扔到我的Raspberry Pis上:
#!/bin/bash
set
-o errexit
set
-o nounset
trap quit INT TERM
COUNT =
0
if
!
[ $
(
id -u
) =
0
] ;
then
echo
"Must be run as root."
exit
1
fi
LED =
"/sys/class/leds/led0"
if
[
[
!
-d
$LED
]
]
then
echo
"Could not find an LED at ${LED} "
echo
"Perhaps try '/sys/class/leds/ACT'?"
exit
1
fi
function quit
(
)
{
echo mmc0
>
" ${LED} /trigger"
}
echo
-n
"Blinking Raspberry Pi's LED - press CTRL-C to quit"
echo none
>
" ${LED} /trigger"
while
true
do
let
"COUNT=COUNT+1"
if
[
[
$COUNT
-lt
30
]
]
then
echo
1
>
" ${LED} /brightness"
sleep
1
echo
0
>
" ${LED} /brightness"
sleep
1
else
quit
break
fi
done
该脚本检查LED控制目录是否存在,禁用[mmc0]
触发器,然后启动一个循环,使LED每秒闪烁一次。 它还包括一个陷阱,用于捕获INT
和TERM
信号并复位触发器。 我将此脚本复制到了我的所有Raspberry Pi上,并且每当需要标识其中一个时,我都运行它。 它可以很好地识别Ol'Lingonberry,因此我可以为NFS服务器设置磁盘,从那时起我已经使用了很多次。
需要注意的一件事-在其他发行版中,通往LED的路径可能有所不同。 /sys/class/leds
目录中还有其他LED,但是用户无法控制它们。 它们被连接到Raspberry Pi固件的不同位中。
您有任何酷Raspberry Pi技巧吗? 在评论中让我知道! 我一直很想了解别人对Pis的感染!
raspberry pi