커널 추적을 통해 오류가 발생한 SD 카드의 상태를 정의하시겠습니까?

커널 추적을 통해 오류가 발생한 SD 카드의 상태를 정의하시겠습니까?

일련의 실패/때때로 결함이 있는 SD 카드가 있습니다. dmesg다음 출력 중 하나를 제공합니다 .

완전히 죽었음(에 나열되지 않음 /dev/mmcblk0):

[  +0,000010] mmc0: error -110 whilst initializing SD card 
[  +2,819983] mmc0: card never left busy state

실패한 것(가끔 설치될 수 있음):

[Jun16 06:28] mmc0: new high speed SDHC card at address 0001
[  +0,000339] mmcblk0: mmc0:0001 00000 3.68 GiB 
[  +0,002835]  mmcblk0: p1 p2 p3 p4
[ +10,256689] mmcblk0: timed out sending r/w cmd command, card status 0x900
[ +11,264358] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000016] print_req_error: I/O error, dev mmcblk0, sector 7716736
[ +10,239972] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000018] print_req_error: I/O error, dev mmcblk0, sector 7716736
[  +0,000008] Buffer I/O error on dev mmcblk0, logical block 964592, async page read
[ +10,239931] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000009] print_req_error: I/O error, dev mmcblk0, sector 81792
[Jun16 06:29] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000020] print_req_error: I/O error, dev mmcblk0, sector 1066880
[ +10,240219] mmcblk0: timed out sending r/w cmd command, card status 0x900
[  +0,000011] print_req_error: I/O error, dev mmcblk0, sector 2101120

내가 가진 가장 좋은 점 error -110은 바로 그것이다.정지시키다어느 정도까지는 SDCard에서 실제로 무슨 일이 일어나는지에 대해서는 알려진 바가 거의 없습니다.

이렇게 된 배경

작업 중인 일부(임의로 보이는) 내장 장치에서 SD 카드가 이러한 상태로 표시되며 이것이 SD 카드가 손상된 문제인지 아니면 컨트롤러 드라이버에 문제가 있는 것인지 이해하려고 노력 중입니다. 그것은 카드 부패를 촉진하고 있습니다.

카드 중 5% 정도가 완전히 소멸되었는데, 다른 카드에도 이런 일이 발생하는지 확인 중입니다.

SD 카드에 문제 재현을 강제로 시도했지만, 테스트한 SD 카드(동일 브랜드, 동일 유형, 동일 소프트웨어)에서는 테스트의 일부로 수백 기가바이트의 데이터를 지속적으로 썼음에도 마모 흔적이 나타나지 않았습니다. 나는 사용한다압력판그런 이유로.

장치의 전원이 얼마나 자주 끊기는지는 모르겠지만 전원은 장치의 다른 모든 요구 사항을 잘 충족하는 일반 2A AC-DC 어댑터입니다.

고쳐 쓰다

질문은 helps me prevent failed SD cards in the future의 반대말로 끝나거나 대답할 것을 제안하는 것 같습니다 using Linux to diagnose what is the current state of the SDcards.

다시 말하면 다음과 같습니다.

Linux에서 SD 카드 오류를 분석하는 가장 철저한 방법은 무엇입니까?

  • 더 많은 정보를 얻기 위해 MMC 하위 시스템에 대한 디버그 로깅을 활성화할 수 있습니까?
  • 무엇인가요 card status 0x900?
  • 카드에 오류가 발생하기 시작했다는 표시를 얻기 위해 사용자 공간에서 SD 버스나 SD 버스 통신을 스니핑하는 것이 가능합니까?

답변1

이는 다른 어떤 것보다 하드웨어/사용 사례 문제처럼 보입니다. 아마도 Linux 기술보다 상식이 더 중요할 것입니다. 카드, MySQL/Apache/컴파일 등에 대한 I/O...syslog/자주 시스템 업데이트를 많이 하시나요? ——Rui F Ribeiro의 코멘트

위에서 설명한 내용을 확장할 수 있습니다. 그러나 나는 첫 번째 요점에 동의하고 이것이 첫 번째 질문이라는 데 동의합니다.


  • MMC 하위 시스템에 대한 일부 디버그 로깅을 활성화해야 합니까?
  • 무슨 일이 일어나고 있는지 알아낼 수 있는 사용자 공간 도구가 있나요?
  • 오류 코드를 더 의미있게 만들려면 어떻게 해야 합니까?

