Como verificar a saúde física de um pendrive no Linux?


85

Como verificar o status de funcionamento de um stick USB?

Como sei que um USB está quebrado além do reparo ou reparável?


12
Jogue fora. Seu tempo investido é mais caro do que comprar um novo.
mailq

1
Eu tenho que concordar com @mailq. Você pode comprar um pen drive decente de 4 GB por US $ 2,00 hoje em dia.
iglvzx

17
@iglvzx Bem, a questão não dizer, se é um barato, ou algum + 32Gb criptografar um rápido ...
varesa

Respostas:


69

Não há como consultar um cartão de memória USB em busca de parâmetros do tipo SMART; Não conheço nenhum cartão de memória compatível com isso, mesmo por meio de software proprietário publicamente disponível. O melhor que você pode fazer é verificar se consegue ler e gravar com sucesso em todo o dispositivo usando badblocks.

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

Você deseja especificar um dos testes de gravação, que limpará todos os dados no stick; faça um backup primeiro.

Encontre o dispositivo observando dmesgdepois de conectar o dispositivo USB; você verá um nome de dispositivo (provavelmente sd_, ou seja, sdc, sdd etc.) e informações do fabricante. Verifique se você está usando o dispositivo adequado!

Se o stick estiver formatado com um sistema de arquivos válido, você pode precisar unmountprimeiro.

Exemplo de sintaxe, para um pendrive enumerado como / dev / sdz, que gera informações de progresso, com um teste de gravação destrutivo de dados e um log de erros gravados em usbstick.log:

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

Você precisará reparticionar e reformatar o stick posteriormente, supondo que ele passe; este teste irá limpar tudo no bastão. Qualquer falha indica uma falha no controlador de memória do dispositivo ou ficou sem blocos sobressalentes para remapear os blocos com falha. Nesse caso, nenhuma área do dispositivo pode ser confiável.


21
badblocks é provavelmente a melhor opção. os comentários que dizem "não vale a pena" perdem completamente vários casos em que isso é muito necessário (por exemplo, uma empresa pode ter comprado drives flash de mercadorias e gostaria de ver o quanto eles foram enganados ...)
Richlv

2
como apontado no artigo da wikipedia, também existe o e2fsck -cuso badblockse a ocultação efetiva desses badblocks do sistema de arquivos, evitando gravações corrompidas. Deve-se notar, no entanto, que, se o disco recebeu novos bloqueios, provavelmente está danificado e os novos podem surgir mais tarde, o que significa que sua vida está diminuindo e você deve pensar em substituí-lo.
igorsantos07

