Raspberry-Pi

在 Docker 容器中獲取 Raspi 的 CPU 溫度

  • June 14, 2022

我為我的 Raspberry Pi 4 建構了一個小的 ASP.NET Core 應用程序,它可以讓我控制風扇(請參見此處)。該應用程序部署為在我的 Raspi 裸機上執行的小型獨立 Linux 應用程序。

為了測量溫度,我打電話vcgencmd measure_temp給 Raspi,它給了我實際的溫度。

由於各種原因,我更喜歡在 Docker 容器中執行這個應用程序:

  • 在 Linux 中不再需要手動註冊服務,Docker 功能可以--restart-always處理這個問題。
  • 無需再從 GitHub 下載最新版本、提取應用程序並將其標記為執行檔。

但我不知道如何從容器中檢索 Raspi 的溫度。

我已經嘗試將 Raspi 的目錄映射到 Docker 容器中並從內部呼叫/usr/bin/-但由於缺少依賴項而失敗。 我已經在 Stack Overflow 上找到了一個答案,建議在 Raspi 上創建一個命名管道,然後從容器中使用這個管道。但是,如果我必須設置類似命名管道的東西,這會消除容器的美感。/opt/vc/bin/``vcgencmd

長話短說:有沒有辦法從 Docker 容器中獲取 Raspi 目前的 CPU 溫度?

謝謝!

如果我們只是安裝/opt/vc在一個容器內……

docker run -it --rm -v /opt/vc:/opt/vc debian:stretch /opt/vc/bin/vcgencmd measure_temp

…它失敗了:

/opt/vc/bin/vcgencmd: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory

我們在哪裡找到libvchiq_arm.so?我們可以用它ldd來找出:

$ ldd /opt/vc/bin/vcgencmd
       linux-vdso.so.1 (0x7efe7000)
       /usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0x76f79000)
       libvchiq_arm.so => /opt/vc/lib/libvchiq_arm.so (0x76f52000)
       libvcos.so => /opt/vc/lib/libvcos.so (0x76f39000)
       libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76f0f000)
       libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76efc000)
       librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x76ee5000)
       libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76d97000)
       /lib/ld-linux-armhf.so.3 (0x76f8e000)

這表明我們vcgencmd想要兩個可以在/opt/vc/lib. 這些在容器中可用,但容器環境不知道在/opt/vc/lib. 我們可以通過設置來解決這個問題LD_LIBRARY_PATH

docker run -it --rm -v /opt/vc:/opt/vc -e LD_LIBRARY_PATH=/opt/vc/lib debian:stretch /opt/vc/bin/vcgencmd measure_temp

失敗了:

VCHI initialization failed

太好了,我們已經解決了缺少庫的問題!我懷疑這vcgencmd是在尋找容器中不可用的設備。vcgencmd我們可以通過在受以下控制的主機上執行來弄清楚那是什麼strace

strace -o /tmp/trace  -f -s 80 /opt/vc/bin/vcgencmd measure_temp

現在我們尋找/devin /tmp/trace,我們發現:

6868  openat(AT_FDCWD, "/dev/vchiq", O_RDWR|O_LARGEFILE) = 3

所以我們需要暴露/dev/vchiq容器內部。我們可以通過以下--device選項做到這一點:

docker run -it --rm -v /opt:/opt -e LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq debian:stretch /opt/vc/bin/vcgencmd measure_temp

現在報告:

temp=69.3'C

我們已經成功地vcgencmd在一個容器內執行。

引用自:https://unix.stackexchange.com/questions/706170