Как проверить физическое состояние USB-накопителя в Linux?

85

Как проверить состояние здоровья USB-накопителя?

Как я узнаю, что USB неисправен или не подлежит ремонту?

valpa
источник
12
Выброси это. Ваше затраченное время дороже, чем покупка нового.
mailq
1
Я должен согласиться с @mailq. Вы можете купить приличный 4 ГБ флэш-накопитель за 2 доллара в эти дни.
iglvzx
17
@iglvzx Ну, вопрос не говорит, дешевый ли он, или какой-нибудь быстрый + 32Gb с шифрованием ...
Вареса

Ответы:

69

Невозможно запросить карту памяти USB для SMART-подобных параметров; Я не знаю ни о каких картах памяти, которые поддерживают это даже через общедоступное проприетарное программное обеспечение. Лучшее, что вы можете сделать, это проверить, что вы можете успешно читать + писать на все устройство, используя badblocks.

https://en.wikipedia.org/wiki/Badblocks

Вы хотите указать один из тестов записи, который сотрет все данные с флешки; сначала сделайте резервную копию.

Найдите устройство, посмотрев dmesgпосле подключения USB-накопителя; вы увидите имя устройства (скорее всего, sd_, т.е. sdc, sdd и т. д.) и информацию о производителе. Убедитесь, что вы используете правильное устройство!

Если флешка отформатирована с допустимой файловой системой, вам может понадобиться unmountсначала.

Пример синтаксиса для USB-накопителя, перечисляемого как / dev / sdz, с выводом информации о ходе выполнения, с тестом на уничтожение данных и журналом ошибок, записанным в usbstick.log:

sudo badblocks -w -s -o usbstick.log /dev/sdz

После этого вам нужно будет перераспределить и переформатировать флешку, если она пройдет; этот тест сотрет все на флешке. Любые сбои указывают на сбой контроллера памяти устройства или на нем закончились запасные блоки для переназначения сбойных блоков. В этом случае ни одна область устройства не может быть доверенной.

