BalenaOS 在容器内使用 Raspberry Pi 计算模块 4 IO 板的实时时钟
BalenaOS use Raspberry Pi Compute Module 4 IO board's Real-Time Clock inside container
我正在尝试使用 CM4 IO 板的实时时钟 (RTC) 来保存 docker 容器中的日期时间更改,因此每当设备重新启动时,它都会记住新设置的日期时间。 (默认情况下它通过 chrony 同步。)我可以使用 date --set="<datetime string>"
更新系统的日期时间,但在重新启动后它会重新同步并覆盖之前设置的日期时间。
要启用OI板的RTC,需要根据IO板的datasheet设置BALENA_HOST_CONFIG_dtparam="i2c_vc=on"
:
我已经完成了(添加了舰队范围的配置),之后我还将 i2c-tools
添加到我想要使用它的容器中,这允许使用 i2cdetect
命令。
它可以使用以下命令检测 RTC(电池插入偏离路线):i2cdetect -y 10
(RTC 在 i2c-10 上)显示地址 0x51 上的 RTC 设备,如数据表所述:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- 0c -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2f
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
虽然对我来说这看起来像是在 1x51 上,所以可能那里有问题?
但是,地址似乎是正确的,因为我在 运行ning i2cget -y 10 0x51
: 0x00
时得到以下结果。而当我 运行 i2cget -y 10 1x51
时,我得到:Error: Chip address is not a number!
。
为了完整起见,这是我在 运行 时得到的(其他正在使用的 i2c 地址,不知道有什么用):
i2cget -y 10 0x0c
: 0x5f
i2cget -y 10 0x2f
: 0x00
这是我在 运行ning i2cdetect -l
:
时得到的
i2c-10 i2c i2c-22-mux (chan_id 1) I2C adapter
i2c-0 i2c i2c-22-mux (chan_id 0) I2C adapter
i2c-22 i2c bcm2835 (i2c@7e205000) I2C adapter
这也反映在 运行ning ls -hal /dev/i2c*
时(容器内和主机上的结果相同 OS):
crw-rw---- 1 root i2c 89, 0 Apr 5 12:49 /dev/i2c-0
crw-rw---- 1 root i2c 89, 10 Apr 5 12:49 /dev/i2c-10
crw-rw---- 1 root i2c 89, 22 Apr 5 12:49 /dev/i2c-22
这是我 运行 dmesg | grep -E '(i2c|rtc)' | head -50
时的输出(容器内和主机上的结果相同 OS):
[ 6.492981] i2c i2c-22: Added multiplexed i2c bus 0
[ 6.493115] i2c i2c-22: Added multiplexed i2c bus 10
[ 9.378968] i2c /dev entries driver
到目前为止一切顺利,看来。
根据 Raspberry Pi 论坛上的 this post,您还需要:
echo pcf85063 0x51 >/sys/class/i2c-adapter/i2c-10/new_device
modprobe rtc-pcf85063
我已经将这些东西都添加到我的 docker 设置中(并且还尝试了相同 post 中列出的一些变体),但是我认为我什至不需要这个,因为我可以在设置 _dtparam
后立即检测到它。这样做与否似乎没有任何区别。
通常,当一切正常工作时,您应该能够使用 hwclock
命令设置、更新...RTC,但每当我 运行 那个,我得到以下留言:
hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --verbose option to see the details of our search for an access method.
这是我 运行 hwclock --verbose
:
时的输出
hwclock from util-linux 2.36.1
System Time: 1649177573.560553
Trying to open: /dev/rtc0
Trying to open: /dev/rtc
Trying to open: /dev/misc/rtc
No usable clock interface found.
hwclock: Cannot access the Hardware Clock via any known method.
当我 运行 timedatectl
在主机 OS 上时,我得到:
Local time: Tue 2022-04-05 17:04:37 UTC
Universal time: Tue 2022-04-05 17:04:37 UTC
RTC time: n/a
Time zone: n/a (UTC, +0000)
System clock synchronized: yes
NTP service: n/a
RTC in local TZ: no
这似乎表明 RTC 不工作。
当运行在容器本身中执行此命令时,我得到:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
我在这里遗漏了什么或做错了什么?这是 permission/usergroup 问题吗(因为我试图从容器内部执行此操作)?这是一些错误的配置吗?我是否缺少一些额外的设置?
我也在 balena forum 上发布了同样的问题,我所要做的只是将 BALENA_HOST_CONFIG_dtoverlay
设置为 "i2c-rtc,pcf85063a,i2c_csi_dsi,addr=0x51"
。
额外信息:在CM4 IO board datasheet(第2.13节)中,它表示您只需将BALENA_HOST_CONFIG_dtparam
设置为"i2c_vc=on"
,但在设置[=14=时不需要这样做] 从上面。我测试过使用和不使用这个,没有发现任何区别。
我正在尝试使用 CM4 IO 板的实时时钟 (RTC) 来保存 docker 容器中的日期时间更改,因此每当设备重新启动时,它都会记住新设置的日期时间。 (默认情况下它通过 chrony 同步。)我可以使用 date --set="<datetime string>"
更新系统的日期时间,但在重新启动后它会重新同步并覆盖之前设置的日期时间。
要启用OI板的RTC,需要根据IO板的datasheet设置BALENA_HOST_CONFIG_dtparam="i2c_vc=on"
:
我已经完成了(添加了舰队范围的配置),之后我还将 i2c-tools
添加到我想要使用它的容器中,这允许使用 i2cdetect
命令。
它可以使用以下命令检测 RTC(电池插入偏离路线):i2cdetect -y 10
(RTC 在 i2c-10 上)显示地址 0x51 上的 RTC 设备,如数据表所述:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- 0c -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2f
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
虽然对我来说这看起来像是在 1x51 上,所以可能那里有问题?
但是,地址似乎是正确的,因为我在 运行ning i2cget -y 10 0x51
: 0x00
时得到以下结果。而当我 运行 i2cget -y 10 1x51
时,我得到:Error: Chip address is not a number!
。
为了完整起见,这是我在 运行 时得到的(其他正在使用的 i2c 地址,不知道有什么用):
i2cget -y 10 0x0c
:0x5f
i2cget -y 10 0x2f
:0x00
这是我在 运行ning i2cdetect -l
:
i2c-10 i2c i2c-22-mux (chan_id 1) I2C adapter
i2c-0 i2c i2c-22-mux (chan_id 0) I2C adapter
i2c-22 i2c bcm2835 (i2c@7e205000) I2C adapter
这也反映在 运行ning ls -hal /dev/i2c*
时(容器内和主机上的结果相同 OS):
crw-rw---- 1 root i2c 89, 0 Apr 5 12:49 /dev/i2c-0
crw-rw---- 1 root i2c 89, 10 Apr 5 12:49 /dev/i2c-10
crw-rw---- 1 root i2c 89, 22 Apr 5 12:49 /dev/i2c-22
这是我 运行 dmesg | grep -E '(i2c|rtc)' | head -50
时的输出(容器内和主机上的结果相同 OS):
[ 6.492981] i2c i2c-22: Added multiplexed i2c bus 0
[ 6.493115] i2c i2c-22: Added multiplexed i2c bus 10
[ 9.378968] i2c /dev entries driver
到目前为止一切顺利,看来。
根据 Raspberry Pi 论坛上的 this post,您还需要:
echo pcf85063 0x51 >/sys/class/i2c-adapter/i2c-10/new_device
modprobe rtc-pcf85063
我已经将这些东西都添加到我的 docker 设置中(并且还尝试了相同 post 中列出的一些变体),但是我认为我什至不需要这个,因为我可以在设置 _dtparam
后立即检测到它。这样做与否似乎没有任何区别。
通常,当一切正常工作时,您应该能够使用 hwclock
命令设置、更新...RTC,但每当我 运行 那个,我得到以下留言:
hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --verbose option to see the details of our search for an access method.
这是我 运行 hwclock --verbose
:
hwclock from util-linux 2.36.1
System Time: 1649177573.560553
Trying to open: /dev/rtc0
Trying to open: /dev/rtc
Trying to open: /dev/misc/rtc
No usable clock interface found.
hwclock: Cannot access the Hardware Clock via any known method.
当我 运行 timedatectl
在主机 OS 上时,我得到:
Local time: Tue 2022-04-05 17:04:37 UTC
Universal time: Tue 2022-04-05 17:04:37 UTC
RTC time: n/a
Time zone: n/a (UTC, +0000)
System clock synchronized: yes
NTP service: n/a
RTC in local TZ: no
这似乎表明 RTC 不工作。
当运行在容器本身中执行此命令时,我得到:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
我在这里遗漏了什么或做错了什么?这是 permission/usergroup 问题吗(因为我试图从容器内部执行此操作)?这是一些错误的配置吗?我是否缺少一些额外的设置?
我也在 balena forum 上发布了同样的问题,我所要做的只是将 BALENA_HOST_CONFIG_dtoverlay
设置为 "i2c-rtc,pcf85063a,i2c_csi_dsi,addr=0x51"
。
额外信息:在CM4 IO board datasheet(第2.13节)中,它表示您只需将BALENA_HOST_CONFIG_dtparam
设置为"i2c_vc=on"
,但在设置[=14=时不需要这样做] 从上面。我测试过使用和不使用这个,没有发现任何区别。