Files
Utils/Proxmox/Test_NVMe/README.md
T
2025-06-19 10:41:49 +03:00

3.0 KiB
Raw Blame History

#!/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