问题描述
只是尝试为安装 buildroot 包后部署的一组文件自定义权限。找到了 FOO_PERMISSIONS 功能,这似乎是正确的方法:
define FOO_PERMISSIONS
/usr/share/foo/ r 775 root wheel - - - - -
endef
...
ifeq ($(BR2_PACKAGE_FOO),y)
$(eval $(generic-package))
endif
在 /usr/share/foo/ 上使用 "r" 递归迭代时,问题发生在 FOO_PERMISSIONS 中。在该目录中有一些带有一些常规文件的子目录。但也有一些符号链接指向构建平台中不存在的嵌入式目标平台内的文件。例如:
/usr/share/foo/resources/foo.json -> /usr/share/foo/foo.json
似乎 makedevs 没有正确管理符号链接:
makedevs: chown Failed for /buildrOOT/output/target/usr/share/foo/resources/foo.json: No such file or directory
文件存在:
$ ls -l /buildrOOT/output/target/usr/share/foo/resources/foo.json -> /usr/share/foo/foo.json
$ ls -l /usr/share/foo/foo.json
ls: cannot access '/usr/share/foo/foo.json': No such file or directory
可以通过不同方式修复此错误。第一种方法是触摸构建平台内的虚拟文件:
$ touch /usr/share/foo/foo.json
但这是一个令人讨厌的修复。
第二种方法是为每个部署的文件和符号链接设置权限,管理带有“f”类型的常规文件和带有“l”类型的符号链接。
define FOO_PERMISSIONS
/usr/share/foo/path/to/regular/file f 775 root wheel - - - - -
/usr/share/foo/path/to/symlink l 775 root wheel - - - - -
....
endef
但这对于部署数百个文件的包来说并不是一个合理的解决方案。在这种情况下,你失去了很好的递归特性。
第三种方法是在启动时在脚本内创建所有符号链接。但同样,这似乎不是解决符号链接权限问题的最便捷方法。
在这种情况下,最方便的处理方式是什么?
谢谢!
解决方法
避免此问题的正确方法是使所有符号链接相对。因此,不要使用 /usr/share/foo/foo.json,而是指向 ../foo.json。仅供参考,以备将来有需要时使用。