84 lines
3.0 KiB
Markdown
84 lines
3.0 KiB
Markdown
```bash
|
||
#!/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
|
||
|
||
``` |