我有一个嵌入式 Linux 设备,其库存操作系统映像不包含通常在/usr/share/zoneinfo
.
我希望增强该设备,以便能够在我的应用程序中包含时区支持。该设备没有包管理器,也不包含任何常用的时区管理实用程序,例如tzselect
或timedatectrl
。将数据传输到设备的主要方法是通过 USB 闪存驱动器。
我已经确认设备上的 GLIBC 库已构建为包含时区支持,并且通过手动将 TZ 数据库从我的计算机复制到设备上并创建预期的各种符号链接,我可以或多或少地获得时区支持。
我在网上可以找到的有关 TZ 数据库安装的所有内容都建议使用平台的包管理器,但在本例中该包管理器不可用。一个复杂的因素是设备制造商建议将所有用户数据相应地放置在该/opt
目录下(系统目录安装为只读)。
我想使用->符号链接安装数据库,/opt/usr/share/zoneinfo
而不是通常的。这意味着从我的开发计算机的目录复制的符号链接一旦到达目标就不会指向正确的位置(假设它们是绝对的)。/usr/share/zoneinfo
/usr/share/zoneinfo
/opt/usr/share/zoneinfo
zoneinfo
因此,要复制 TZ 数据库,我认为我需要:
- 在我的开发设备上获取目录的临时副本
usr/share/zoneinfo
。机器 - 使用该
symlinks
实用程序将所有绝对符号链接转换为相对符号链接。 - 将目录打包为维护符号链接的存档格式。
- 将存档复制到 USB 闪存驱动器上
- 将其解压到所需位置。
有更好/标准/正确的方法吗?
笔记:我正在使用 CrossControl CCPilot VS、Yocto 生成的 Linux 操作系统。
答案1
在不了解更多关于您的特定硬件和场景的情况下,我觉得这里最简单的行动方案是遵循如何在Linux 从头开始项目 (LSF)。
Linux 从头开始
该项目讨论了以下步骤:
8.5.2.2.添加时区数据
使用以下命令安装并设置时区数据:
tar -xf ../../tzdata2018e.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward pacificnew systemv; do zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz} zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz} zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO
……
*参考: https://www.linuxfromscratch.org/lfs/view/development/chapter08/glibc.html
压缩包?
因此剩下的唯一问题是从哪里获取该tzdata2018e.tar.gz
文件?更多谷歌搜索会出现这个页面:3.2.所有套餐,此页面上有这些 URL。
时区数据 (2018e) - 346 KB:
- 主页:https://www.iana.org/time-zones
- 下载:https://www.iana.org/time-zones/repository/releases/tzdata2018e.tar.gz
- MD5总和:97d654f4d7253173b3eeb76a836dd65e
答案2
事实证明,我希望在我的 ubuntu xenial 开发机器上传输现有的 TZ 数据库,这更加简单。将目录打包zoneinfo
为 tar 存档可通过复制操作保留符号链接,并且符号链接都已经是相对的,因此将目录安装在目标设备上的备用位置不是问题。
答案3
在小型嵌入式 Linux 系统中使用 TZ 数据库的一个问题是生成的二进制文件尺寸较大。它可以变得比你的 Linux 内核和 rootfs 本身还要大:)。
时区数据库的默认构建通常会提供存储在文件(zoneinfo/)中的大型二进制数据库。它的大小超过 2MB,用于支持不同的时区名称。对于具有严格内存限制的小型嵌入式系统,可以将时区数据剥离到 200KB 以下。
在这里发布链接供任何有兴趣贡献的人使用:https://github.com/turbosree/TinyTZ
此实现将原始时区数据缩减为几千字节 (< 200KB) 二进制数据,并避免了与具有严格内存限制的嵌入式系统一起使用的文件系统依赖性。基本上,时区数据可以驻留在 SRAM 中,甚至可以在裸机系统上使用简单的 C API 进行访问。