Я намагаюся врятувати дані з SDHC-картки за допомогою ddrescue:
while true ; do ddrescue -d /dev/mmcblk0p1 mmc.img mmc.log ; done
Контролер, я не впевнений, чи є той, який знаходиться на картці, або той, що знаходиться в моєму ноутбуці, здається, повертає помилки для всіх секторів (що відображається в syslog) після того, як прочитана певна кількість поганих секторів (які не ' я з'явився в syslog), я виявив, що вискакування картки в слот знову скидає це і повідомляє про хороші сектори як хороші знову, поки не буде прочитано занадто багато поганих секторів тощо.
В даний час я використовую цю петлю, стежу за виведенням стану ddrescue, скидаючи карту вручну. Чи є спосіб скинути контролер, не виймаючи карту, щоб процес порятунку міг працювати без нагляду?
Можливо, це пов’язано, але в цьому ноутбуці Dell, щоб читач навіть помітив карту, яку потрібно вставити, це потрібно зробити під час завантаження або використання echo 1 > /sys/bus/pci/rescan
, але лише один раз, після цього з'явиться пристрій зчитування PCI, і все працює як слід:
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
Відповідний системний журнал:
# 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
Я також спробував використовувати зчитувач USB-карт, замість того, щоб генерувати ці помилки в syslog, він просто зникає і його потрібно повторно підключити, щоб продовжити.
Здається, що перезавантаження sdhci_pci
модуля робить трюк, але мені цікаво, чи є для цього менш жорстокий варіант:
while sleep 1 ; do
ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log
modprobe -r sdhci_pci
modprobe sdhci_pci
done