Onde posso encontrar ferramentas de teste de integridade de armazenamento (gravação / leitura)?

3

Estou precisando de ferramentas para verificar a integridade dos dados de discos rígidos locais, drives USB, etc.

Estou procurando uma solução como o famoso www.heise.de/download/h2testw ou algo que esteja em menos comum nos repositórios.   (h2testw escreve uma série de dados específicos repetidamente no meio, depois lê novamente para verificar se foi escrito corretamente e exibe o tempo / velocidade de gravação / leitura).

Eu não estou procurando

dd if=/dev/random of=/dev/sdx bs=1k && dd if=/dev/sdx of=/dev/null bs=1k

pois não verificará se tudo foi escrito corretamente. É apenas um teste se a leitura / gravação for bem-sucedida no dispositivo.

Até agora, não estou muito feliz com

badblocks -w -v /dev/sdx1

, já que parece muito lento, e eu não sei exatamente o que é escrito, e se ele considera o nivelamento de desgaste em mídia flash.

Existe um programa chamado F3 link que precisa ser compilado. Projetado após h2testw, o conceito parece interessante, eu prefiro ter um binário pré-empacotado.

    
por Mr. Bash 03.05.2012 / 12:27

1 resposta

2

O script a seguir cria um arquivo aleatório (em torno de 100M) na memória compartilhada, calcula sua soma de verificação e o copia para o dispositivo de bloco especificado várias vezes para que todo o dispositivo seja preenchido com cópias dos dados aleatórios, enquanto o lê novamente e calcular sua soma de verificação para verificar se ela corresponde à original.

Produz saída como:

We will create a test data file /dev/shm/testsource with size 100000000.
We will fill the device /dev/sdb (of size 16001036288) with this data (in 160 blocks) and then will check if the data is not corrupted.
This will erase all data in /dev/sdb.
Do you want to continue?
1) yes
2) no
#? 1
Creating test source file... (100000000)
Calculating source checksum...
9f4c31858b3bb1122974a5c9d8ec28c6f71b3367
Writing block 0 ...
Checking block 0 ... ok
Writing block 1 ...
Checking block 1 ... ok
Writing block 2 ...
Checking block 2 ... ok

Requer dd, blockdev, cut, sha1sum, / dev / urandom e / dev / shm. Requer acesso ao dispositivo (geralmente root). Isso foi testado no Linux 2.6.3x. Está lento. Você pode modificá-lo para fazer várias passagens ou para fazer toda a escrita e depois verificar ou esperar algum tempo antes de verificar (um teste "fade").

#!/bin/bash
TARGETDEVICE=$1
TESTFILE="/dev/shm/testsource"
BLOCKSIZE="100000000"
if [ -b "$1" ]; then
    TARGETSIZE=$(blockdev --getsize64 $TARGETDEVICE)
    if [ "$TARGETSIZE" -gt 0 ] ; then
      let "BLOCKS=$TARGETSIZE / $BLOCKSIZE"
      if [ "$BLOCKS" -lt 2 ] ; then
        BLOCKSIZE=$TARGETSIZE
        BLOCKS=1
      fi
    fi
    echo "We will create a test data file $TESTFILE with size $BLOCKSIZE."
    echo "We will fill the device $TARGETDEVICE (of size $TARGETSIZE) with this data (in $BLOCKS blocks) and then will check if the data is not corrupted."
    echo "This will erase all data in $TARGETDEVICE."
    echo "Do you want to continue?"
    select choice in yes no ; do
      if [ "$choice" == "yes" ] ; then

        echo "Creating test source file... ($BLOCKSIZE)"
        dd if=/dev/urandom of=$TESTFILE bs=$BLOCKSIZE count=1 status=noxfer 2> /dev/null

        echo "Calculating source checksum..."
        CHECKSUM=$(sha1sum $TESTFILE | cut -d " " -f 1)
        echo $CHECKSUM

        for ((y=0 ; y<$BLOCKS ; y++)) ; do
          echo "Writing block $y ..."
          dd if=$TESTFILE of=$TARGETDEVICE bs=$BLOCKSIZE count=1 seek=$y status=noxfer 2> /dev/null
          echo -n "Checking block $y ... "
          TESTCHECKSUM=$(dd if=$TARGETDEVICE bs=$BLOCKSIZE count=1 skip=$y status=noxfer 2> /dev/null | sha1sum | cut -d " " -f 1)
          if [ "$CHECKSUM" == "$TESTCHECKSUM" ] ; then
            echo "ok"
          else
            echo "MISMATCH"
            echo "(found $TESTCHECKSUM)"
          fi
        done
        rm -f $TESTFILE
        break

      fi
      if [ "$choice" == "no" ] ; then
        echo
        echo "Operation cancelled"
        echo
        break
      fi

    done

else 
    echo
    echo "Missing or wrong target device"
    echo "Usage: $0 /dev/device"
    echo
fi
    
por 23.06.2012 / 20:18