2016-05-15 7 views
1

mein Docker Behälterboden Bild ist ubuntu, und ich lief es mit voller Berechtigung Optionen, die in Fahrbefehl bedeutet verwende ich diese Schalter:blktrace Ausgangsfehler in Docker Behälter

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

Ich möchte Verwendung blktrce unter Befehl:

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

aber, wenn erste Mal ist, diesen Befehl verwende ich diese Fehlermeldung erhalten:

Debugfs is not mounted at /sys/kernel/debug 

i gesucht und gefunden this solution, die diesen Befehl zu verwenden führte:

mount -t debugfs none /sys/kernel/debug 

danach, als ich den blktrace Befehl wieder verwenden, erhalte ich diese Fehlermeldung:

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  

Wie kann ich lösen das?

Update1:

gibt es sda Ordner in /sys/kernel/debug/block/ und in diesem Ordner befinden sich diese Dateien:

trace0 trace1 trace2 etc. 

Update2:

@abligh für Ihre Antwort danken, aber hat nicht geholfen. Die strace Ausgang über ioctl ist:

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) 

Ihre Frage zu beantworten, warum ich blktrace in Container laufen, würde ich sagen, dass ich Container als Cluster bin mit, so brauche ich die Spur von jedem Knoten.

+0

Does 'blktrace' Arbeit von außerhalb des Behälters? Ich vermute das Problem könnte sein, dass die Blockgeräte selbst nicht aus dem Container sichtbar sind. – abligh

+0

@abligh ja, es ist in Ordnung mit Host. –

+0

dann ist es keine Kernel-Sperre oder ähnliches. Ich vermute, Ihr Problem ist einfach, dass 'BLKTRACESETUP' nicht in einem Container funktioniert. Dies kann eine Kernel-Beschränkung sein. Ein 'strace' von' blktrace' wäre hilfreich. – abligh

Antwort

0

Ich habe nicht genug Informationen, dies zu debuggen, aber Sie bat um eine Antwort geschrieben werden.

Die Wurzel des Problems scheint hier zu sein:

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

Dies zeigt an, dass der ioctl Anruf Block Verfolgung einzurichten versagt. Es versagt im Container, aber laut den Kommentaren funktioniert es außerhalb des Containers. Dies würde anzeigen, dass das Problem mit dem Container-Setup oder einer Einschränkung im Kernel zusammenhängt, die verhindert, dass ioctl überhaupt in einem Container verwendet wird. inappropriate ioctl for device

Der Fehler ist errno 25, d.h. ENOTTY. Ich kann nicht sofort sehen, was zurückgeben würde, wenn es den Geräteknoten überhaupt nicht finden könnte (vorausgesetzt, Sie haben bereits gezeigt, dass es außerhalb des Containers funktioniert, in dem der Blockverfolgungscode kompiliert wird). Ich kann mich nicht erinnern, ob dies in einem Modul ist, aber es wäre einen Versuch wert, Blockverfolgung außerhalb des Containers zu versuchen (dann überprüfe es innerhalb des Containers), nur um zu überprüfen, dass dies kein Problem beim Laden von Modulen ist.

Der erste Schritt beim Debuggen wäre die Verwendung des Tools strace (wie oben vorgeschlagen), damit Sie genau wissen, welcher Systemaufruf mit welchen Parametern durchgeführt wird.EG-Lauf:

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 

und danach /tmp/trace betrachten. strace listet alle Systemaufrufe auf. Sehen Sie, wenn Sie feststellen können, dass ioctl fehlschlägt.

Zweitens würde ich sicherstellen, dass das Blockgerät, das Sie verfolgen möchten, tatsächlich an den richtigen Stellen in /proc/ und /sys/ erscheint. Stimmt etwas nicht geschieht hier:

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

Notiere die (null) in der Debug-Zeile, die eindeutig nicht da sein sollte -, dass der Name des Block-Gerät sein sollte. Dies ist möglicherweise eine Konsequenz der fehlgeschlagenen ioctl oder möglicherweise ein Hinweis auf ein Problem innerhalb der /sys/ Hierarchie.

BLKTRACESETUP im Kernel here behandelt. Dies ruft schließlich doblktracesetuphere. Ich kann sofort keinen Grund, warum dies nicht aus einem entsprechend genehmigten Behälter arbeiten würde, die mich Hierarchie nicht richtig eingerichtet werden könnte vermuten, dass Ihre /sys macht. Aber die Ausgabe von strace wäre hilfreich.

Auch die unvermeidliche Kommentar: Warum sind Sie dies in einem Behälter zu tun? Warum nicht außerhalb des Containers laufen?

EDIT: Sieht so aus, als ob es eine Kernel-Sache sein könnte. Siehe https://github.com/scaleway/kernel-tools/issues/107 - dies deutet darauf hin, dass Sie (a) die spezifischen Module zuerst modifizieren müssen und (b) möglicherweise einen bestimmten Kernel benötigen.

+0

@albigh aktualisierte Frage. –