在 Fedora 上安装树莓派的 vcgencmd
命令
这篇帖子算是对我之前关于在树莓派集群上配置 Fedora 的那篇的一个延续。集群配置好后,我告知机主 @ColsonXu 他的集群已经正式投入运算,他就告诉我可以运行一个命令来查看树莓派的 CPU 温度,监视硬件状况:
$ /opt/vc/bin/vcgencmd measure_temp
这个 vcgencmd
命令是树莓派 OS(旧称 Raspbian)上用来获取硬件相关信息的命令。然而,这个命令在 Fedora 官方的软件仓库里并没有提供。好在 vcgencmd
的源代码是可以下载的,所以我们可以自行编译它,就能在 Fedora 上使用了。vcgencmd
是树莓派 OS 中 userland
软件包的一部分,而整个 userland
的源代码都可以直接从网上获取。
构建和安装过程
-
下载构建过程中所需的工具和编译器、以及用于下载源代码的 Git。
$ sudo dnf install cmake gcc gcc-c++ make git
-
下载
userland
软件包的源代码,然后进入下载的目录。$ git clone https://github.com/raspberrypi/userland.git $ cd userland
-
运行
./buildme --aarch64
命令,为 Fedora 使用的aarch64
架构编译软件包。命令运行过程中,当编译完成、准备安装编译好的程序时,可能会出现
sudo
要求输入密码的提示,相应地输入密码即可。$ ./buildme --aarch64
命令完成后,就可以在 /opt/vc/bin
下找到 vcgencmd
命令了。
注册与 /opt/vc
相关的路径
虽然 vcgencmd
安装好了,但是如果现在运行它的话,会出现如下报错:
$ /opt/vc/bin/vcgencmd
/opt/vc/bin/vcgencmd: error while loading shared libraries: libvchiq_arm.so: cannot open shared object file: No such file or directory
这条错误信息的意思是找不到运行 vcgencmd
所需要的库 libvchiq_arm.so
。虽然 /opt/vc/lib
下面是有这个文件的,但是 /opt/vc/lib
不在系统搜索函数库的范围内,所以会说找不到该文件。解决这个问题的方法是在 /etc/ld.so.conf.d
下新建一个后缀为 .conf
的文件,然后在该文件中写上下面一行:
/opt/vc/lib
之后运行如下命令,应用刚创建的新文件:
$ sudo ldconfig
现在再运行 /opt/vc/bin/vcgencmd
就不会再出现同样的报错了。
目前还有一个小瑕疵,那就是每次运行 vcgencmd
的时候都需要输入它的完整的绝对路径。如果不想这么麻烦的话,可以把 vcgencmd
所在的 /opt/vc/bin
加到 PATH
环境变量中。变动 PATH
环境变量的一种方法是编辑 ~/.bashrc
,作出如下修改:
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
+ PATH="/opt/vc/bin:$PATH"
export PATH
之后运行下面的命令,应用刚才的改动:
$ source ~/.bashrc
配置设备权限和用户组
此时,如果尝试在一个普通的用户下运行 vcgencmd
读取硬件信息的话,还是会遇到 VCHI initialization failed
的错误信息。
这个问题的解决方案在网上很多地方都能找到,那就是将该用户加入到 video
用户组中。不过,这个办法只适用于树莓派 OS;在 Fedora 上的话,还需要一道额外步骤:允许 video
组中的的用户访问 VCHI 设备。具体的做法是添加一个新的 udev 规则:
KERNEL=="vchiq",GROUP="video",MODE="0660"
目前,该 udev 规则仅在相对比较新的内核(5.16 及以上)上测试过;在老版本内核上可能无法达到预期的效果。如果使用的内核版本比较老,并且该规则不管用的话,请升级到最新的内核。
添加 udev 规则的方法是在 /etc/udev/rules.d
下创建一个文件扩展名是 .rules
的文件,然后将规则文本加到该文件中。可以使用下列命令来完成此操作,将规则添加至名为 92-local-vchiq-permissions.rules
的文件:
$ sudo tee /etc/udev/rules.d/92-local-vchiq-permissions.rules <<< 'KERNEL=="vchiq",GROUP="video",MODE="0660"'
udev 规则加好后,无需重启,直接运行下列命令即可应用规则:
$ sudo udevadm trigger /dev/vchiq
若要检查 udev 规则是否被应用,可以查看 VCHI 设备文件 /dev/vchiq
的权限设定。如果该文件所属的用户组是 video
,就说明规则应用成功了。
$ ls -l /dev/vchiq
crw-rw----. 1 root video 511, 0 Nov 9 23:17 /dev/vchiq
之后,video
组中的用户就可以正常调用 vcgencmd
命令了。可以用下面的命令将当前的用户添加到 video
组中,但是在运行完命令后必须重新登录才能令更改生效。
$ sudo usermod -aG video $USER
使用 DNF 安装 vcgencmd
虽然能自己编译所需的软件是一项有用的技能,但如果不想自己编译的话,可以直接使用我制作的 RPM 软件包来安装。我把软件包上传到了一个 Copr 仓库,可从该处下载然后安装,就可以直接开始使用 vcgencmd
。
$ sudo dnf copr enable leo3418/raspberrypi-userland
$ sudo dnf install raspberrypi-userland
如果用我的 RPM 软件包的话,就可以跳过上面的构建和安装步骤了,包括在 /etc/ld.so.conf.d
下创建 .conf
文件、修改 ~/.bashrc
、以及安装 udev 规则。唯一需要手动额外进行的操作就是将用户帐户添加到 video
用户组中。
也可以使用我写的 SPEC 文件自行创建 userland
的 RPM 软件包,这里我就只做一个演示,不给出详细步骤了。