在 runc 容器中执行二进制文件时出现分段错误
Segmentation fault when executing binary in runc container
我在使用 运行c 容器时遇到特殊问题。我有一个 bash 脚本(运行ning 以 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"
每次在容器启动时 运行s 都会失败并输出以下内容:
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
时,它将起作用。
但其中 none 是实际实施的有效选项。我什至编辑了二进制文件的源代码以简单地休眠 2 小时——这没有任何效果,所以我认为二进制文件的实际源代码不是原因。有什么我想念的吗?
我的运行c版本是:
runc version 1.0.0-rc5+dev
commit: 69663f0bd4b60df09991c08812a60108003fa340
spec: 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
添加到我使用的内核命令行参数中。
我在使用 运行c 容器时遇到特殊问题。我有一个 bash 脚本(运行ning 以 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"
每次在容器启动时 运行s 都会失败并输出以下内容:
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
时,它将起作用。
但其中 none 是实际实施的有效选项。我什至编辑了二进制文件的源代码以简单地休眠 2 小时——这没有任何效果,所以我认为二进制文件的实际源代码不是原因。有什么我想念的吗?
我的运行c版本是:
runc version 1.0.0-rc5+dev
commit: 69663f0bd4b60df09991c08812a60108003fa340
spec: 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
添加到我使用的内核命令行参数中。