Бретт Дайкман
источник
21
Badblocks, вероятно, лучший вариант. комментарии, в которых говорится «не стоит», полностью пропускают несколько случаев, когда это может быть очень необходимо (например, компания, возможно, купила флэш-накопители товаров и хотела бы увидеть, насколько сильно они были обмануты ...)
Richlv
2
как указано в статье в википедии, ссылка также на e2fsck -cто, что она использует badblocksи эффективно скрывает эти блокираторы от файловой системы, таким образом избегая поврежденных записей. Однако следует отметить, что, если на диске появились новые поврежденные блоки, возможно, он поврежден, а новые могут появиться позже, то есть срок его службы сокращается, и вам следует подумать о его замене.
igorsantos07
1
Я предлагаю добавить флаг -v, а также увидеть ошибку в окнах терминала. (например, если вы позволите ему работать в течение ночи. Лог-файл не так полезен для быстрого просмотра того, насколько он плох.
Тило
@BeeDee, мы должны использовать целое устройство или просто какой-то раздел, или это не имеет значения? Я имею в виду / dev / sdz или / dev / sdz1?
г-н П
1
@ Писек, вы должны использовать целое устройство, потому что оно выходит из строя, а не просто раздел.
Привет, Ангел,
21

Через [ubuntu] Ошибка Проверьте USB Flash Drive , я в конце концов нашел это, что может быть полезно:

Я пришел в блоги Fight Flash Fraud и SOSFakeFlash, которые рекомендуют программное обеспечение H2testw (см. Здесь или здесь) для тестирования флэш-памяти. Я скачал H2testw и обнаружил две проблемы с ним: (1) это только для Windows, и (2) это не с открытым исходным кодом. Тем не менее, его автор был достаточно любезен, чтобы включить текстовый файл, который объясняет, что он делает; эта страница о моей реализации этого алгоритма на GPLv3.
Моя реализация проста и надежна, и я не знаю точно, как F3 сравнивается с H2testw, так как я никогда не запускал H2testw. Я называю свою реализацию F3, что коротко для Fight Flash Fraud или Fight Fake Flash.

Приложение от @pbhj: F3 находится в репозиториях Ubuntu. Он состоит из двух частей: f3write записывает файлы объемом 1 ГБ на устройство, а f3read пытается прочитать их позже. Таким образом проверяется способность и способность писать и эффективно читать данные.

sdaau
источник
4
Есть ли какое-то преимущество перед F3 badblocks?
Zaz
14

Это зависит от режима сбоя, я полагаю. Они дешевы по причине.

Как устройство USB, наблюдение за шиной через диспетчер устройств в Windows или вывод dmesg в Linux сообщит вам, распознается ли устройство как подключенное. Если это не так, то либо контроллер на плате, либо физические соединения сломаны

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

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

Если вы ищете эквивалент SMART , то вы не найдете его. Контроллеры Thumbdrive дешевы. Они являются хранилищем товаров и не предназначены для того, чтобы иметь нормальные отказоустойчивости и интеллект, которые есть у современных накопителей.

Мэтт Симмонс
источник
2

На пути к сегодняшнему дню эта тема подняла несколько вопросов.

- Сколько времени это займет (подразумевается обсуждение вопроса о том, чтобы дать ему работать в одночасье).

В настоящее время я тестирую USB 3.0 128G Sandisk, используя sudo badblocks -w -s -oего, он подключен к моей карте USB 3 / USBC PCIe в более старом Athlon 64x2. Итак, USB3 в USB3 на PCIe должен быть довольно быстрым.

Вот моя командная строка консоли на 33% завершения:

Testing with pattern 0xaa: 33.35% done, 49:47 elapsed. (0/0/0 errors)

и снова позже:

Testing with pattern 0xaa: 54.10% done, 1:17:04 elapsed. (0/0/0 errors)

Далее появился этот сегмент:

Reading and comparing: 43.42% done, 2:23:44 elapsed. (0/0/0 errors)

Этот процесс повторяется с оксаа, затем 0x55, 0xff и, наконец, 0x00.

ArchLinux дал безоговорочное утверждение:

For some devices this will take a couple of days to complete.

NB. Тестирование началось около 8:30 вечера, тестирование было завершено до 8:45 следующего дня, для моей ситуации это заняло около 12 часов .

- Разрушительное тестирование - не единственный возможный метод.

Википедия предложила это утверждение:

badblocks -nvs /dev/sdb This would check the drive "sdb" in non-destructive read-write mode and display progress by writing out the block numbers as they are checked.

Моя текущая страница руководства по дистрибутиву подтверждает, что -n не является деструктивным.

-n Use non-destructive read-write mode. By default only a non- destructive read-only test is done.

И наконец, это того не стоит. заявление.

Суммарное утверждение, основанное на положении миллиардов сайтов памяти во флэш-микросхеме, означает, что сбой - это ячейка, которая уже была записана и стерта десятки тысяч раз, а сейчас терпит неудачу. И когда один тест показывает, что ячейка вышла из строя, помните, что каждый добавленный и удаленный файл выполняет эти циклы.

Идея здесь состоит в том, что, когда 1 ячейка выходит из строя, многие другие ячейки также достигают той же точки отказа. Сегодня одна ячейка вышла из строя, но вы обычно используете ее некоторое время дольше, потом еще 3 ячейки выходят из строя, затем еще 24, а затем 183, и, прежде чем вы это узнаете, массив памяти полон плохих мест. Есть только так много клеток, которые могут умереть, прежде чем ваша полезная емкость начнет падать, в конечном итоге быстро падая. Как вы узнаете, что больше клеток выходят из строя? Итак, посты здесь защищают ваши данные, говоря, что если у вас плохая ячейка, вы в значительной степени справились с задачей надежного хранения. Ваше использование может все еще дать вам несколько месяцев.

Это твои данные.

НТН

Ли Данбар
источник
1

Многие сбои либо завершены, либо позволяют одному местоположению поддерживать несколько местоположений. Я написал небольшую программу случайного чтения с записью, которая использует простое число для генератора псевдослучайных чисел, как для шаблонов, так и для адресов. Чтения располагаются позади записей на достаточном количестве страниц, чтобы гарантировать, что я не проверяю оперативную память в системе. Он еще не параметризован, просто настроен для устройства 64G в моей системе с оперативной памятью 8G. Не стесняйтесь критиковать, параметризировать, делать это умнее.

Это мощная проверка, которая быстрее, чем выполнение каждого байта снизу вверх, но также является отличным генератором свопинга (выкатывает практически все остальное). Я временно установил swapiness на 1, и он стал медленнее, но более терпимым для других приложений. Любые советы о том, как настроиться против свопинга, также будут оценены:

$ sudo ksh -c 'echo 1> / proc / sys / vm / swappiness'

$ cat mysrc/test64g.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main( int argc, char **argv ){

        long long int mask = 0xFFFFFFFF8L ;    // 64Gb word
        long long int stag = 8413257 ;  // 8G / 1021
        long long int inc = 1021L ;     // prime < 1024

        long long int w_addr = 0L ;
        long long int r_addr = 0L ;
        long long int w_ct = 0L ;
        long long int r_ct = 0L ;
        long long int w_patt = 0xFEDCBA9876543210L ;
        long long int r_patt = 0xFEDCBA9876543210L ;
        long long int r_buf ;
        int fd, ret ;

        if ( argc < 2
          || argv[1] == NULL
          || 0 > ( fd = open( argv[1], O_RDWR ))){
                printf( "Fatal: Cannot open file $1 for RW.\n" );
                exit( 1 );
        }

        while ( 1 ){
                if ( (off_t)-1 == lseek( fd, w_addr & mask, SEEK_SET )){
                        printf( "Seek to %llX\n", w_addr & mask );
                        perror( "Fatal: Seek failed" );
                        exit( 2 );
                }

                if ( 8 != ( ret = write( fd, (void*)&w_patt, 8 ))){
                        printf( "Seek to %llX\n", w_addr & mask );
                        perror( "Fatal: Write failed" );
                        exit( 3 );
                }

                w_ct++ ;
                w_addr += inc ;
                w_patt += inc ;

                if ( ( w_ct - r_ct ) < stag ){
                        continue ;
                }

                if ( (off_t)-1 == lseek( fd, r_addr & mask, SEEK_SET )){
                        printf( "Seek to %llX\n", r_addr & mask );
                        perror( "Fatal: Seek failed" );
                        exit( 4 );
                }

                if ( 8 != ( ret = read( fd, (void*)&r_buf, 8 ))){
                        printf( "Seek to %llX\n", w_addr & mask );
                        perror( "Fatal: Read failed" );
                        exit( 5 );
                }

                if ( ( ++r_ct & 0XFFFFF ) == 0 ){
                        printf( "Completed %lld writes, %lld reads.\n", w_ct, r_ct );
                }

                if ( r_buf != r_patt ){
                        printf( "Data miscompare on read # %lld at address %llX:\nWas: %llX\nS/B: %llX\n\n", r_ct, r_addr & mask, r_buf, r_patt );
                }

                r_addr += inc ;
                r_patt += inc ;
        }
}
Дэвид Пикетт
источник
Использование инкремента степени 2, например 1024, позволило бы лучше проверять биты или биты старшего адреса, хотя проверять только 8 байтов на переход.
Дэвид Пикетт
да, это будет пропускать случай мертвых старших бит. также пропускает чтение и запись в одном проходе, может пропустить это,
user313114
0

USB-накопители довольно элементарны, на них не так много проблем! Как правило, если он отображается как диск и его можно отформатировать, он работает. Вы можете попробовать взглянуть на Portable версию CrystalDiskInfo, поскольку это быстрый и легкий инструмент для анализа. Очень немногие USB-накопители сообщают SMART-информацию и тому подобное.

SimonJGreen
источник
1
Для справки см. Справочник Crystal Disk Info на английском языке: crystalmark.info/software/CrystalDiskInfo/manual-en
Мэтт Симмонс,