code.fastix.org

Dateiansicht:

Datei:Projekte -> Linux:USB-Stick testen -> sticktest
md5:451ca8d0d596e77a9347488eb0604b7f
sha1:81925cb33f87bdac8bc133bc069160ec46dd9e30
Download-Link:Download
  1. #!/bin/bash
  2.  
  3. ### sticktest
  4. ##              Dieses Skript testet angeschlossene Speichermedien darauf, wie viele Gibi-Bytes
  5. ##              sich darauf speichern und wieder lesen lassen.
  6. ##              Es hilft gefälschte oder kaputte USB-Sticks zu erkennen.
  7.  
  8. ### Aufruf:
  9. ##              sticktest /MountPoint [-r]
  10.  
  11. ### Optionen
  12. ##      -r      Löschen aller zum Test verwendeten Dateien
  13.  
  14. ### Autor:
  15. ## Jörg Reinholz, Kassel, Germany
  16.  
  17. ### Lizenz:
  18. ## GPL, LGPL or MPL: show https://code.fastix.org/lizenz.php
  19.  
  20. if [ -z $1 ]; then
  21.         echo "Fehler: Kein Mountpoint angegeben.";
  22.         exit 2;
  23. fi
  24.  
  25. MountPoint=$1;
  26. isMountPoint=$( grep -P "/dev/.* $MountPoint " < /proc/self/mounts| wc -l );
  27. if [ 1 -ne $isMountPoint ]; then
  28.         echo "Fehler: $MountPoint ist kein Mountpoint oder kein gemountetes Gerät";
  29.         exit 4;
  30. fi
  31.  
  32. echo -e "Ok. Das wird jetzt eine Weile dauern...\n\n";
  33.  
  34. #set -x
  35.  
  36. oldDir="${PWD}";
  37. TMPDIR="/tmp";
  38. BaseFile=$(mktemp);
  39. TestFile=$(mktemp);
  40. LogFile=/tmp/test.log;
  41.  
  42. if [ -f ${LogFile} ]; then
  43.         truncate -s 0 ${LogFile};
  44. else
  45.         touch ${LogFile};
  46. fi
  47.  
  48. err=0;
  49. num=0;
  50.  
  51. dd if=/dev/urandom of=${BaseFile} bs=4096 count=255744 status=none;
  52.  
  53. while [ 0 -eq ${err} ]; do
  54.         num=$((${num} + 1));
  55.         cp "${BaseFile}" "${TestFile}";
  56.         dd if=/dev/urandom bs=4096 count=$((256*25)) status=none >> $TestFile;
  57.         cp --no-clobber "${TestFile}" "${MountPoint}/TestFile.${num}" || err=1;
  58.         sync "${MountPoint}/TestFile.${num}";
  59.  
  60.         if [ 1 = $err ]; then
  61.                 echo "(Kein Fehler:) ${MountPoint}/TestFile.${num} konnte nicht mehr oder nicht mehr vollständig geschrieben werden.";
  62.                 echo "Prüfung nachfolgend.";
  63.         fi
  64.  
  65.         if [ -r "${MountPoint}/TestFile.${num}" ]; then
  66.                 echo -n "${MountPoint}/TestFile.${num}:" >> ${LogFile};
  67.                 md5A=$(md5sum -b < ${TestFile} | tr -d " *-");
  68.                 md5B=$(md5sum -b < ${MountPoint}/TestFile.${num} | tr -d " *-");
  69.                 [ 0 = $err ] && echo ${md5A} >> ${LogFile};
  70.                 [ 1 = $err ] && echo ${md5B} >> ${LogFile};
  71.  
  72.                 if [ ${md5A} = ${md5B} ]; then
  73.                         [ 0 = $err ] && echo "Das Schreiben von ${num} Gigabytes war SCHEINBAR erfolgreich.";
  74.                 else
  75.                         [ 0 = $err ] && echo "ALARM: Prüfsummenfehler in Datei ${MountPoint}/TestFile.${num}";
  76.                 fi
  77.         fi
  78. done
  79.  
  80. files=($(cut -d':' -f1 ${LogFile}));
  81. sums=($(cut -d':' -f2 ${LogFile}));
  82.  
  83. echo -e "\nAbschließende Tests (Prüfen aller Dateien):";
  84.  
  85. err=0;
  86. for i in $(seq 0 $((${#files[@]}-1))); do
  87.         file=${files[${i}]};
  88.         sum=${sums[${i}]};
  89.         sumTest=$(md5sum -b < "${file}" | tr -d " *-");
  90.         echo -e "\nDatei: '${file}'";
  91.         echo "   Erwartete Prüfsumme: ${sum}";
  92.         echo "Tatsächliche Prüfsumme: ${sumTest}";
  93.         if [ "${sum}" = "${sumTest}" ]; then
  94.                 echo "* Identisch: O.K.*";
  95.         else
  96.                 echo "# FEHLER nach ${i} GigaBytes! #";
  97.         fi
  98.         [ "$2" = "-r" ] && rm "${file}";
  99. done
  100.  
  101. if [ 1 == $err ]; then
  102.                 echo "###########################################";
  103.                 echo "# Der Stick hat den Test NICHT bestanden! #";                
  104.                 echo "###########################################";            
  105. fi
  106.  
  107. echo '------------------------------------';
  108. echo '| Der Stick hat den Test bestanden |';                
  109. echo '------------------------------------';
  110.  
  111. if [ "$2" = "-r" ]; then
  112.         rm $BaseFile;
  113.         rm $TestFile;
  114. fi
  115. cd "$oldDir";
  116. exit $err;
  117.