Определение состояния неисправных SD-карт путем трассировки ядра?

У меня есть серия неисправных / иногда неисправных SD-карт. Они либо дают один из следующих выводов dmesg :

Полностью мертвые (не /dev/mmcblk0 в /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-картами или что-то не так с драйвером controllerа, который подталкивает карты к коррупции.

Около 5% карт полностью умерли, и я пытаюсь понять, чего ожидать от других.

Я пытался заставить SD-карту воспроизвести проблему, но тестируемые (той же марки, устройства того же типа с тем же программным обеспечением) не показывают следов износа после сотен ГБ данных, записанных на них в непрерывном режиме. как часть теста. Я использую стресс-диск для этого.

У меня нет информации о том, как часто устройство могло внезапно потерять питание, а блок питания представляет собой обычный адаптер переменного тока на 2 А, который работает нормально для всех других потребностей устройства.

Обновить

Похоже, что вопрос предлагается закрыть или ответить таким образом, который helps me prevent failed SD cards in the future а не using Linux to diagnose what is the current state of the SDcards .

Позвольте мне тогда перефразировать:

Каким самым тщательным образом можно проанализировать сбой SD-карты в Linux?

  • Можно ли включить журналы отладки для подсистемы MMC, чтобы получить больше информации?
  • Что такое card status 0x900 ?
  • Можно ли прослушивать связь по SD-шине или SD-шине из пользовательского пространства, чтобы получить признаки того, что карта начинает выходить из строя?

Это кажется скорее проблемой аппаратного обеспечения / варианта использования, чем чем-то другим. Могу поспорить, что здравый смысл здесь может быть важнее, чем навыки Linux. Вы делаете тяжелый ввод-вывод в карты, MySQL / Apache / компиляция вещи … системный журнал / частые обновления системы? – комментарий Руи Ф. Рибейро

Я могу расширить на выше. Но я согласен с первым пунктом, и я согласен, что это был первый вопрос, который нужно задать.


  • Должен ли я включить некоторые журналы отладки для подсистемы MMC?
  • Есть ли инструмент пользовательского пространства, который может понюхать, что происходит?
  • Как сделать так, чтобы коды ошибок имели больше смысла?

Единственное доверие, которое я получил от приписывания сбоев, было больше связано с «историей» и общими результатами, которые я получаю, а не с конкретными ошибками команд низкого уровня. Которые в любом случае могут различаться в зависимости от реализации.

Я полагаю, что даже с твердотельным накопителем от разумного бренда я получил неверные данные вместо ошибок ввода-вывода. Это, безусловно, один из известных режимов отказа во многих SSD. [ 2013 ] [ 2017 ]. (Возможно, удивительно для людей, знакомых с современными файловыми системами и реализациями баз данных, которые часто надеются на более управляемый набор режимов сбоя). Обратите внимание, что документы, на которые я ссылаюсь здесь, сосредоточены на возвращенных данных; они больше не делали различий в сообщаемых ошибках, за исключением разницы между неисправным диском и неисправным сектором, которую вы уже измерили.

Моя ошибка SSD была на ноутбуке, «отремонтированном продавцом», который уже однажды «ремонтировался» и снова начинал показывать сбои, что, вероятно, приводило к прерыванию питания привода, как в связанных документах. Возможно, также не удалось обеспечить стабильные уровни напряжения.

Я пытаюсь понять, если это проблема плохих SD-карт или может быть что-то не так с драйвером controllerа, который толкает карты к повреждению.

Хорошее оборудование с хорошим питанием от сети обычно не портит хорошую SD-карту – если только вы не загружаете ее слишком сильно. Рабочая нагрузка является очень важной переменной о котором вы [изначально] не упомянули , Эти карты памяти являются относительно небольшими, как правило, дешевым оборудованием, которое разработано для относительно нетребовательного хранения мультимедийных файлов (отсюда MMC, «MultiMediaCard»). Особенно дешевые из них не обязательно будут хороши в «выравнивании износа» (перераспределение нагрузки от логических блоков горячей точки на большое количество физических блоков).

Я измерил рабочую нагрузку быстрым взломом, запланировал ежедневное задание cron для запуска tunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log tunefs -l /dev/mmcblk0p4 | grep writes >> /var/log/writes.log .

Но если мы отложим рабочую нагрузку в сторону, вы будете правы при рассмотрении возможной проблемы на стороне controllerа из предоставленной вами информации. У меня на SD-карте повторялись плохие сектора из-за записи с карманного устройства, возможно, при низком заряде батареи. Это была карточка от одного имени бренда. Секторы были восстановимы, и я все еще использую ту же карту. У меня также была какая-то временная ошибка инициализации на этой карте, я думаю , что это было связано и с плохими секторами (как только я прошел через ошибку инициализации), но я мог неправильно запомнить.

У меня есть серия неисправных / иногда неисправных SD-карт.

Из вашего [оригинального] вопроса у меня сложилось впечатление, что это мелкомасштабная операция, и выполнение строгой тестовой матрицы с различными картами, controllerами и рабочими нагрузками было бы излишним.

После рабочей нагрузки первой переменной, которую вы контролируете, является карта.

Написание в 2018 году, есть одно глобальное имя бренда, который можно считать «каноническим» для SD-карт –

см. результаты по адресу: https://www.amazon.com/s/field-keywords=sd+card

– и, надеюсь, у вас есть несколько каналов розничной торговли, которые можно считать … по крайней мере, достаточно надежными для сравнения. (Помня, что различные популярные интернет-магазины действуют как «торговая площадка», а также продают свои товары).

Официальное оборудование Raspbery PI также может быть приемлемым. Т.е. SD-карты, официально продаваемые для запуска Linux на небольшом настольном компьютере, работают хорошо. (Быть более требовательным, чем мультимедийные файлы).

В качестве широкой кисти, если вы получаете карту, которая быстрее, чем вам строго нужно, я также считаю это потенциально более высоким показателем выносливости. (Учитывая, что рейтинг скорости, как правило, гораздо более доступен, чем выносливость).

Если вы контролируете / измеряете эти две переменные, то вы можете сосредоточить свои суждения на остальной части соответствующего оборудования.


Неисправные (иногда могут быть установлены)

Обратите внимание, что в самом общем случае, если вы считаете, что устройство написано плохо, вы можете попытаться устранить эту ошибку:

  1. восстановить, какие данные вы можете при желании
  2. тогда перестаньте пытаться читать плохие блоки. просто воссоздайте все форматирование (таблица разделов + файловая система).
  3. но если вы не уверены и думаете, что устройство все еще умирает, вы, вероятно, также захотите проверить его.

Если у вас хорошее встроенное аппаратное обеспечение MMC, как у вас, вы можете использовать команду Linux blkdiscard в качестве более эффективного способа проверки стирания всех блоков устройства перед его «переформатированием». Но эффективность является единственным преимуществом по сравнению с тестированием на ошибки при перезаписи всего диска нулями, т.е. dd bs=1M if=/dev/zero of=/dev/mmcblk0 . (Помимо того, что избегая необходимости писать стертые блоки, blkdiscard может blkdiscard обеспечить более «новую» производительность и увеличить выносливость, предоставив устройству немного больше свободы).

(Если это был диск SATA – есть специальная команда «безопасного стирания» для удаления всего содержимого логического диска (см. man hdparm ). Однако я не знаю ни одной эквивалентной команды MMC. Некоторые поставщики твердотельных накопителей воспользовались этой командой, чтобы сбросьте их таблицы сопоставления блоков, как обходной путь для их неспособности восстановить производительность «как новый» с эквивалентной последовательностью blkdiscard . Обратите внимание, что эта команда не обязательно проверяет полное blkdiscard диска. В некоторых случаях она только удалит внутренний ключ шифрования ).

Так как вы спросили, как выглядят мои ошибки

Моя карта памяти SanDisk micro-SD недавно возобновилась. Кажется, конкретные ошибки, приведенные ниже, были связаны с нестабильным соединением. Эта проблема была решена путем удаления и повторной вставки micro-SD в адаптер micro-SD to SD, после суеверного обдува всех металлических подушек.

В считывающем устройстве на моем ноутбуке Dell Latitude E5450 ( sdhci-pci ядра sdhci-pci , версия ядра Fedora Linux около v4.17) не удалось инициализировать карту. На моем SheevaPlug (те же сведения об оборудовании и программном обеспечении, что и в этом вопросе ) эта карта, похоже, была в состоянии инициализироваться, но показала ошибки ввода-вывода. Возможно, на Dell таймауты обработки ошибок установлены не совсем правильно.

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 

SheevaPlug:

 [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 ...