Jak sprawdzić kondycję fizyczną pamięci USB w systemie Linux?


85

Jak sprawdzić stan zdrowia pamięci USB?

Skąd mam wiedzieć, że USB jest uszkodzony nie do naprawienia lub naprawy?


12
Wyrzuć to. Twój zainwestowany czas jest droższy niż zakup nowego.
mailq

1
Muszę się zgodzić z @mailq. Możesz teraz kupić porządny napęd na 4 GB pamięci za 2,00 USD.
iglvzx

17
@iglvzx Cóż, pytanie nie mówi, czy jest to tanie, czy jakieś szybkie szyfrowanie + 32
Gb

Odpowiedzi:


69

Nie ma możliwości zapytania karty pamięci USB o parametry podobne do SMART; Nie znam żadnych kart pamięci, które by to wspierały, nawet za pośrednictwem publicznie dostępnego zastrzeżonego oprogramowania. Najlepsze, co możesz zrobić, to sprawdzić, czy możesz pomyślnie czytać i zapisywać na całym urządzeniu za pomocą badblocks.

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

Chcesz określić jeden z testów zapisu, który usunie wszystkie dane z pamięci; najpierw wykonaj kopię zapasową.

Znajdź urządzenie, patrząc dmesgpo podłączeniu pamięci USB; zobaczysz nazwę urządzenia (najprawdopodobniej sd_, tj. sdc, sdd itp.) oraz informacje o producencie. Upewnij się, że używasz odpowiedniego urządzenia!

Jeśli pamięć sformatowana jest przy użyciu prawidłowego systemu plików, być może trzeba unmountgo najpierw.

Przykładowa składnia dla pamięci USB wyliczonej jako / dev / sdz, wysyłająca informacje o postępie, z niszczącym dane testem zapisu i dziennikiem błędów zapisanym na usbstick.log:

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

Musisz później podzielić na partycje i sformatować patyk, zakładając, że mija; ten test wyczyści wszystko na patyku. Wszelkie awarie wskazują na awarię kontrolera pamięci urządzenia lub zabrakło mu zapasowych bloków do ponownego mapowania uszkodzonych bloków. W takim przypadku nie można ufać żadnemu obszarowi urządzenia.


21
Badblocks jest prawdopodobnie najlepszą opcją. komentarze, które mówią „nie warto” całkowicie pomijają kilka przypadków, gdy może to być bardzo potrzebne (na przykład firma mogła zakupić dyski flash z gadżetami i chciałaby zobaczyć, jak bardzo zostali oszukani ...)
Richlv

2
jak wskazano w linkowanym artykule na Wikipedii, istnieje również e2fsck -ctaki, który wykorzystuje badblocksi skutecznie ukrywa te złe blokady przed systemem plików, unikając w ten sposób uszkodzonych zapisów. Należy jednak zauważyć, że jeśli dysk ma nowe uszkodzone bloki, prawdopodobnie ulega uszkodzeniu, a nowe mogą pojawić się później, co oznacza, że ​​jego żywotność ulega skróceniu i należy rozważyć jego wymianę.
igorsantos07,

