设置由 buildroot 包部署的符号链接的权限

Setting permissions of symlinks deployed by a buildroot package

只是尝试为安装 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。仅供参考,以防大家以后有需要。