Ошибка вывода blktrace в Docker-контейнере
Мой базовый образ контейнера докера - 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:
@ спасибо за ответ, но не помогло. 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
в контейнере я бы сказал, что я использую контейнеры в качестве кластера, поэтому мне нужен след каждого узла.
1 ответ
У меня недостаточно информации для отладки, но вы попросили опубликовать ответ.
Корень проблемы, кажется, здесь:
BLKTRACESETUP(2) / failed: 25/Inappropriate ioctl for device
Это указывает на то, что ioctl
вызов для настройки трассировки блока не выполняется. Он не работает внутри контейнера, но, согласно комментариям, работает вне контейнера. Это указывает на то, что проблема связана с настройкой контейнера или ограничением в ядре, которое предотвращает ioctl
от использования в контейнере вообще.
Ошибка inappropriate ioctl for device
ошибочно 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
было бы полезно.
Кроме того, неизбежный комментарий: почему вы делаете это в контейнере? Почему бы не запустить его за пределы контейнера?
РЕДАКТИРОВАТЬ: Похоже, это может быть ядро. См. https://github.com/scaleway/kernel-tools/issues/107 - это говорит о том, что вам (а) необходимо сначала выполнить проверку отдельных модулей, а (б) может потребоваться конкретное ядро.