Estou tentando recuperar dados de um cartão SDHC usando o ddrescue:
while true ; do ddrescue -d /dev/mmcblk0p1 mmc.img mmc.log ; done
O controlador, não tenho certeza se é o que está no cartão ou no meu laptop, parece retornar erros para todos os setores (que aparece no syslog) após a leitura de um certo número de setores defeituosos (que não são " (apareça no syslog), descobri que colocar o cartão no slot novamente redefine isso e relata bons setores como bons novamente até que muitos setores ruins tenham sido lidos e assim por diante.
Atualmente, estou usando esse loop, mantendo um olho na saída de status do ddrescue, redefinindo o cartão manualmente. Existe uma maneira de redefinir o controlador sem remover a placa, para que o processo de resgate possa ser executado sem supervisão?
Talvez isso esteja relacionado, mas neste laptop da Dell, para o leitor perceber que um cartão foi inserido, ele deve ser feito durante a inicialização ou o uso echo 1 > /sys/bus/pci/rescan
, mas apenas uma vez, depois que o dispositivo PCI do leitor aparecer e tudo funcionar como esperado:
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
Syslog relevante:
# 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
Também tentei usar um leitor de cartão USB, em vez de gerar esses erros no syslog, ele simplesmente desaparece e precisa ser reconectado para continuar.
Parece que recarregar o sdhci_pci
módulo faz o truque, mas me pergunto se há uma opção com menos força bruta para fazer isso:
while sleep 1 ; do
ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log
modprobe -r sdhci_pci
modprobe sdhci_pci
done