Zerowanie kontrolera MMC bez fizycznego wyjmowania karty?


9

Próbuję uratować dane z karty SDHC za pomocą narzędzia ddrescue:

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

Kontroler, nie jestem pewien, czy jest to ten na karcie, czy ten w moim laptopie, wydaje się zwracać błędy dla wszystkich sektorów (co pojawia się w dzienniku systemowym) po odczytaniu pewnej liczby uszkodzonych sektorów (które nie „ pojawi się w syslog), znalazłem, że wyjęcie karty z powrotem do gniazda resetuje to i zgłasza dobre sektory jako dobre, dopóki nie zostanie odczytanych zbyt wiele uszkodzonych sektorów i tak dalej.

Obecnie używam tej pętli, obserwując dane wyjściowe statusu ddrescue, ręcznie resetując kartę. Czy istnieje sposób na zresetowanie kontrolera bez wyjmowania karty, aby proces ratowania mógł przebiegać bez nadzoru?

Być może jest to powiązane, ale w tym laptopie Dell, aby czytelnik nawet zauważył, że karta została włożona, należy to zrobić podczas rozruchu lub używania echo 1 > /sys/bus/pci/rescan, ale tylko raz, po czym pojawia się urządzenie PCI czytnika i wszystko działa zgodnie z oczekiwaniami:

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

Odpowiedni 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

Próbowałem także użyć czytnika kart USB, zamiast generowania tych błędów w syslog, po prostu znika i trzeba go ponownie podłączyć, aby kontynuować.


Wygląda na to, że przeładowanie sdhci_pcimodułu załatwi sprawę, ale zastanawiam się, czy istnieje opcja mniej brutalnej siły:

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

Odpowiedzi:


4

Miałem ten sam problem (błędy we / wy, jak pokazano powyżej) po zmianie kart SD w locie w urządzeniu osadzonym (eBook Reader Kobo). Nie wykryłby nowej karty, jej pojemności itd. I zamiast tego oczekiwałby, że stara karta będzie nadal obecna.

Ponowne załadowanie modułu nie było możliwe, ponieważ sterownik był wbudowany. device/deletelub host/scannie był dostępny. Ustawienie parametru modułu „wymiennego” nie działało.

Rozwiązaniem w moim przypadku było unbind, a następnie bindsterownik urządzenia blokowego 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

Zaletą jest to, że wpływa to tylko na urządzenie, które Cię interesuje. Jeśli w zewnętrznym gnieździe jest inna karta (ten sam sterownik /dev/mmcblk1), nie ma to wpływu.


2

Możesz spróbować zresetować urządzenie SATA, wykonując następujące czynności:

Zakładając, że urządzenie o nazwie: /dev/mmcblk0p1.

  1. Dowiedz się, do którego kontrolera podłączone jest urządzenie (będziemy tego potrzebować później):

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

    UWAGA: Interesującą częścią jest odpowiedź host1, która identyfikuje kontroler.

  2. Odłącz urządzenie

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

    UWAGA: Spowoduje to usunięcie urządzenia z magistrali (logicznie). Poszukaj dmesgpotwierdzenia.

  3. Ponownie zeskanuj kontroler

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

    UWAGA: host1 jest identyfikatorem z kroku pierwszego. Ponownie dmesgpowinien pokazać urządzenie, które zostało ponownie odkryte.

Bibliografia

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.