실패 귀인에 대한 나의 유일한 확신은 하위 수준 명령의 특정 오류보다 내가 얻은 "역사"와 일반적인 결과에서 더 많이 나옵니다. 그럼에도 불구하고, 구현 방식이 다를 수 있습니다.

SSD를 사용해도 합리적인 브랜드의 SSD는 이미 가지고 있다고 생각합니다.잘못된 데이터를 반환합니다.I/O 오류를 대체합니다. 이는 확실히 많은 SSD의 알려진 오류 모드 중 하나입니다. [2013년][2017년]. (이는 보다 관리하기 쉬운 오류 모드 세트를 기대하는 최신 파일 시스템 및 데이터베이스 구현에 익숙한 사람들에게는 놀라운 일이 될 수 있습니다.) 여기에 연결한 문서는 반환된 데이터에 중점을 두고 있으며, 이미 측정한 데드 드라이브/불량 섹터 구분 외에는 보고된 오류를 더 이상 구분하지 않습니다.

내 SSD 오류는 한 번 "수리"된 후 다시 오류를 표시하기 시작한 "판매자 리퍼브" 노트북에서 발생했습니다. 링크된 파일에서와 같이 드라이브에 전원 손실이 발생할 수 있습니다. 또한 안정적인 전압 레벨을 제공하지 못할 수도 있습니다.

이것이 SD 카드가 손상되는 문제인지, 아니면 컨트롤러 드라이버에 문제가 있어 카드가 손상되는 것인지 이해하려고 노력 중입니다.

좋은 하드웨어와 좋은 전원 공급 장치는 좋은 SD 카드를 손상시키지 않습니다.~하지 않는 한당신은 그것에 너무 많은 무게를 싣고 있습니다. 작업량은 매우 중요한 변수입니다, 당신은 [처음에] 언급하지 않았습니다. 이러한 메모리 카드는 미디어 파일을 저장하는 데 상대적으로 까다롭지 않은 사용을 위해 설계된 상대적으로 작고 저렴한 하드웨어입니다(MMC, "MultiMediaCard"). 특히 저렴한 제품이 "웨어 레벨링"(핫 논리 블록의 로드를 다수의 물리적 블록에 재분배하는 것)에 반드시 좋은 것은 아닙니다.

매일 cron 작업을 실행하도록 예약하기 위해 빠른 해킹으로 작업량을 측정했습니다 tunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log.

하지만 작업 부하를 제쳐두고 지금까지 제공하신 정보를 바탕으로 컨트롤러 측 문제가 있을 수 있다고 생각하시는 것이 옳습니다. 포켓 장치에서 쓰기 때문에(아마도 배터리가 부족할 때) SD 카드에 불량 섹터가 반복적으로 발생합니다. 동명 브랜드의 카드입니다. 섹터는 복구 가능하며 여전히 동일한 카드를 사용하고 있습니다. 또한 이 카드에서 일종의 짧은 초기화 실패를 경험했습니다.생각하다불량 섹터와도 관련이 있었지만(초기화 실패를 극복한 후) 제가 잘못 기억하고 있을 수도 있습니다.

일련의 실패/때때로 결함이 있는 SD 카드가 있습니다.

귀하의 [원본] 질문에서 제가 받은 인상은 이것이 소규모 작업이며 다양한 카드, 컨트롤러 및 작업 부하를 사용하여 엄격한 테스트 매트릭스를 실행하는 것은 과잉이라는 것입니다.

작업 부하 후에 제어하는 ​​첫 번째 변수는 카드입니다.

2018년에 글을 쓰다 보면, SD 카드의 '표준'이라 할 수 있는 세계적으로 유명한 브랜드가 있습니다.

결과 보기:https://www.amazon.com/s/field-keywords=sd+card

- 그리고 고려해야 할 여러 소매 채널이 있기를 원합니다. 최소한 비교할 수 있을 만큼 신뢰할 수 있어야 합니다. (다양한 인기 온라인 소매업체가 "마켓플레이스" 역할을 하며 자체 상품을 판매한다는 점을 명심하세요.)

공식 Raspbery PI 하드웨어도 허용될 수 있습니다. 즉, SD 카드는 소형 마더보드 컴퓨터에서 Linux를 실행하기 위해 공식적으로 판매되며 잘 작동하는 것으로 알려졌습니다. (미디어 파일보다 더 까다로운 작업 부하)

