#!/bin/bash
echo "🔍 NVMe Disk Health Report"
echo "=========================="
echo
# Проверка наличия утилиты
if ! command -v nvme &>/dev/null; then
echo "❌ Утилита 'nvme' не найдена. Установите: sudo apt install nvme-cli"
exit 1
fi
# Поиск всех NVMe-дисков
NVME_DISKS=$(ls /dev/nvme*n1 2>/dev/null | grep -E '^/dev/nvme[0-9]n1$')
if [[ -z "$NVME_DISKS" ]]; then
echo "❌ NVMe диски не найдены"
exit 1
fi
for DISK in $NVME_DISKS; do
echo "📦 Проверка: $DISK"
echo "--------------------------"
CONTROLLER="/dev/$(basename "$DISK" | sed 's/n1$//')"
TEMP_FILE=$(mktemp)
# Получение SMART-лога
nvme smart-log "$CONTROLLER" > "$TEMP_FILE"
# Парсинг значений
USED=$(grep -i "percentage_used" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9')
TEMP_C=$(grep -i "^temperature[^_]" "$TEMP_FILE" | grep -oP '[0-9]+(?=°C)' | sort -nr | head -n1)
MEDIA_ERR=$(grep -i "media_errors" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9')
NUM_ERR=$(grep -i "num_err_log_entries" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9')
SPARE=$(grep -i "available_spare[^_]" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9')
DATA_WRITTEN=$(grep -i "Data Units Written" "$TEMP_FILE" | grep -oP '\\([0-9\\.]+ TB\\)' | tr -d '()')
POWER_HOURS=$(grep -i "power_on_hours" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9')
UNSAFE_SHUTDOWNS=$(grep -i "unsafe_shutdowns" "$TEMP_FILE" | cut -d ':' -f2 | tr -cd '0-9')
# Расчёт времени наработки
if [[ -n "$POWER_HOURS" && "$POWER_HOURS" -gt 0 ]]; then
DAYS=$((POWER_HOURS / 24))
YEARS=$(echo "scale=1; $DAYS / 365" | bc)
UPTIME="$POWER_HOURS ч / $DAYS дн / ${YEARS} г"
else
UPTIME="N/A"
fi
# Вывод
echo "🧠 Износ SSD: ${USED:-N/A}%"
echo "🌡 Температура: ${TEMP_C:-N/A}°C"
echo "💾 Оставшийся запас: ${SPARE:-N/A}%"
echo "📉 Записано всего: ${DATA_WRITTEN:-N/A}"
echo "⏱ Время наработки: $UPTIME"
echo "⚠️ Media Errors: ${MEDIA_ERR:-N/A}"
echo "❗ Controller Errors: ${NUM_ERR:-N/A}"
echo "🔌 Unsafe Shutdowns: ${UNSAFE_SHUTDOWNS:-N/A}"
# Оценка состояния
echo -n "🔎 Оценка: "
if [[ -n "$USED" && "$USED" -ge 90 ]]; then
echo "❌ SSD почти исчерпан"
elif [[ -n "$TEMP_C" && "$TEMP_C" -ge 60 ]]; then
echo "⚠️ Высокая температура"
elif [[ -n "$NUM_ERR" && "$NUM_ERR" -gt 100 ]]; then
echo "⚠️ Ошибки контроллера превышают норму"
elif [[ -n "$UNSAFE_SHUTDOWNS" && "$UNSAFE_SHUTDOWNS" -gt 10 ]]; then
echo "⚠️ Много аварийных отключений питания"
else
echo "✅ Состояние хорошее"
fi
echo
# Модель, серийник, прошивка
echo "📄 Инфо:"
nvme id-ctrl "$CONTROLLER" | grep -Ei "mn|sn|fr"
echo
rm -f "$TEMP_FILE"
done