1
Sugeruję dodanie flagi -v, a także błąd w oknach terminala. (jeśli na przykład pozwolisz mu działać przez noc. Plik dziennika nie jest zbyt pomocny, aby szybko zobaczyć, jak źle jest.
Tilo,

@BeeDee, czy powinniśmy używać całego urządzenia, czy tylko partycji, czy to nie ma znaczenia? Mam na myśli / dev / sdz czy / dev / sdz1?
Pan P

1
@Pisek powinieneś używać całego urządzenia, ponieważ jest to awaria urządzenia, a nie tylko partycja.
Cześć Angel

21

Za pomocą [ubuntu] Error Check USB Flash Drive , w końcu znalazłem to, co może być pomocne:

Doszedłem do blogów Fight Flash Fraud i SOSFakeFlash, które polecają oprogramowanie H2testw (patrz tutaj lub tutaj) do testowania pamięci flash. Pobrałem H2testw i znalazłem z nim dwa problemy: (1) dotyczy tylko systemu Windows i (2) nie jest oprogramowaniem typu open source. Jednak jego autor był na tyle uprzejmy, aby dołączyć plik tekstowy, który wyjaśnia, co robi; ta strona dotyczy mojej implementacji tego algorytmu w GPLv3.
Moja implementacja jest prosta i niezawodna i nie wiem dokładnie, jak F3 wypada w porównaniu do H2testw, ponieważ nigdy nie korzystałem z H2testw. Nazywam swoją implementację F3, skrót od Fight Flash Fraud lub Fight Fake Flash.

Dodatek autorstwa @pbhj: F3 znajduje się w repozytoriach Ubuntu. Składa się z dwóch części, f3write zapisuje 1 GB plików na urządzeniu, a f3read próbuje je później odczytać. W ten sposób testowana jest zdolność i zdolność do zapisu i skutecznego odczytu danych.


4
Czy jest jakaś przewaga nad F3 badblocks?
Zaz


14

To chyba zależy od trybu awarii. Są tanie z jakiegoś powodu.

Jako urządzenie USB oglądanie magistrali za pomocą menedżera urządzeń w systemie Windows lub danych wyjściowych z dmesg w systemie Linux pokaże, czy urządzenie jest nawet rozpoznawane jako podłączone. Jeśli tak nie jest, to kontroler na pokładzie lub połączenia fizyczne są zepsute.

Jeśli urządzenie zostanie rozpoznane jako podłączone, ale nie zostanie zidentyfikowane jako kontroler dysku (i nie wiem, jak to się mogło stać, ale ...), wówczas kontroler zostanie zastrzelony.

Jeśli zostanie rozpoznany jako dysk, ale nie można go zamontować, być może będzie można go naprawić za pomocą programu fdisk i przepisać tablicę partycji, a następnie utworzyć inny system plików.

Jeśli szukasz odpowiednika SMART , nie znajdziesz go. Kontrolery Thumbdrive są tanie. Są to magazyny towarów i nie mają normalnych awarii i inteligencji, jakie mają współczesne dyski.


2

W drodze do dzisiaj ten wątek wywołał kilka pytań.

- Jak długo to potrwa (sugerowane przez dyskusję dotyczącą umożliwienia działania przez noc).

Obecnie testuję Sandisk USB 3.0 128G za pomocą sudo badblocks -w -s -o, jest on podłączony do mojej karty USB 3 / USBC PCIe w starszym Athlonie 64x2. Tak więc USB3 do USB3 na PCIe powinien być dość szybki.

Oto moja linia poleceń konsoli przy ukończeniu 33%:

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

i znowu później:

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

Następnie przyszedł ten segment:

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

Ten proces powtarza się z oxaa, następnie 0x55, 0xff, a na koniec 0x00.

ArchLinux wydał niekwalifikowane oświadczenie:

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

Uwaga: Testy rozpoczęto około 20:30, testy zakończono przed 8:45 następnego dnia, w mojej sytuacji za około 12 godzin .

- Testy niszczące nie są jedyną możliwą metodą.

Wikipedia przedstawiła to oświadczenie:

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.

Moja aktualna strona podręcznika dystrybucji potwierdza, że ​​-n nie jest destrukcyjne.

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

I wreszcie, że nie jest tego warte. komunikat.

Podsumowujące stwierdzenie, oparte na sytuacji miliardów miejsc pamięci w układzie flash, awaria to komórka, która została już napisana i usunięta dziesiątki tysięcy razy, a teraz zawodzi. A gdy jeden test wykaże, że komórka uległa awarii, pamiętaj, że każdy dodany i usunięty plik uruchamia te cykle.

Chodzi o to, że gdy jedna komórka ulegnie awarii, znacznie więcej komórek osiąga ten sam punkt awarii. Jedna komórka zawiodła dzisiaj, ale używasz jej normalnie przez chwilę dłużej, następnie 3 kolejne komórki zawodzą, następnie 24 kolejne zawodzą, a następnie 183, a zanim się zorientujesz, tablica pamięci jest pełna złych miejsc. Jest tylko tyle komórek, które mogą umrzeć, zanim twoja użyteczna pojemność zacznie spadać, ostatecznie spadając gwałtownie. Skąd będziesz wiedzieć, że więcej komórek zawodzi? Tak więc posty tutaj chronią twoje dane, mówiąc, że gdy masz złą komórkę, jesteś prawie gotowy pod względem wiarygodnego przechowywania. Twoje użycie może jeszcze dać ci kilka miesięcy.

To twoje dane.

HTH


1

Wiele awarii jest kompletnych lub pozwala jednej lokalizacji na obsługę wielu lokalizacji. Napisałem mały losowy program do odczytu, który używa liczby pierwszej dla generatora liczb pseudolosowych, zarówno dla wzorów, jak i adresów. Odczyty są przesunięte w czasie za zapisami o wystarczającą liczbę stron, aby upewnić się, że nie testuję pamięci podręcznej pamięci RAM w systemie. Nie jest jeszcze sparametryzowany, wystarczy skonfigurować urządzenie 64G w moim systemie z ram 8G. Możesz krytykować, parametryzować, uczynić go mądrzejszym.

Jest to potężne sprawdzanie i szybsze niż wykonywanie każdego bajtu od dołu do góry, ale jest także doskonałym generatorem zamiany (zrzuca prawie wszystko inne). Tymczasowo ustawiłem zamianę na 1 i stało się to wolniejsze, ale bardziej tolerowane przez inne aplikacje. Będziemy wdzięczni za wszelkie wskazówki, jak dostroić się do zamiany:

$ 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 ;
        }
}

Użycie inc o potędze 2 jak 1024 pozwoliłoby na lepsze sprawdzanie lub martwe bity o wysokim adresie, chociaż sprawdzanie tylko 8 bajtów na przeskok.
David Pickett,

tak, przegapi to przypadek martwych wysokich bitów. również robienie odczytów i zapisów w tym samym przebiegu może tego przegapić,
użytkownik313114,

0

Dyski USB są dość szczątkowe, nie ma w nich nic złego! Ogólnie rzecz biorąc, jeśli pokazuje się jako dysk i można go sformatować, to działa. Możesz spróbować przyjrzeć się przenośnej wersji CrystalDiskInfo, ponieważ jest to szybkie i lekkie narzędzie do analizy. Jednak bardzo niewiele pamięci USB przekazuje informacje SMART i tym podobne.


1
Dla porównania, oto instrukcja Crystal Disk Info w języku angielskim: crystalmark.info/software/CrystalDiskInfo/manual-en
Matt Simmons
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.