Kartı fiziksel olarak çıkarmadan MMC denetleyicisini sıfırlama?


9

Ben ddrescue kullanarak bir SDHC karttan veri kurtarmak için çalışıyorum:

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

Denetleyici, karttaki veya dizüstü bilgisayarımdaki kartın olup olmadığından emin değilim, belirli sayıda kötü sektör okunduktan sonra (hangi don ' t sistem günlüğünde görünmez), kartı tekrar açıp yuvaya tekrar takmanın bunu sıfırladığını ve çok fazla kötü sektör okunana kadar iyi sektörleri tekrar iyi rapor ettiğini fark ettim.

Şu anda bu döngüyü kullanıyorum, kartı manuel olarak sıfırlayarak ddrescue'nun durum çıkışını takip ediyorum. Kurtarma işleminin kartı çıkarmadan sıfırlamanın bir yolu var, böylece kurtarma işlemi katılımsız çalışabilir mi?

Belki de bu, ancak bu Dell dizüstü bilgisayarda, okuyucunun bir kartın takıldığını bile fark edebilmesi için, önyükleme veya kullanım sırasında yapılması gerekir echo 1 > /sys/bus/pci/rescan, ancak bundan sonra yalnızca bir kez, okuyucu PCI cihazı göründükten sonra ve her şey beklendiği gibi çalışır:

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

İlgili sistem günlüğü:

# 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

Ayrıca bir USB kart okuyucu kullanmayı denedim, bu hataları syslog'da oluşturmak yerine, sadece kayboluyor ve devam etmek için yeniden takılması gerekiyor.


sdhci_pciModülün yeniden yüklenmesi hile yapar gibi görünüyor , ancak bunu yapmak için daha az kaba kuvvet seçeneği olup olmadığını merak ediyorum:

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

Yanıtlar:


4

Gömülü bir cihazda (Kobo eBook Reader) anında SD kartları değiştirdikten sonra aynı sorunla karşılaştım (yukarıda gösterildiği gibi G / Ç hataları). Yeni kartı, kapasitesini vb. Algılamaz ve bunun yerine eski kartın hala mevcut olmasını bekler.

Sürücü yerleşik olduğundan bir modülü yeniden yüklemek mümkün değildi. device/deleteveya host/scanmevcut değildi. Bir "çıkarılabilir" modül parametresi ayarlamak, onu çalışmadı.

Benim durumumdaki çözüm , MMC blok cihazının sürücüsüne unbindve daha sonra bindsürücüye oldu.

# 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

Güzel olan şey, bu sadece ilgilendiğiniz cihazı etkiler. Harici yuvada (aynı sürücü /dev/mmcblk1) başka bir kart varsa etkilenmez.


2

Aşağıdaki adımları kullanarak bir SATA cihazını sıfırlamayı deneyebilirsiniz:

Cihazı varsayarsak adlandırılır: /dev/mmcblk0p1.

  1. Cihazın hangi kontrol cihazına bağlı olduğunu öğrenin (buna daha sonra ihtiyacımız olacak):

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

    NOT: Yanıt denetleyiciyi tanımlayan host1 ise ilginç kısımdır.

  2. Cihazın bağlantısını kesin

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

    NOT: Bu işlem, veriyolundan (mantıksal olarak) kaldırır. dmesgOnay için bakın .

  3. Denetleyiciyi yeniden tarayın

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

    NOT: host1, birinci adımdaki tanımlayıcıdır. Yine, dmesgcihazın yeniden keşfedildiğini göstermelidir.

Referanslar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.