在Runc容器中执行二进制文件时出现分段错误

时间:2018-09-19 12:15:22

标签: segmentation-fault containers linux-capabilities runc

我对 runc 容器有一个特殊的问题。我有一个bash脚本(以root身份运行),正在执行以下操作:

$ setcap cap_net_bind_service=+ep ${PACKAGE_DIR}/bin/my-binary
$ chpst -u vcap:vcap "${PACKAGE_DIR}/bin/my-binary" --config "${JOB_DIR}/config/config.json"

每次在容器启动时运行时,都会失败并显示以下输出:

 5116 Segmentation fault      chpst -u vcap:vcap "${PACKAGE_DIR}/bin/my-binary" --config "${JOB_DIR}/config/config.json"

但是:

  • 当我将ssh或shell放入容器并手动运行命令时, 会起作用的。
  • 如果我删除chpst -u vcap:vcap(以root身份运行),它也会 工作。
  • 如果我删除setcap cap_net_bind_servic...声明,它将 也可以。
  • 当我将chown my-binary更改为vcap:vcap时,它将起作用。

但是这些都不是真正实现的有效选项。我什至已经编辑了二进制文件的源代码以使其仅休眠2个小时-无效,因此我认为二进制文件的实际源代码不是原因。有什么我想念的吗?

我的runc版本是:

runc version 1.0.0-rc5+dev
commit: 69663f0bd4b60df09991c08812a60108003fa340
spec: 1.0.0

1 个答案:

答案 0 :(得分:0)

难题的缺失部分是这些日志:

[  197.027144] bosh-dns[29239] vsyscall attempted with vsyscall=none ip:ffffffffff600000 cs:33 sp:7ffeeb9ea458 ax:ffffffffff600000 si:0 di:7ffeeb9ea460
[  197.028504] bosh-dns[29239]: segfault at ffffffffff600000 ip ffffffffff600000 sp 00007ffeeb9ea458 error 15
[  197.028772] bosh-dns[29233] vsyscall attempted with vsyscall=none ip:ffffffffff600000 cs:33 sp:7ffea26a3028 ax:ffffffffff600000 si:0 di:7ffea26a3030
[  197.028774] bosh-dns[29233]: segfault at ffffffffff600000 ip ffffffffff600000 sp 00007ffea26a3028 error 15

我不知道为什么,但是解决我的问题的方法是将vsyscall=emulate添加到我使用的内核命令行参数中。