【问题标题】:Varnish fails to start with : failed to map segment from shared object: Operation not permittedVarnish 无法开始:无法从共享对象映射段:不允许操作
【发布时间】:2016-06-23 22:18:45
【问题描述】:

我在 CentOS 6.7 上从 epel repo 安装了清漆,但无法启动并出现以下错误:

Compiled VCL program failed to load:
  ./vcl.1P9zoqAU.so: failed to map segment from shared object: Operation not permitted
VCL compilation failed

如果我 strace 清漆二进制文件,我会在最后得到以下几行

chdir("/var/lib/varnish/myserver.foo.bar") = 0
open("./vcl.1P9zoqAU.c", O_RDWR|O_CREAT|O_EXCL, 0600) = 3

所以我检查了这个目录的权限是否正确(而且我使用 root 运行它),我禁用了 SELinux,重新启动,重新安装...... 首先它发生在 varnish 2.1.15 上,但同样发生在 4.0.3 上(使用官方 varnish repo)。

你知道我的系统发生了什么吗?

【问题讨论】:

  • 你能检查以确保文件系统没有被noexec挂载吗?
  • 天哪,这就是原因......你能解释一下(在主题答案中)为什么 noexec 选项会影响基本的 open() 操作吗?据我了解,varnish 现在正尝试在 C 中构建 vcl 配置,以便可以将其加载到内存中。我不确定这里的 noexec 在哪里干扰。感谢您的帮助

标签: linux varnish


【解决方案1】:

作为 varnish 启动的一部分,它会生成一个可加载的 configuration of it's behaviour 库。这由 varnishd 在运行时编译和加载。这是错误所抱怨的事情:

Compiled VCL program failed to load:
  ./vcl.1P9zoqAU.so: failed to map segment from shared object: Operation not permitted
VCL compilation failed

即这是一个失败的dlopen 呼叫。较新的版本有a slightly more obvious message,上面写着:

dlopen(vcl_boot/vgc.so) = failed to map segment from shared object: Operation not permitted

在这种情况下,.so 所在的目录驻留在使用noexec 选项挂载的文件系统上,这会导致dlopen 失败。

解决此问题需要使用exec 选项重新安装此文件系统。

【讨论】:

  • 您可以在 Ubuntu 上通过将 /etc/fstab 配置更改为:/tmp ext4 defaults,exec,nosuid,nodev 来执行此操作
  • 谢谢。请注意,使用 docker 和 tmpfs 时,您只需在卷的末尾添加 :exec 即可添加 exec 选项。
  • 想知道这个编译步骤是否可以使用不同的目录?
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多