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