树莓派5运行Blinkt LED Docker容器时GPIO寄存器映射失败求助
问题描述
我有一个Docker容器,用于在配备Blinkt LED的节点上显示Kubernetes集群的CPU负载,该容器在Raspberry Pi 3B和4上运行正常,但在Raspberry Pi 5启动时出现如下错误:
Traceback (most recent call last): File "//./cpuload.py", line 33, in <module> blinkt.show() File "/usr/local/lib/python3.9/dist-packages/blinkt.py", line 76, in show GPIO.setup(DAT, GPIO.OUT) RuntimeError: Mmap of GPIO registers failed
以下是在树莓派4上可用的Dockerfile:
FROM balenalib/raspberrypi4-64-debian-node RUN apt-get update -qy && apt-get install -qy \ gcc \ python3-dev \ pip \ python3 \ python3-rpi.gpio RUN pip install --upgrade pip setuptools RUN pip install psutil blinkt COPY src/ . CMD [ "python3", "./cpuload.py" ]
cpuload.py的Python代码如下:
#!/usr/bin/env python import time import os.path import signal from os import path from sys import exit def sigterm_handler( _signo, _stak_frame ): for x in range(blinkt.NUM_PIXELS): blinkt.set_pixel(x, 0, 0, 0) sys.exit(0) signal.signal(signal.SIGTERM, sigterm_handler) try: import psutil except ImportError: exit("This script requires the psutil module\nInstall with: sudo pip install psutil") try: import blinkt except ImportError: exit("This script requires the blinkt module\nInstall with: sudo pip install blinkt") blinkt.set_clear_on_exit() blinkt.set_brightness(0.2) while True: for x in range(blinkt.NUM_PIXELS): blinkt.set_pixel(x, 0, 0, 0) blinkt.show() if path.exists("/home/pi/.BLINK"): v = psutil.cpu_percent() / 100.0 if v > 0.11 or (v > 0 and v < 0.11): blinkt.set_brightness(0.1) blinkt.set_pixel(0, 0, 128, 0) if v > 0.22 or (v > 0.11 and v < 0.22): blinkt.set_brightness(0.2) blinkt.set_pixel(1, 0, 128, 0) if v > 0.33 or (v > 0.22 and v < 0.33): blinkt.set_brightness(0.3) blinkt.set_pixel(2, 0, 128, 0) if v > 0.44 or (v > 0.33 and v < 0.44): blinkt.set_brightness(0.4) blinkt.set_pixel(3, 255, 215, 0) if v > 0.55 or (v > 0.44 and v < 0.55): blinkt.set_brightness(0.5) blinkt.set_pixel(4, 255, 215, 0) if v > 0.66 or (v > 0.55 and v < 0.66): blinkt.set_brightness(0.6) blinkt.set_pixel(5, 255, 215, 0) if v > 0.77 or (v > 0.66 and v < 0.77): blinkt.set_brightness(0.7) blinkt.set_pixel(6, 255, 0, 0) if v > 0.88: blinkt.set_brightness(0.8) blinkt.set_pixel(7, 255, 0, 0) blinkt.show() time.sleep(0.01)
我了解到树莓派5的GPIO有一些变化,但不确定如何修复,是否需要更换Python GPIO库?
解决方案
核心原因
Raspberry Pi 5采用了新的RP1芯片负责GPIO、SPI等外设,旧的python3-rpi.gpio库不兼容该硬件架构,无法完成GPIO寄存器映射,从而触发Mmap of GPIO registers failed错误。
具体修复步骤
更换适配RPi5的基础镜像
将Dockerfile的基础镜像替换为支持Raspberry Pi 5的版本,比如balenalib/raspberrypi5-64-debian-node,确保系统层适配新硬件。替换GPIO库
移除旧的python3-rpi.gpio,改用官方推荐的兼容RP1芯片的python3-lgpio库。更新Dockerfile
修改后的Dockerfile如下:FROM balenalib/raspberrypi5-64-debian-node RUN apt-get update -qy && apt-get install -qy \ gcc \ python3-dev \ pip \ python3 \ python3-lgpio RUN pip install --upgrade pip setuptools RUN pip install psutil blinkt COPY src/ . CMD [ "python3", "./cpuload.py" ]调整代码兼容性
- Blinkt库默认依赖
RPi.GPIO,需要强制它使用lgpio,在代码开头(导入blinkt之前)添加以下代码:# 强制blinkt使用lgpio替代RPi.GPIO import os os.environ['BLINKT_GPIO_LIBRARY'] = 'lgpio' - 原代码的
sigterm_handler函数未导入sys且未执行blinkt.show(),会导致LED无法正常清空,补充修改如下:import sys # 补充导入sys模块 def sigterm_handler( _signo, _stak_frame ): for x in range(blinkt.NUM_PIXELS): blinkt.set_pixel(x, 0, 0, 0) blinkt.show() # 确保LED状态被更新 sys.exit(0)
- Blinkt库默认依赖
赋予容器GPIO访问权限
启动容器时需添加--privileged参数,或者挂载/dev/gpiomem设备,确保容器有权限访问GPIO硬件:docker run --privileged your-image-tag
验证
重新构建镜像并在Raspberry Pi 5上运行,LED应能正常根据CPU负载显示对应状态。
内容的提问来源于stack exchange,提问作者techguy993
相关产品推荐
相关产品推荐

