Ripristino del controller MMC senza rimuovere fisicamente la scheda?


9

Sto cercando di recuperare i dati da una scheda SDHC usando ddrescue:

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

Il controller, non sono sicuro che sia quello sulla scheda o quello sul mio laptop, sembra restituire errori per tutti i settori (che appare in syslog) dopo che un certo numero di settori danneggiati è stato letto (che non si presentano in syslog), ho scoperto che estrarre la scheda e inserirla di nuovo nello slot reimposta questo e riporta di nuovo buoni settori fino a quando non vengono letti troppi settori danneggiati, e così via.

Attualmente sto usando questo loop, tenendo d'occhio l'output di stato di ddrescue, ripristinando la scheda manualmente. C'è un modo per ripristinare il controller senza rimuovere la scheda, quindi il processo di salvataggio può essere eseguito incustodito?

Forse questo è correlato, ma in questo laptop Dell, affinché il lettore noti anche che una scheda è stata inserita, deve essere eseguita durante l'avvio o l'utilizzo echo 1 > /sys/bus/pci/rescan, ma solo una volta dopo che viene visualizzato il dispositivo PCI del lettore e tutto funziona come previsto:

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 rilevante:

# 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

Ho anche provato a utilizzare un lettore di schede USB, invece di generare questi errori in syslog, scompare e deve essere ricollegato per continuare.


Sembra che ricaricare il sdhci_pcimodulo faccia il trucco, ma mi chiedo se ci sia un'opzione meno bruta per farlo:

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

Risposte:


4

Ho avuto lo stesso problema (errori I / O come mostrato sopra) dopo aver cambiato al volo le schede SD in un dispositivo incorporato (Kobo eBook Reader). Non rileva la nuova carta, la sua capacità e così via e si aspetta invece che la vecchia carta sia ancora presente.

Non è stato possibile ricaricare un modulo poiché il driver era integrato. device/deleteo host/scannon era disponibile. L'impostazione di un parametro del modulo "rimovibile" non ha funzionato.

La soluzione nel mio caso era quella unbinde bind, successivamente , il driver per il dispositivo a blocchi MMC.

# 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

La cosa bella è che questo influisce solo sul dispositivo che ti interessa. Se c'è un'altra scheda nello slot esterno (stesso driver /dev/mmcblk1) , non è interessata.


2

Puoi provare a ripristinare un dispositivo SATA procedendo come segue:

Supponendo che il dispositivo è denominato: /dev/mmcblk0p1.

  1. Scopri a quale controller è collegato il dispositivo (ne avremo bisogno in seguito):

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

    NOTA: la parte interessante se la risposta è host1, che identifica il controller.

  2. Disconnetti il ​​dispositivo

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

    NOTA: Questo rimuoverà il dispositivo dal bus (logicamente). Cerca dmesgconferma.

  3. Eseguire nuovamente la scansione del controller

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

    NOTA: host1 è l'identificatore dal passaggio uno. Ancora una volta, dmesgdovrebbe mostrare il dispositivo da riscoprire.

Riferimenti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.