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
MMC bind
블록 장치용 드라이버였습니다.
# 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
장치가 재발견되고 있음이 표시되어야 합니다.