BIND9 允许您使用dlopen
驱动程序在运行时链接动态可加载区域 (DLZ) 模块。此功能的单元测试在我的环境中通过了,但当我尝试运行named
已链接的编译共享对象文件时,出现此错误:
dlz_dlopen failed to open library '/usr/lib/dlz_example.so' - /usr/lib/dlz_example.so: failed to map segment from shared object
我已经在 BIND9 GitLab 中打开了一张票这里,其中包含有关我的具体问题的详细信息。
更一般地说,我想知道大家是否对尝试加载共享对象时遇到的常见问题有任何见解,或者有使用 DLZ 模块的经验。我的直觉是,我对它们的工作原理有些不了解,并且存在一些愚蠢的错误配置导致此问题。当然,也欢迎提供调试技巧。
ISC 知识库页面“在 BIND 中使用 DLZ”:https://kb.isc.org/docs/aa-00995
答案1
因此,您使用的是 Debian 或 Ubuntu,它们默认启用 AppArmor,并限制named
守护进程可以读取、写入、mmap 或执行的位置。任何从“错误”位置加载模块的尝试都将被内核拒绝并记录下来dmesg
。
默认策略是/etc/apparmor.d/usr.sbin.named
,仅允许两个位置:
/usr/lib/bind/*.so rm
– 对于大多数封装模块/{usr/,}lib/@{multiarch}/samba/bind9/*.so rm
– 对于 Samba AD DC 区域
可以进行自定义添加/etc/apparmor.d/local/usr.sbin.named
(如文件底部的 #include 语句所示)。该文件没有任何开始/结束分隔符,只有附加规则本身,例如:
/usr/local/lib/*.so rm,
要在编辑后重新加载配置文件,请使用:
apparmor_parser --replace /etc/apparmor.d/usr.sbin.named