MMC-Controller zurücksetzen, ohne die Karte physisch zu entfernen?


9

Ich versuche, Daten von einer SDHC-Karte mit ddrescue zu retten:

while true ; do ddrescue -d /dev/mmcblk0p1 mmc.img mmc.log ; done

Der Controller, bei dem ich nicht sicher bin, ob er sich auf der Karte oder in meinem Laptop befindet, scheint Fehler für alle Sektoren (die im Syslog angezeigt werden) zurückzugeben, nachdem eine bestimmte Anzahl fehlerhafter Sektoren gelesen wurde (die nicht angezeigt werden). t im Syslog angezeigt), habe ich festgestellt, dass das erneute Einstecken der Karte in den Steckplatz dies zurücksetzt und gute Sektoren wieder als gut meldet, bis zu viele schlechte Sektoren gelesen wurden, und so weiter.

Derzeit verwende ich diese Schleife, behalte die Statusausgabe von ddrescue im Auge und setze die Karte manuell zurück. Gibt es eine Möglichkeit, den Controller zurückzusetzen, ohne die Karte zu entfernen, damit der Rettungsprozess unbeaufsichtigt ausgeführt werden kann?

Möglicherweise hängt dies damit zusammen, aber damit der Leser bei diesem Dell-Laptop überhaupt bemerkt, dass eine Karte eingesetzt wurde, muss dies während des Startvorgangs oder der Verwendung erfolgen echo 1 > /sys/bus/pci/rescan, jedoch nur einmal, nachdem das PCI-Gerät des Lesegeräts angezeigt wird und alles wie erwartet funktioniert:

07:00.0 System peripheral: JMicron Technology Corp. SD/MMC Host Controller (rev 30)
        Subsystem: Dell Device 046e
        Flags: bus master, fast devsel, latency 0, IRQ 16
        Memory at f0600000 (32-bit, non-prefetchable) [size=256]
        Capabilities: [a4] Power Management version 3
        Capabilities: [80] Express Endpoint, MSI 00
        Capabilities: [94] MSI: Enable- Count=1/1 Maskable- 64bit-
        Kernel driver in use: sdhci-pci

Relevantes Syslog:

# pop in card
mmc0: new SDHC card at address b368
mmcblk0: mmc0:b368 NCard 15.0 GiB (ro)
mmcblk0: p1
# ddrescue begins to read, error count increases, until at some point:
mmcblk0: error -110 transferring data, sector 12854624, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854624
mmcblk0: error -110 transferring data, sector 12854625, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854625
mmcblk0: error -110 transferring data, sector 12854626, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854626
mmcblk0: error -110 transferring data, sector 12854627, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854627
mmcblk0: error -110 transferring data, sector 12854628, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854628
# time since last successful read increases, pop out card
mmc0: Card removed during transfer!
mmc0: Resetting controller.
mmcblk0: error -123 sending status command, retrying
mmcblk0: error -123 sending status command, retrying
mmcblk0: error -123 sending status command, aborting
mmc0: card b368 removed
# GOTO 10

Ich habe auch versucht, einen USB-Kartenleser zu verwenden. Anstatt diese Fehler im Syslog zu generieren, verschwindet er einfach und muss erneut eingesteckt werden, um fortzufahren.


Es scheint, dass das Nachladen des sdhci_pciModuls den Trick macht, aber ich frage mich, ob es eine weniger Brute-Force-Option gibt, um dies zu tun:

while sleep 1 ; do
    ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log 
    modprobe -r sdhci_pci
    modprobe sdhci_pci
done

Antworten:


4

Ich hatte das gleiche Problem (E / A-Fehler wie oben gezeigt), nachdem ich SD-Karten in einem eingebetteten Gerät (Kobo eBook Reader) im laufenden Betrieb gewechselt hatte. Es würde die neue Karte, ihre Kapazität usw. nicht erkennen und stattdessen erwarten, dass die alte Karte noch vorhanden ist.

Das erneute Laden eines Moduls war nicht möglich, da der Treiber integriert war. device/deleteoder host/scanwar nicht verfügbar. Das Festlegen eines "entfernbaren" Modulparameters hat nicht funktioniert.

Die Lösung in meinem Fall war unbindund anschließend bindder Treiber für das MMC-Blockgerät.

# blockdev --getsize64 /dev/mmcblk0
3965190144
# readlink /sys/block/mmcblk0
../devices/platform/mxsdhci.2/mmc_host/mmc0/mmc0:af9e/block/mmcblk0
# echo mxsdhci.2 > /sys/bus/platform/drivers/mxsdhci/unbind
~~~ change card ~~~
# echo mxsdhci.2 > /sys/bus/platform/drivers/mxsdhci/bind
# blockdev --getsize64 /dev/mmcblk0
8168931328

Das Schöne ist, dass dies nur das Gerät betrifft, an dem Sie interessiert sind. Wenn sich eine andere Karte im externen Steckplatz befindet (derselbe Treiber /dev/mmcblk1), ist dies nicht betroffen.


2

Sie können versuchen, ein SATA-Gerät mithilfe der folgenden Schritte zurückzusetzen:

Angenommen, das Gerät heißt : /dev/mmcblk0p1.

  1. Finden Sie heraus, an welchen Controller das Gerät angeschlossen ist (wir werden dies später benötigen):

    $ readlink /sys/block/mmcblk0p1
     ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/mmcblk0p1
    

    HINWEIS: Der interessante Teil, wenn die Antwort host1 ist, der den Controller identifiziert.

  2. Trennen Sie das Gerät

    $ echo 1 > /sys/block/mmcblk0p1/device/delete
    

    HINWEIS: Dadurch wird das Gerät (logisch) vom Bus entfernt. Suchen Sie dmesgnach einer Bestätigung.

  3. Scannen Sie den Controller erneut

    $ echo "- - -" > /sys/class/scsi_host/host1/scan
    

    HINWEIS : Host1 ist die Kennung aus Schritt 1. Auch hier dmesgsollte das Gerät wiederentdeckt werden.

Verweise

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.