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

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

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사용할 수 없습니다. "이동 가능" 모듈 매개변수를 설정해도 작동하지 않습니다.

내 경우의 솔루션은 unbindMMC 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.

  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장치가 재발견되고 있음이 표시되어야 합니다.

인용하다

관련 정보