카드를 물리적으로 제거하지 않고 MMC 컨트롤러를 재설정 하시겠습니까?


9

ddrescue를 사용하여 SDHC 카드에서 데이터를 구출하려고합니다.

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

컨트롤러가 카드 또는 랩톱에있는 컨트롤러인지 확실하지 않은 경우 특정 수의 불량 섹터를 읽은 후 (syslog에 표시되는) 모든 섹터에 대해 오류를 반환하는 것 같습니다. t는 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

관련 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

또한 syslog에서 이러한 오류를 생성하는 대신 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

답변:


4

임베디드 장치 (Kobo eBook Reader)에서 SD 카드를 즉시 변경 한 후 동일한 문제 (위의 I / O 오류)가 발생했습니다. 새 카드, 용량 등을 감지하지 못하고 기존 카드가 여전히 존재할 것으로 예상합니다.

드라이버가 내장되어 모듈을 다시로드 할 수 없습니다. 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은 1 단계의 식별자입니다. 다시, dmesg장치가 재발견되고 있음을 보여 주어야합니다.

참고 문헌

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.