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_pci
Moduls 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