SDHCカードからデータを回復するためにddrescueを使用しようとしています。
while true ; do ddrescue -d /dev/mmcblk0p1 mmc.img mmc.log ; done
コントローラがカードにあるのかノートブックにあるのかはわかりませんが、特定の数の不良セクタを読み込んだ後にすべてのセクタを返すようです(これはシステムログには表示されません)。システムログに表示されます)、カードを取り出してスロットに挿入し直すと、この設定がリセットされ、不良セクタが読みすぎるまで、良好なセクタが再び良好であることが報告されます。
現在私はこのループを使って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カードリーダーを試してみましたが、システムログにこれらのエラーが発生するのではなく、消えて続行するには再接続する必要があります。
モジュールを再ロードすると問題が解決するようですが、sdhci_pci
これを行うためのあまり無差別なオプションがあるかどうか疑問に思います。
while sleep 1 ; do
ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log
modprobe -r sdhci_pci
modprobe sdhci_pci
done
答え1
内蔵デバイス(Kobo eBookリーダー)でSDカードを動的に変更した後も、同じ問題(上記のI / Oエラー)が発生しました。新しいカードや容量などは検出されませんが、古いカードがまだあると予想しています。
ドライバが組み込まれているため、モジュールを再読み込みできません。device/delete
またはhost/scan
使用できません。 「移動可能」モジュールパラメータを設定しても機能しません。
私の場合の解決策はunbind
MMCbind
ブロックデバイス用のドライバでした。
# 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
。
デバイスがどのコントローラに接続されているかを確認します(後で必要です)。
$ readlink /sys/block/mmcblk0p1 ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/mmcblk0p1
メモ:興味深いのは、答えがホスト1の場合はコントローラを識別することです。
デバイスの接続を解除
$ echo 1 > /sys/block/mmcblk0p1/device/delete
メモ:これにより、バスから(論理的に)デバイスが削除されます。入って
dmesg
確認してください。コントローラの再検索
$ echo "- - -" > /sys/class/scsi_host/host1/scan
メモ:host1 は最初のステップの識別子です。今回も
dmesg
デバイスが再発見されていることを示す必要があります。