Недавно я столкнулся с задачей: хочу видеть температуру своего NVMe-накопителя (WD Blue SN520), который подключён к Raspberry Pi через внешний USB-адаптер JEYI M.2 NVMe USB 3.2.
Казалось бы — просто, но есть нюансы: большинство USB-боксов эмулируют обычный SATA-диск и не передают SMART-данные. Однако оказалось, что мой адаптер на чипе Realtek RTL9210B отлично поддерживает передачу SMART через USB — даже на Raspberry Pi!
🔧 Что потребовалось сделать
-
Убедиться, что SMART доступен:
Установилsmartmontoolsи проверил:
В выводе увидел заветную строку:sudo apt install smartmontools sudo smartctl -a /dev/sdaTemperature: 48 Celsius -
Обновить скрипт сбора метрик (
rpi_monitor.sh):
Добавил получение температуры NVMe черезsmartctl:
И не забыл добавить переменную в SQL-запрос:# Температура NVMe через smartctl NVME_TEMP="N/A" if command -v smartctl &> /dev/null; then TEMP_VAL=$(sudo smartctl -a /dev/sda 2>/dev/null | grep "^Temperature:" | awk '{print $2}') if [[ -n "$TEMP_VAL" && "$TEMP_VAL" =~ ^[0-9]+$ ]]; then NVME_TEMP="$TEMP_VAL" fi fiINSERT INTO rpi_monitor (... , nvme_temp, ...) VALUES (... , '$NVME_TEMP', ...); -
Добавить поле в базу данных:
Выполнил один раз в MySQL:ALTER TABLE rpi_monitor ADD COLUMN nvme_temp VARCHAR(10) DEFAULT 'N/A'; -
Обновить веб-интерфейс (
index.php):
Добавил строку в блок «Статус железа»:<div class="value">💾 Температура NVMe: <strong><?= htmlspecialchars($rpi_data['nvme_temp'] ?? 'N/A') ?></strong>°C</div>
✅ Результат
Теперь в моей IoT-панели отображается актуальная температура NVMe-диска — даже несмотря на то, что он подключён через USB! Это особенно полезно, когда Pi работает под нагрузкой (например, как Home Assistant + Zigbee-координатор + MQTT-брокер).
💡 Важно: Не все USB-NVMe адаптеры поддерживают SMART. Проверяйте именно через smartctl -a /dev/sdX, а не надейтесь на бренд. JEYI, Acasis и некоторые модели с RTL9210B — хороший выбор.
Такой подход позволяет контролировать состояние SSD и вовремя реагировать на перегрев — особенно если вы используете Raspberry Pi без активного охлаждения корпуса.
Настройка прав sudo для smartctl без пароля
При автоматическом сборе данных (например, через cron) часто требуется выполнять команды, требующие прав root — например, smartctl для чтения температуры NVMe-диска. Чтобы избежать запроса пароля, можно настроить исключение в системе sudo.
visudo для редактирования конфигурации sudo — это предотвращает синтаксические ошибки, которые могут заблокировать доступ к sudo.
Шаг 1: Узнайте точный путь к smartctl
$ which smartctl
/usr/sbin/smartctl
Обычно на Raspberry Pi OS команда находится в /usr/sbin/smartctl, а не в /usr/bin/.
Шаг 2: Добавьте правило в sudoers
Создайте файл в /etc/sudoers.d/ (например, mazzick-smartctl):
sudo visudo -f /etc/sudoers.d/mazzick-smartctl
Добавьте строку (замените mazzick на ваше имя пользователя):
mazzick ALL=(ALL) NOPASSWD: /usr/sbin/smartctl
Сохраните и закройте файл.
Шаг 3: Используйте полный путь в скриптах
В bash-скриптах, особенно запускаемых через cron, всегда указывайте полный путь:
TEMP_VAL=$(sudo /usr/sbin/smartctl -a /dev/nvme0n1 2>/dev/null | grep "^Temperature:" | awk '{print $2}')
Это гарантирует, что команда найдётся даже при ограниченном PATH в cron.
Шаг 4: Проверьте работу
# Запустите от имени пользователя (без пароля!)
sudo -u mazzick sudo /usr/sbin/smartctl -a /dev/nvme0n1 | grep Temperature
Если температура выводится — всё настроено верно.
Сбор системных метрик для главной страницы iot системы - rpi_monitor.shГлавная страница iot системы с мониторингом температуры - index.php
Комментарии
Пока нет комментариев. Будьте первым!