Yocto Poky Warrior只读根文件系统下如何修改时区?
在只读根文件系统的Yocto Poky Warrior中修改时区的解决方案
我之前在基于树莓派CM3的Yocto Poky Warrior环境里碰到过完全一样的问题——只读根FS下timedatectl会因为无法写入/etc/localtime或/etc/timezone这类配置文件而报错。下面给你分场景提供实用的解决思路:
一、临时修改(重启后失效)
如果只是临时测试或者单次生效,最快的方法是通过环境变量TZ直接设置:
export TZ="America/New_York"
执行后当前shell会话的时区会立即生效,你可以用date命令验证。如果想让所有用户登录后都生效,可临时把根FS挂载为可读写,把这条命令追加到/etc/profile里:
mount -o remount,rw / echo 'export TZ="America/New_York"' >> /etc/profile mount -o remount,ro /
不过这种方式重启后会失效,适合临时场景。
二、永久修改(推荐,适配Yocto只读FS特性)
因为你的系统是Yocto构建的,最规范的做法是在构建阶段就配置好时区,这样生成的只读根FS会自带正确的时区设置,不需要在设备上修改:
- 打开Yocto构建目录下的
conf/local.conf文件 - 添加或修改以下变量:
TIMEZONE = "America/New_York" - 重新构建镜像(替换成你实际使用的镜像名):
构建完成后,新镜像的bitbake core-image-minimal/etc/localtime会自动指向正确的时区文件,而且因为是构建时生成的,只读FS下完全没问题。
三、已部署设备的永久修改(无需重新构建镜像)
如果设备已经部署,无法重新烧录镜像,可以利用overlayfs让/etc目录可写(这是Yocto只读FS场景下修改配置的标准做法):
- 先临时挂载根FS为可读写:
mount -o remount,rw / - 创建overlayfs所需的目录(如果不存在的话):
mkdir -p /var/lib/overlay/etc/upper /var/lib/overlay/etc/work - 修改
/etc/fstab,添加overlayfs挂载项:echo "overlay /etc overlay lowerdir=/etc,upperdir=/var/lib/overlay/etc/upper,workdir=/var/lib/overlay/etc/work 0 0" >> /etc/fstab - 重新挂载
/etc:mount /etc - 现在就可以正常执行
timedatectl命令修改时区了:
这个修改会被存在timedatectl set-timezone "America/New_York"/var/lib/overlay/etc/upper目录下,重启后依然生效,而且根FS其他部分还是只读状态,兼顾了稳定性和可配置性。
内容的提问来源于stack exchange,提问作者thesillywhat
相关产品推荐
相关产品推荐

