#!/bin/sh # # A simple script to detect damaged storage drives on Linux systems. # (c) 2015-2022 Hosco , GNU GPL v2 or v3 # LANG=C app="BadDrive" ver="1.0" system=$(uname -o) { printf "%c" "." > /$$.txt && rm /$$.txt ; } 2>/dev/null || \ { printf "\nYou must have root privileges to run BadDrive.\n\n" && exit 10 ; } ; printf "%s" "$system" | grep -qsE "Linux|ESX" || \ { printf "%s\n" "$app only runs on Linux based systems." && exit 11 ; } errors=$(dmesg | grep -oE "\[sd[a-z]{1,}\].*(FAILED|Error).*$|\ (naa\.|eui\.|t10\.|SCSI disk).*(FAILED|failed|[Ee]rror|[Ii]naccessible).*(Invalid sense data|I.O error)" \ | sed 's/tag#[0-9]\{1,\} //g' | sort | uniq) ; drives=$(printf "$errors" | grep -oE "sd[a-z]{1,}|(naa\.|eui\.|t10\.|SCSI disk)[0-9a-z]{1,}" | sort | uniq ) printf "%c\n" ; printf "%s\n" "$app $ver, by Hosco Recuperação de Dados" ; sleep 0.5 ; printf "%s\n" "It detects damaged drives on Linux systems." ; sleep 1 ; printf "\n%s\n" "Searching for failing storage drives..." ; sleep 1 ; [ -z "$errors" ] && printf "No damaged drives were found.\n\n" \ && exit ; printf "Following damaged device(s) were found:\n\n" ; if printf "%s" "$system" | grep -qs 'Linux' ; then for i in $drives ; do { [ ! -b "/dev/$i" ] 2>/dev/null && printf "%s %s" "$i:" "(no more details about this drive)" ; } || \ printf "%s" "`lsblk -o type -d /dev/$i | sed '/TYPE/d'` $i: `lsblk -o vendor,model -d /dev/$i | \ sed '/VENDOR\|MODEL/d'`" | sed 's/ \{2,\}/ /' ; printf "%c\n" done ; printf "\nIt is strongly advised to keep drive(s)" ; printf "\npowered off for prevention of data loss.\n\n" fi if printf "%s" "$system" | grep -qsE "ESX|VMware" ; then for i in $drives ; do { [ ! -e "/dev/disks/$i" ] 2>/dev/null && printf "%s %s\n" "$i:" "(seems absent)" ; } || \ printf "%s\n" "$i" done ; printf "\nIt is strongly advised to keep drive(s)" ; printf "\npowered off for prevention of data loss.\n\n" fi exit