Intereting Posts
Прокси-сервер изображений Docker (частный реестр докеров) с использованием Nexus OSS и повторное использование изображений зависимостей Как скрипт bash перезапускает процесс на выходе без вывода, отправляя сигналы дочернему Как официальный образ Postgres создает пользователя и базу данных с переменными env? Подписка на события Docker Как указать параметры запуска в докере? ssh в boot2docker – вы можете видеть -v папки из boot2docker vm Измените драйвер для Docker на OS X Здание Docker не работает: возвращается ненулевой код: 1 Влияние драйвера в ОС хоста на процесс Докера Докер – проверьте, готовы ли postgres Базовое изображение для java Возвращение IP-адреса хоста в докер содержит файл конфигурации systemd Docker-compose не удалось запустить банку, которая считывает конфигурацию из файла Супервизор не запускается в мой контейнер-докер (проект Laravel) Play Framework + Docker: требуется дефолт по умолчанию для базы данных

Ошибка вывода blktrace в контейнере докера

мое базовое изображение контейнера-докера – ubuntu, и я запускал его с полными параметрами привилегий, что означает, что в команде запуска я использую эти ключи:

--cap-add=SYS_ADMIN --security-opt apparmor:unconfined 

Я хочу использовать blktrce, используя команду ниже:

 sudo blktrace -d / -a issue -o - | blkparse -f "%p %T.%9t %D %S ^C %d\n" -i - >stream.out 

но, в первый раз, когда используется эта команда, я получаю эту ошибку:

 Debugfs is not mounted at /sys/kernel/debug 

я искал и нашел это решение, которое привело к использованию этой команды:

 mount -t debugfs none /sys/kernel/debug 

после этого, когда я снова использую команду blktrace , я получаю эту ошибку:

 BLKTRACESETUP(2) / failed: 25/Inappropriate ioctl for device Thread 1 failed open /sys/kernel/debug/block/(null)/trace1: 2/No such file or directory Thread 0 failed open /sys/kernel/debug/block/(null)/trace0: 2/No such file or directory Thread 2 failed open /sys/kernel/debug/block/(null)/trace2: 2/No such file or directory Thread 4 failed open /sys/kernel/debug/block/(null)/trace4: 2/No such file or directory Thread 3 failed open /sys/kernel/debug/block/(null)/trace3: 2/No such file or directory Thread 5 failed open /sys/kernel/debug/block/(null)/trace5: 2/No such file or directory Thread 7 failed open /sys/kernel/debug/block/(null)/trace7: 2/No such file or directory Thread 8 failed open /sys/kernel/debug/block/(null)/trace8: 2/No such file or directory Thread 6 failed open /sys/kernel/debug/block/(null)/trace6: 2/No such file or directory Thread 12 failed open /sys/kernel/debug/block/(null)/trace12: 2/No such file or directory Thread 10 failed open /sys/kernel/debug/block/(null)/trace10: 2/No such file or directory Thread 13 failed open /sys/kernel/debug/block/(null)/trace13: 2/No such file or directory Thread 15 failed open /sys/kernel/debug/block/(null)/trace15: 2/No such file or directory Thread 14 failed open /sys/kernel/debug/block/(null)/trace14: 2/No such file or directory Thread 17 failed open /sys/kernel/debug/block/(null)/trace17: 2/No such file or directory Thread 16 failed open /sys/kernel/debug/block/(null)/trace16: 2/No such file or directory Thread 18 failed open /sys/kernel/debug/block/(null)/trace18: 2/No such file or directory Thread 11 failed open /sys/kernel/debug/block/(null)/trace11: 2/No such file or directory Thread 19 failed open /sys/kernel/debug/block/(null)/trace19: 2/No such file or directory Thread 20 failed open /sys/kernel/debug/block/(null)/trace20: 2/No such file or directory Thread 9 failed open /sys/kernel/debug/block/(null)/trace9: 2/No such file or directory Thread 21 failed open /sys/kernel/debug/block/(null)/trace21: 2/No such file or directory Thread 22 failed open /sys/kernel/debug/block/(null)/trace22: 2/No such file or directory Thread 23 failed open /sys/kernel/debug/block/(null)/trace23: 2/No such file or directory FAILED to start thread on CPU 0: 1/Operation not permitted FAILED to start thread on CPU 1: 1/Operation not permitted FAILED to start thread on CPU 2: 1/Operation not permitted FAILED to start thread on CPU 3: 1/Operation not permitted FAILED to start thread on CPU 4: 1/Operation not permitted FAILED to start thread on CPU 5: 1/Operation not permitted FAILED to start thread on CPU 6: 1/Operation not permitted FAILED to start thread on CPU 7: 1/Operation not permitted FAILED to start thread on CPU 8: 1/Operation not permitted FAILED to start thread on CPU 9: 1/Operation not permitted FAILED to start thread on CPU 10: 1/Operation not permitted FAILED to start thread on CPU 11: 1/Operation not permitted FAILED to start thread on CPU 12: 1/Operation not permitted FAILED to start thread on CPU 13: 1/Operation not permitted FAILED to start thread on CPU 14: 1/Operation not permitted FAILED to start thread on CPU 15: 1/Operation not permitted FAILED to start thread on CPU 16: 1/Operation not permitted FAILED to start thread on CPU 17: 1/Operation not permitted FAILED to start thread on CPU 18: 1/Operation not permitted FAILED to start thread on CPU 19: 1/Operation not permitted FAILED to start thread on CPU 20: 1/Operation not permitted FAILED to start thread on CPU 21: 1/Operation not permitted FAILED to start thread on CPU 22: 1/Operation not permitted FAILED to start thread on CPU 23: 1/Operation not permitted 

