【问题标题】:blktrace output error in docker containerdocker容器中的blktrace输出错误
【发布时间】:2016-09-11 07:20:02
【问题描述】:

我的 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

我搜索并找到this solution 导致使用此命令:

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    

我该如何解决?

更新1:

/sys/kernel/debug/block/ 中有 sda 文件夹,在这个文件夹中有这些文件:

trace0 trace1 trace2 etc.

更新2:

@abligh 感谢您的回答,但没有帮助。关于ioctlstrace 输出为:

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 的问题,我会说我使用容器作为集群,所以我需要每个节点的跟踪。

【问题讨论】:

  • blktrace 是否在容器外部工作?我猜这个问题可能是块设备本身在容器中是不可见的。
  • @abligh 是的,主机没问题。
  • 那么它不是内核锁或类似的。我怀疑您的问题只是 BLKTRACESETUP 不在容器中工作。这可能是内核限制。 straceblktrace 会很有帮助。
  • @abligh 我认为没有内核限制,因为我使用--cap-add SYS_ADMIN--security-opt apparmor:unconfined 运行docker 容器。抱歉没有得到您的建议,stateblktrace 是什么?
  • @abligh 我的新问题更新有帮助吗?

标签: linux docker devops blktrace


【解决方案1】:

我没有足够的信息来调试此问题,但您要求发布答案。

问题的根源似乎在这里:

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

这表明设置块跟踪的ioctl 调用失败。它在容器内失败,但根据 cmets 在容器外工作。这表明问题出在容器设置或内核中的限制导致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/tracestrace 将列出所有系统调用。看看你能不能从 ioctl 的失败中判断出来。

其次,我会确保您尝试跟踪的块设备实际上出现在/proc//sys/ 中的正确位置。这里出了点问题:

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

注意调试行中的(null),它显然不应该在那里——它应该是块设备的名称。这可能是ioctl 失败的结果,也可能表明/sys/ 层次结构中存在问题。

BLKTRACESETUP 在内核 here 中处理。这最终会调用doblktracesetuphere。我无法立即看到为什么这在适当许可的容器中不起作用的任何原因,这让我怀疑您的 /sys 层次结构可能设置不正确。但是strace 的输出会有所帮助。

另外,不可避免的评论:你为什么要在容器中这样做?为什么不在容器外运行呢?

编辑:看起来可能是内核问题。请参阅https://github.com/scaleway/kernel-tools/issues/107 - 这表明您 (a) 需要先对特定模块进行 modprobe,并且 (b) 可能需要特定内核。

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 2021-06-20
    • 2015-07-16
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多