Ошибка сегментации при выполнении двоичного файла в контейнере runc - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть особая проблема с 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 голосов
/ 27 сентября 2018

Недостающим фрагментом головоломки были следующие кусочки журналов:

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

...