我的停靠容器库映像是ubuntu,我使用完全特权选项运行它,这意味着在run命令中我使用以下开关:
--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的问题,我会说我使用容器作为集群,所以我需要每个节点的跟踪。
发布于 2016-05-16 13:03:16
我没有足够的信息来调试这个,但是你要求发布一个答案。
问题的根源似乎就在这里:
BLKTRACESETUP(2) / failed: 25/Inappropriate ioctl for device这表明设置块跟踪的ioctl调用失败。它在容器内部失败,但根据评论,它在容器之外工作。这表明问题在于容器的设置或内核中的限制,使得ioctl根本无法在容器中使用。
错误inappropriate ioctl for device为errno 25,即ENOTTY。我无法立即看到返回的内容,除非它根本找不到设备节点(考虑到您已经从容器外部证明了它在编译块跟踪代码)。我不记得这是否在模块中,但是首先尝试容器外部的块跟踪(然后在容器中检查它)是值得的,只是为了检查这不是一个模块加载问题。
调试的第一步是使用strace工具(如上面所建议的),这样您就可以准确地知道使用哪些参数进行的系统调用。例如跑:
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 --这意味着您(a)需要首先对特定模块进行修改,(b)可能需要一个特定的内核。
https://stackoverflow.com/questions/37238038
复制相似问题