Ошибка сегментации при выполнении двоичного файла в контейнере 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

person mango    schedule 19.09.2018    source источник


Ответы (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 к аргументам командной строки ядра, которые я использовал.

person mango    schedule 27.09.2018