저는 팬을 제어할 수 있는 Raspberry Pi 4용 작은 ASP.NET Core 앱을 구축했습니다(이봐). 이 애플리케이션은 Raspi 베어메탈에서 실행되는 작은 독립형 Linux 애플리케이션으로 배포됩니다.
온도를 측정하기 위해 vcgencmd measure_temp
Raspi에 전화했더니 실제 온도가 나왔습니다.
나는 다양한 이유로 이 애플리케이션을 Docker 컨테이너에서 실행하는 것을 선호합니다.
- Linux에서는 더 이상 수동 서비스 등록이 필요하지 않으며 Docker 기능이
--restart-always
이를 처리합니다. - 더 이상 GitHub에서 최신 버전을 다운로드하고, 애플리케이션을 추출하고, 실행 파일로 표시할 필요가 없습니다.
하지만 컨테이너 내부에서 Raspi의 온도를 검색하는 방법을 모르겠습니다.
Raspi의 디렉터리를 Docker 컨테이너 /usr/bin/
에 매핑하고 내부에서 호출하려고 시도했지만 종속성이 누락되어 실패했습니다. Raspi에서 명명된 파이프를 만든 다음 컨테이너 내에서 해당 파이프를 사용하도록 제안하는 Stack Overflow의 답변을 찾았습니다. 하지만 굳이 네임드 파이프 같은 것을 설치하게 되면 컨테이너의 아름다움을 앗아가게 됩니다./opt/vc/bin/
vcgencmd
간단히 말해서: Docker 컨테이너 내부에서 Raspi의 현재 CPU 온도를 얻을 수 있는 방법이 있습니까?
감사해요!
답변1
/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
/dev
이제 검색하여 /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
컨테이너 내부에서 성공적으로 실행했습니다 .
답변2
이것@larsks의 답변, 중대하다. 그러나 이제 RaspberryPI 4 에서는 Debian 11 (bulleye) aarch64
from vcgencmd
에서 /opt/vc/bin/vcgencmd
. /usr/bin/vcgencmd
그럼 업데이트된 버전은 이렇습니다Mu88해결책:
docker run -it --rm -v /usr:/usr -e LD_LIBRARY_PATH=/usr/lib --device /dev/vchiq debian:stretch /usr/bin/vcgencmd measure_temp