요약하자면, 꼭 필요한 것보다 더 빠른 카드를 얻는다면 내구성 등급도 더 높아질 수 있다고 주장하고 싶습니다. (내구성보다 속도 등급을 얻는 것이 더 쉬운 경향이 있다는 점을 고려하십시오.)

이 두 변수를 제어/측정하면 나머지 관련 하드웨어에 판단을 집중할 수 있습니다.


실패함(가끔 설치될 수도 있음)

가장 일반적인 경우, 장치에 잘못 기록되었다고 생각되면 이 오류를 해결해 볼 수 있습니다.

  1. 필요한 경우 어떤 데이터를 복구할 수 있나요?
  2. 그런 다음 불량 블록을 읽으려는 시도를 중지하십시오. 전체 형식(파티션 테이블 + 파일 시스템)을 다시 생성하면 됩니다.
  3. 그러나 확실하지 않고 장치가 여전히 작동하지 않을 수 있다고 생각되면 테스트해 볼 수도 있습니다.

당신처럼 좋은 기본 MMC 하드웨어가 있다면 Linux 명령을 blkdiscard더 많은 명령으로 사용할 수 있습니다효율적인장치를 "재포맷"하기 전에 장치의 모든 블록을 지우는 테스트 방법입니다. 그러나 전체 드라이브를 0으로 덮을 때 오류를 테스트하는 것과 비교할 때 효율성은 유일한 이점입니다 dd bs=1M if=/dev/zero of=/dev/mmcblk0. (그리고 어떤 필요도 피하는 것쓰다이론적으로 지워진 블록은 blkdiscard나중에 "새것과 같은" 성능을 더 많이 제공하고 장치에 더 많은 자유를 부여하여 내구성을 향상시킬 수도 있습니다.

(SATA 드라이브인 경우 전체 논리 드라이브 내용을 삭제하는 전용 "Secure Erase" 명령이 있습니다(참고자료 참조 man hdparm). 그러나 이에 상응하는 MMC 명령이 있는지는 모르겠습니다. 일부 SSD 공급업체에서는 이 명령을 사용하여 다음을 수행합니다. 동등한 시퀀스를 사용하여 "새 제품으로" 성능을 복원할 수 없는 문제를 해결하기 위해 제품 블록 맵을 재설정합니다 blkdiscard.아니요전체 드라이브 지우기를 테스트해야 합니다. 경우에 따라 내부 암호화 키만 삭제됩니다.

당신이 나에게 내 오류가 어떤 것인지 묻기 때문에

최근 SanDisk micro-SD 카드에 문제가 발생했습니다. 아래의 특정 오류는 불안정한 연결로 인해 발생한 것으로 보입니다. 페티쉬를 통해 모든 금속 패드를 불어낸 후 micro-SD를 제거하고 micro-SD를 SD 어댑터에 다시 삽입하면 문제가 해결됩니다.

Dell Latitude E5450 노트북(커널 드라이버, Fedora Linux 커널 버전 약 v4.17)의 카드 리더에서 sdhci-pci카드를 초기화할 수 없습니다. 내 SheevaPlug에서 (이 문제), 카드를 초기화할 수 있는 것 같지만 IO 오류가 표시됩니다. Dell에서 오류 처리 시간 초과가 잘못 설정되었을 수 있습니다.

작은 골짜기:

[    2.436566] mmc0: Unknown controller version (3). You may experience problems.
[    2.449019] mmc0: SDHCI controller on PCI [0000:01:00.0] using ADMA
...
[509227.374012] mmc0: error -84 whilst initialising SD card
[509227.621510] mmc0: error -84 whilst initialising SD card
[509227.865472] mmc0: error -84 whilst initialising SD card
[509228.142120] mmc0: error -84 whilst initialising SD card

셰바 프라그:

[6076613.118617] mmcblk0: mmc0:aaaa SC16G 14.8 GiB 
[6076613.295811] mmcblk0: error -110 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[6076613.545740] mmcblk0: error -110 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[6076613.555301] mmcblk0: retrying using single block read
[6076613.728413] mmcblk0: error -110 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[6076613.737965] blk_update_request: I/O error, dev mmcblk0, sector 0
[6076613.912043] mmcblk0: error -110 transferring data, sector 1, nr 7, cmd response 0x900, card status 0x0
[6076613.921599] blk_update_request: I/O error, dev mmcblk0, sector 1
...

관련 정보