Festplatte – wirklich defekt?
Moin Moin,
ich hatte letzten Monat schon mal einen Post, in dem ich beschrieben habe, wie man HDDs kostenlos reparieren lassen kann (Zum Artikel). Heute gebe ich euch ein kleines Skript mit auf den Weg, wie man alle wichtigen Details auslesen kann.
Benötigt wird ein Linux Betriebssystem – Shell. Einfach das folgende Skript ausführen. Den Rest erfragt das Skript.
Anmerkung: Macht vorher einmal
fdisk -l
sodass ihr die HDD Devicepfade angezeigt bekommt 😉
Das Skript:
#!/bin/bash
############ CHECK FOR ROOT ############
echo “Prüfe Benutzerrechte …”
if [[ $EUID -ne 0 ]]; then
echo -e “\t-> Es werden Rootrechte benötigt. Bitte als ‘root’ einloggen.” 1>&2
exit 100
else
echo -e “\t-> ‘root’ Benutzerrechte erkannt.”
fi############ CHECH FOR INTERNET CONNECTIVITY ############
echo “Prüfe Internetverbindung …”
ping -c 2 www.google.com >> /dev/nullif [ $? -eq 0 ]
then
echo -e “\t-> Erfolgreich.”
INTERNETFLAG=”1″
else
echo -e “\t-> Fehler! Keine Internetverbindung. Bitte Netzwerkeinstellungen überprüfen!”
INTERNETFLAG=”0″
fi
echo -e “\t-> Fertig.”if [[ “$INTERNETFLAG” == “0” ]]
then
exit 100
else############ QUESTIONING ############
read -p “Bericht per E-Mail versenden? (j/n) [j]: ” SENDMAILSTATUS
if [[ $SENDSTATUS == “j” ]] || [[ -z $SENDSTATUS ]]
then
PKG_OK=$(dpkg-query -W –showformat=’${Status}\n’ postfix|grep “install ok installed”)
if [[ “” == “$PKG_OK” ]]; then
echo “Kein postfix. Installiere postfix.”
apt-get update -y -qq && apt-get -y –force-yes –yes -qq install postfix
else
service postfix restart >/dev/null 2>&1
fi
read -p “E-Mailadresse(n) [some@mail.de]: ” MAILADDRESif [[ $MAILADDRES == ” ” ]] || [[ -z $MAILADDRES ]]
then
MAILADDRES=’some@mail.de’
fi
fi
############ MAIN ####################### SET TIMESTAMP ############
TIMESTAMP=”$(date +%s)”
############ DEVICEABFRAGE ############
read -p “Bitte Device(s) angeben (Beispiel – beliebig viele: sda sdb sdc sdd): ” SMARTCTLDEVICE
read -p “Parameter für SMARTCTL? (Leer lassen falls nicht gewünscht – z. B. -t short): ” SMARTCTLPARAM
SMARTCTLDEVICE_ARR=($SMARTCTLDEVICE)for DEVICES in “${SMARTCTLDEVICE_ARR[@]}”
do
ls /dev/$DEVICES >/dev/null 2>&1
if [[ $? = 0 ]]
then
echo “SMARTCTL für Device $DEVICES wird gestartet …”
touch /tmp/smartctl-output.$TIMESTAMP.$DEVICESsmartctl -a /dev/$DEVICES > /tmp/smartctl-output.$TIMESTAMP.$DEVICES
if [[ “$SMARTCTLPARAM” = “-t short” ]]
then
echo -e “\tShorttest wird durchgeführt (Device: $DEVICES) – bitte warten …”
sleep 150
smartctl -a /dev/$DEVICES $SMARTCTLPARAM > /tmp/smartctl-output.$TIMESTAMP.$DEVICES
echo -e “\t\t-> Fertig.”
fi### READ SPECI)FICATIONS AND WRITE IT AT THE FIRST LINE ###
SMARTERROR=”$(grep “ATA Error Count:” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)”
### CHERCK FOPR SMARTERRORS ###
if [[ -z “$SMARTERROR” ]]
then
SMARTERROR=”SMARTERRORS: 0″
fised -i 1i”$(grep “Seek_Error_Rate” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)” /tmp/smartctl-output.$TIMESTAMP.$DEVICES
sed -i 1i”$(grep “Reallocated_Sector_Ct” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)” /tmp/smartctl-output.$TIMESTAMP.$DEVICES
sed -i 1i”$(grep “Power_On_Hours” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)” /tmp/smartctl-output.$TIMESTAMP.$DEVICES
sed -i 1i”$(grep “Raw_Read_Error_Rate” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)” /tmp/smartctl-output.$TIMESTAMP.$DEVICES
sed -i 1i”$SMARTERROR” /tmp/smartctl-output.$TIMESTAMP.$DEVICES 2>&1
sed -i 1i”$(grep “Serial Number:” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)” /tmp/smartctl-output.$TIMESTAMP.$DEVICES
sed -i 1i”$(grep “Device Model:” /tmp/smartctl-output.$TIMESTAMP.$DEVICES)” /tmp/smartctl-output.$TIMESTAMP.$DEVICES
SERIALNUMBER=”$(grep “Serial Number:” /tmp/smartctl-output.$TIMESTAMP.$DEVICES | uniq)”
SERIALNUMBER=”$(echo $SERIALNUMBER | grep ‘Serial Number:’ | cut -d ‘:’ -f2 | sed ‘s/ //g’)”SERIALSUBJECT=$SERIALSUBJECT’ ‘$SERIALNUMBER
## Lesegeschwindigkeiten (Cache – Buffer) auslesen ##
echo -e “\t-> Lesegeschwindigkeit wird getestet”
for i in {0..2} ; do hdparm -Tt /dev/$DEVICES >> /tmp/smartctl-output.$TIMESTAMP.$DEVICES; doneecho -e “\t-> Erfolgreich beendet”
else
echo “Das Device $DEVICES wurde nicht gefunden und wird übersprungen”
fi
doneif [[ $SENDSTATUS == “j” ]] || [[ -z $SENDSTATUS ]]
then
echo “Emailversand wird vorbereitet …”
### CREATE MAINFILE ###
touch /tmp/smartctl-output-mainfile.$TIMESTAMPtypeset -i WRITEMAINFILE
WRITEMAINFILE=1
for DEVICES in “${SMARTCTLDEVICE_ARR[@]}”
do
ls /dev/$DEVICES >/dev/null 2>&1
if [[ $? = 0 ]]
then
cat /tmp/smartctl-output.$TIMESTAMP.$DEVICES >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “—————————————- NEXT HDD —————————————-” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
echo “” >> /tmp/smartctl-output-mainfile.$TIMESTAMP
fi
donesed -i 1i”Subject: HDD-Test $SERIALSUBJECT” /tmp/smartctl-output-mainfile.$TIMESTAMP
sendmail -t $MAILADDRES < /tmp/smartctl-output-mainfile.$TIMESTAMP
echo -e “\t-> E-Mail versendet”
fiif [[ $1 = “–help” ]]
then
echo “####################################################”
echo “Das Skript dient der Prüfung der KONTENT Festplatten”
echo “Mittels smartctl lassen sich die Festplatten prüfen”
echo “und die Mailfunktion sorgt dafür, dass die Ausgabe”
echo “An den zuständigen Mitarbeiter gesendet wird.”
echo “Anscvhliessen kann das Ergebnis in das Festplatten-”
echo “Management eingetragen werden. Im Festplatten-”
echo “management lassen sich dann alle HDDs auflisten”
echo “und deren Testergebnisse anzeigen.”
echo “####################################################”
echo “”
echo “–help – Hilfe”
fi
fi
Ergänzungen, Verbesserungen etc. gerne in den Kommentaren.
Bis dahin – Grüße