Ошибка сегментации при выполнении двоичного файла в контейнере 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 ответ
Недостающим фрагментом головоломки были вот эти кусочки бревен:
[ 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
к аргументам командной строки ядра, которые я использовал.