1
Sugiro adicionar o sinalizador -v, bem como ver o erro nas janelas do terminal. (se você deixá-lo correr durante a noite, por exemplo, o arquivo de log não é útil para uma visualização rápida como é ruim..
Tilo

@ BeeDee, devemos usar o dispositivo inteiro ou apenas alguma partição ou isso não importa? Quero dizer / dev / sdz ou / dev / sdz1?
sr P

1
@ Pisek, você deve usar o dispositivo inteiro, porque está falhando, não apenas uma partição.
Hi-Angel

21

Via [ubuntu] Erro Ao verificar a unidade flash USB , eu finalmente encontrei isso, o que poderia ser útil:

Cheguei aos blogs Fight Flash Fraud e SOSFakeFlash, que recomendam o software H2testw (veja aqui ou aqui) para testar memórias flash. Fiz o download do H2testw e encontrei dois problemas: (1) é apenas para Windows e (2) não é de código aberto. No entanto, seu autor teve a gentileza de incluir um arquivo de texto que explica o que faz; Esta página é sobre minha implementação GPLv3 desse algoritmo.
Minha implementação é simples e confiável e não sei exatamente como a F3 se compara ao H2testw, pois nunca executei o H2testw. Chamo minha implementação de F3, que é a abreviação de Fight Flash Fraud ou Fight Fake Flash.

Adendo de @pbhj: F3 está nos repositórios do Ubuntu. Ele tem duas partes: o f3write grava arquivos de 1 GB no dispositivo e o f3read tenta lê-los posteriormente. Dessa forma, a capacidade e a capacidade de gravar e ler efetivamente dados são testadas.


4
Existe alguma vantagem para a F3 badblocks?
Zaz


14

Depende do modo de falha, suponho. Eles são baratos por um motivo.

Como um dispositivo USB, assistir o barramento via gerenciador de dispositivos no Windows ou a saída do dmesg no Linux informará se o dispositivo é reconhecido como estando conectado. Se não estiver, o controlador a bordo ou as conexões físicas estão quebrados.

Se o dispositivo for reconhecido como conectado, mas não for identificado como um controlador de disco (e eu não sei como isso poderia acontecer, mas ...), o controlador será atingido.

Se ele for reconhecido como uma unidade de disco, mas você não conseguir montá-lo, poderá consertá-lo via fdisk e reescrever a tabela de partição e criar outro sistema de arquivos.

Se você procura o equivalente ao SMART , não o encontrará. Controladores Thumbdrive são baratos. Eles são armazenamento de mercadorias e não pretendem ter os falhas normais e a inteligência que os discos modernos possuem.


2

No caminho para hoje, esse tópico levantou algumas questões.

- Quanto tempo isso levará (implicado na discussão de deixá-lo funcionar da noite para o dia).

Atualmente, estou testando um Sandisk USB 3.0 128G usando sudo badblocks -w -s -o, ele está conectado à minha placa USB 3 / USBC PCIe em um Athlon 64x2 mais antigo. Portanto, o USB3 no USB3 no PCIe deve ser bastante rápido.

Aqui está a linha de comando do meu console com 33% de conclusão:

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

e novamente mais tarde:

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

Em seguida, veio este segmento:

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

Esse processo se repete com oxaa, 0x55, 0xff e, finalmente, 0x00.

O ArchLinux fez uma declaração não qualificada:

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

NB: O teste foi iniciado por volta das 20h30, o teste havia terminado antes das 8h45 do dia seguinte, completando em cerca de 12 horas para a minha situação .

- Testes destrutivos não são o único método possível.

A Wikipedia ofereceu esta declaração:

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.

Minha página de manual de distribuição atual confirma que -n é não destrutivo.

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

E, finalmente, que não vale a pena. declaração.

Uma declaração resumida, com base na situação de bilhões de sites de memória em um chip flash, uma falha é uma célula que já foi gravada e apagada dezenas de milhares de vezes e agora está falhando. E quando um teste mostra que uma célula falhou, lembre-se de que cada arquivo que você adicionou e apagou está executando esses ciclos.

A idéia aqui é que, quando uma célula falha, muitas outras células também atingem o mesmo ponto de falha. Uma célula falhou hoje, mas você a usa normalmente por mais algum tempo, mais 3 células falham, mais 24 falham e depois 183 e, antes que você perceba, a matriz de memória está cheia de pontos ruins. Existem tantas células que podem morrer antes que sua capacidade utilizável comece a cair, eventualmente caindo rapidamente. Como você saberá que mais células estão falhando? Portanto, as postagens aqui estão protegendo seus dados dizendo que, quando você tem uma célula defeituosa, você está praticamente pronto para o armazenamento confiável. Seu uso ainda pode levar alguns meses.

São seus dados.

HTH


1

Muitas falhas estão completas ou permitem que um local suporte vários locais. Eu escrevi um pequeno programa de leitura e gravação aleatória que usa um número primo para um gerador de números pseudo-aleatórios, para padrões e endereços. As leituras são escalonadas por trás das gravações por páginas suficientes para garantir que eu não estou testando o cache de ram no sistema. Ainda não está parametrizado, basta configurar um dispositivo de 64G no meu sistema com 8G de RAM. Sinta-se livre para criticar, parametrizar, torná-lo mais inteligente.

Essa é uma verificação poderosa e mais rápida do que executar todos os bytes de baixo para cima, mas também é um ótimo gerador de swap (lança quase todo o resto). Coloquei a permutação em 1 temporariamente e ficou mais lenta, mas mais tolerável para outros aplicativos. Quaisquer dicas sobre como ajustar a troca também serão apreciadas:

$ sudo ksh -c 'eco 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 ;
        }
}

Usar um aumento de potência de 2 como 1024 permitiria uma melhor verificação ou bits de endereço alto morto, embora apenas verificasse 8 bytes por salto.
David Pickett

Sim, isso vai perder o caso de bits altos. Também fazendo lê e escreve na mesma passagem pode perder isso,
user313114

0

Os drives USB são bastante rudimentares, não há muito que possa dar errado neles! Geralmente, se aparecer como uma unidade e você puder formatá-la, funcionará. Você pode tentar dar uma olhada na versão Portable do CrystalDiskInfo, pois é uma ferramenta de análise rápida e leve. No entanto, muito poucos pen drives relatam informações SMART e similares.


1
Para referência, aqui está o manual do Crystal informações disco em Inglês: crystalmark.info/software/CrystalDiskInfo/manual-en
Matt Simmons
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.