Files
serv_benchmark/test_smart.sh
2025-12-08 05:42:52 +01:00

151 lines
6.2 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Test rapide des données SMART pour tous les disques
#
set -e
export PATH="/usr/sbin:/sbin:$PATH"
# Couleurs
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE} Test SMART - Santé des Disques${NC}"
echo -e "${BLUE}════════════════════════════════════════════════════════${NC}"
echo ""
# Vérifier smartctl
if ! command -v smartctl &> /dev/null; then
echo -e "${RED}✗ smartctl non installé${NC}"
echo "Installer avec: sudo apt-get install smartmontools"
exit 1
fi
# Lister les disques physiques
physical_disks=$(lsblk -d -n -o NAME,TYPE | grep 'disk' | awk '{print $1}')
for disk in $physical_disks; do
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}Disque: /dev/$disk${NC}"
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
# Ignorer les disques vides
size_bytes=$(lsblk -d -n -b -o SIZE /dev/$disk)
if [[ "$size_bytes" -eq 0 ]]; then
echo -e "${YELLOW}⚠ Disque vide, ignoré${NC}"
echo ""
continue
fi
# Infos de base
model=$(sudo smartctl -i /dev/$disk 2>/dev/null | grep 'Device Model:' | sed 's/.*: *//' || echo "Unknown")
[[ -z "$model" ]] && model=$(sudo smartctl -i /dev/$disk 2>/dev/null | grep 'Model Number:' | sed 's/.*: *//' || echo "Unknown")
echo "Modèle: $model"
# Test de santé
health=$(sudo smartctl -H /dev/$disk 2>/dev/null | grep 'SMART overall-health' | awk '{print $NF}')
if [[ "$health" == "PASSED" ]]; then
echo -e "Santé: ${GREEN}✓ PASSED${NC}"
elif [[ "$health" == "FAILED" ]]; then
echo -e "Santé: ${RED}✗ FAILED - REMPLACER IMMÉDIATEMENT${NC}"
else
echo "Santé: Inconnu (SMART peut-être non supporté)"
fi
# Données SMART importantes
smart_data=$(sudo smartctl -A /dev/$disk 2>/dev/null)
if [[ -n "$smart_data" ]]; then
# Heures de fonctionnement
power_hours=$(echo "$smart_data" | awk '/Power_On_Hours|Power On Hours/ {print $10}' | head -1)
if [[ -n "$power_hours" ]]; then
days=$((power_hours / 24))
years=$(echo "scale=1; $power_hours / 8760" | bc)
echo "Temps de fonctionnement: $power_hours heures ($days jours / $years ans)"
fi
# Cycles d'alimentation
power_cycles=$(echo "$smart_data" | awk '/Power_Cycle_Count|Start_Stop_Count/ {print $10}' | head -1)
[[ -n "$power_cycles" ]] && echo "Cycles d'alimentation: $power_cycles"
# Température
temp=$(echo "$smart_data" | awk '/Temperature_Celsius|Airflow_Temperature/ {print $10}' | head -1)
if [[ -n "$temp" ]]; then
if [[ $temp -lt 50 ]]; then
echo -e "Température: ${GREEN}${temp}°C${NC}"
elif [[ $temp -lt 60 ]]; then
echo -e "Température: ${YELLOW}${temp}°C (surveiller)${NC}"
else
echo -e "Température: ${RED}${temp}°C (SURCHAUFFE)${NC}"
fi
fi
# Secteurs réalloués (CRITIQUE)
realloc=$(echo "$smart_data" | awk '/Reallocated_Sector_Ct/ {print $10}' | head -1)
if [[ -n "$realloc" ]]; then
if [[ $realloc -eq 0 ]]; then
echo -e "Secteurs réalloués: ${GREEN}$realloc${NC}"
elif [[ $realloc -lt 10 ]]; then
echo -e "Secteurs réalloués: ${YELLOW}$realloc (début de défaillance)${NC}"
else
echo -e "Secteurs réalloués: ${RED}$realloc (DÉFAILLANCE - planifier remplacement)${NC}"
fi
fi
# Secteurs en attente (TRÈS CRITIQUE)
pending=$(echo "$smart_data" | awk '/Current_Pending_Sector/ {print $10}' | head -1)
if [[ -n "$pending" ]]; then
if [[ $pending -eq 0 ]]; then
echo -e "Secteurs en attente: ${GREEN}$pending${NC}"
else
echo -e "Secteurs en attente: ${RED}$pending (DÉFAILLANCE IMMINENTE - sauvegarder maintenant)${NC}"
fi
fi
# Erreurs CRC
crc=$(echo "$smart_data" | awk '/UDMA_CRC_Error_Count/ {print $10}' | head -1)
if [[ -n "$crc" ]]; then
if [[ $crc -eq 0 ]]; then
echo -e "Erreurs CRC: ${GREEN}$crc${NC}"
else
echo -e "Erreurs CRC: ${YELLOW}$crc (vérifier le câble SATA)${NC}"
fi
fi
# Pour SSD: Wear Leveling
rota=$(lsblk -d -n -o ROTA /dev/$disk)
if [[ "$rota" == "0" ]]; then
wear=$(echo "$smart_data" | awk '/Wear_Leveling_Count/ {print $4}' | head -1)
if [[ -n "$wear" ]]; then
if [[ $wear -gt 50 ]]; then
echo -e "Usure SSD: ${GREEN}$wear%${NC}"
elif [[ $wear -gt 20 ]]; then
echo -e "Usure SSD: ${YELLOW}$wear% (surveiller)${NC}"
else
echo -e "Usure SSD: ${RED}$wear% (fin de vie proche)${NC}"
fi
fi
fi
else
echo -e "${YELLOW}⚠ Données SMART non disponibles pour ce disque${NC}"
fi
echo ""
done
echo -e "${BLUE}════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}✓ Test SMART terminé${NC}"
echo ""
echo "Pour plus de détails sur un disque:"
echo " sudo smartctl -a /dev/sdX"
echo ""
echo "Documentation complète: ./SMART_GUIDE.md"
echo -e "${BLUE}════════════════════════════════════════════════════════${NC}"