Скидання контролера MMC без фізичного виймання картки?


9

Я намагаюся врятувати дані з 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

Відповіді:


4

У мене виникла та сама проблема (помилки вводу / виводу, як показано вище) після зміни SD-карт на льоту вбудованому пристрої (Кобо-читач книг Kobo). Він не виявить нову карту, її ємність тощо, і натомість очікує, що стара карта все ще буде присутня.

Перезавантажити модуль було неможливо, оскільки драйвер був вбудований. device/deleteабо host/scanне було доступно. Якщо встановити "знімний" параметр модуля, він не змусив його працювати.

У моєму випадку рішенням було unbind, а згодом bind, драйвер блокового пристрою 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

Приємно, що це впливає лише на пристрій, який вас цікавить. Якщо у зовнішньому слоті є ще одна карта (той же драйвер, /dev/mmcblk1), це не впливає.


2

Ви можете спробувати скинути пристрій SATA, виконавши такі дії:

Якщо припустити , що пристрій називається: /dev/mmcblk0p1.

  1. Дізнайтеся, до якого контролера приєднано пристрій (нам це знадобиться пізніше):

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

    ПРИМІТКА: Цікава частина, якщо відповідь - хост1, який ідентифікує контролер.

  2. Відключіть пристрій

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

    ПРИМІТКА: Це видалить пристрій з шини (логічно). Шукайте dmesgпідтвердження.

  3. Перевірити контролер

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

    ПРИМІТКА: host1 - це ідентифікатор з першого кроку. Знову ж, dmesgслід показати, що пристрій перекривається.

Список літератури

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.