как я могу это решить?

Update1:

есть папка sda в /sys/kernel/debug/block/ и в эту папку находятся следующие файлы:

 trace0 trace1 trace2 etc. 

Update2:

@abligh поблагодарить за ваш ответ, но не помогло. Выход strace около ioctl :

 ioctl(3, BLKTRACESETUP, {act_mask=64, buf_size=524288, buf_nr=4, start_lba=0, end_lba=0, pid=0}, 0x7ffe8a4ceac0) = -1 ENOTTY (Inappropriate ioctl for device) write(2, "BLKTRACESETUP(2) / failed: 25/Inappropriate ioctl for device\n", 61) = 61 ioctl(3, BLKTRACESTOP, 0x7f6fd19789d0) = -1 ENOTTY (Inappropriate ioctl for device) ioctl(3, BLKTRACESTOP, 0x7ffe8a4ce540) = -1 ENOTTY (Inappropriate ioctl for device) ioctl(3, BLKTRACESTOP, 0x7f6fd19789e0) = -1 ENOTTY (Inappropriate ioctl for device)` ioctl(3, BLKTRACETEARDOWN, 0x7f6fd19789e0) = -1 ENOTTY (Inappropriate ioctl for device) 

чтобы ответить на ваш вопрос о том, почему я запускаю blktrace в контейнере, я бы сказал, что я использую контейнеры в качестве кластера, поэтому мне нужна трассировка каждого узла.

У меня недостаточно информации, чтобы отладить это, но вы попросили ответить на него.

Корень проблемы, кажется, здесь:

 BLKTRACESETUP(2) / failed: 25/Inappropriate ioctl for device 

Это указывает на то, что вызов ioctl для настройки трассировки блока не выполняется. Он не работает внутри контейнера, но, согласно комментариям, работает вне контейнера. Это указывает на то, что проблема связана с установкой контейнера или ограничением в ядре, которое предотвращает использование ioctl в контейнере вообще.

Ошибка inappropriate ioctl for device – errno 25, то есть ENOTTY . Я не могу сразу увидеть, что будет возвращать это, если он не сможет найти узел устройства вообще (учитывая, что вы уже продемонстрировали, что он работает за пределами контейнера, в который компилируется код трассировки блока). Я не могу вспомнить, есть ли это в модуле, но сначала стоит попробовать трассировку блока за пределами контейнера (затем проверить его внутри контейнера), просто чтобы проверить, что это не проблема загрузки модуля.

Первым шагом в отладке было бы использовать инструмент strace (как было предложено выше), чтобы вы точно знали, какой системный вызов выполняется с какими параметрами. Прогон EG:

 sudo strace -f -s2048 -o/tmp/trace blktrace -d / -a issue -o - | blkparse -f "%p %T.%9t %D %S ^C %d\n" -i - >stream.out 

и затем посмотрите на /tmp/trace . strace перечислит все сделанные системные вызовы. Посмотрите, можете ли вы определить, из чего происходит ioctl .

Во-вторых, я гарантирую, что блок-устройство, которое вы пытаетесь отследить, действительно отображается в правильном месте (-ах) в /proc/ и /sys/ . Здесь происходит нечто неправильное:

 Thread 0 failed open /sys/kernel/debug/block/(null)/trace0: 2/No such file or directory 

Обратите внимание на (null) в строке отладки, которая явно не должна быть там – это должно быть имя блочного устройства. Это, возможно, является следствием неудачной ioctl или, возможно, указывает на проблему в иерархии /sys/ .

BLKTRACESETUP обрабатывается в ядре здесь . Это в конечном итоге вызывает doblktracesetup здесь . Я не могу сразу увидеть, почему это не будет работать из контейнера с соответствующим разрешением, что заставляет меня подозревать, что ваша иерархия /sys не может быть настроена правильно. Но выход strace был бы полезен.

Кроме того, неизбежный комментарий: почему вы делаете это в контейнере? Почему бы не запустить его за пределами контейнера?

EDIT : Похоже, это может быть ядро. См. https://github.com/scaleway/kernel-tools/issues/107 – это говорит о необходимости (a) сначала выполнить modprobe определенные модули, и (b) может потребоваться определенное ядро.