Siempre me he preguntado por la temperatura de los discos duros de mi NAS. Tengo el NAS en una habitación cerrada sin aire acondicionado. Además, desmonté el NAS hace un tiempo y los discos estaban muy calientes... No medí la temperatura en ese momento, pero empecé a preocuparme. Puedes encontrar muchas discusiones sobre la temperatura de la unidad NAS y su monitoreo desde un entorno Linux/Python. ¡Pero ninguna de las soluciones funcionó para mí!
Lo que quería:
- Monitoreo de temperatura del disco duro NAS de manera confiable y documentada : no quería leer el valor de alguna parte del subsistema Linux, que puede cambiar la próxima versión del software NAS.
- Quería ver mi NAS doméstico y mi NAS de respaldo , que está en el sótano de mi hermano, en un gráfico.
- Quería ver los valores en un gráfico atractivo. Quería total flexibilidad en el aspecto del gráfico, preferiblemente configurándolo yo mismo en Matplotlib.
- Quiero poder sacar los valores del panel del NAS y mostrar gráficos en tiempo real . Tengo una pantalla 2minlog en mi escritorio. Ya muestra la temperatura, la humedad y los niveles de contaminación en mi balcón y el historial de disponibilidad de mi conexión a Internet. Quiero ver el historial de temperatura del disco duro allí.
Paso 1: Recopilación de datos de temperatura
Recopilaremos datos a través del protocolo SNMP mediante el paquete pysnmp .
Comprensión de SNMP y MIB
SNMP (Simple Network Management Protocol) es un protocolo ampliamente utilizado para supervisar el estado y el rendimiento de los dispositivos de red. Permite la recopilación de datos como temperaturas, uso de la CPU y estado del disco.
Las MIB (Bases de información de gestión) son bases de datos de información que se pueden consultar a través de SNMP. Cada dato se identifica mediante un OID (Identificador de objeto), que identifica de forma única una variable que se puede leer o configurar a través de SNMP.
Debes especificar los valores MIB que se recopilarán. Tengo un servidor NAS de Synology. Publican el archivo MIB en sus páginas. Necesitamos recopilar:
- Nombre del disco: 1.3.6.1.4.1.6574.2.1.1.2
- Modelo de disco: 1.3.6.1.4.1.6574.2.1.1.3
- Temperatura del disco: 1.3.6.1.4.1.6574.2.1.1.6
Hay un excelente chatbot en la página pysnmp. Escribió el cuerpo del script de Python para mí, se ocupó de todas las dificultades con la API de SNMP y de las llamadas asincrónicas. La sección clave es la siguiente:
async def run(server_name, ipaddress, username, passwd, outinfo): # SNMP walk for disk name, model, and temperature oids = [ ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.2')), # Disk name (diskID) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.3')), # Disk model (diskModel) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.6')) # Disk temperature (diskTemperature) ] errorIndication, errorStatus, errorIndex, varBinds = await bulkCmd( SnmpEngine(), UsmUserData(username, passwd, authProtocol=usmHMACSHAAuthProtocol), # Use the appropriate auth protocol await UdpTransportTarget.create((ipaddress, 161)), ContextData(), 0, 10, # Increase the max-repetitions to get more results in one request *oids # Query disk name, model, and temperature ) if errorIndication: print(f"Error: {errorIndication}") elif errorStatus: print(f"Error Status: {errorStatus.prettyPrint()} at {errorIndex and varBinds[int(errorIndex) - 1] or '?'}") else: disk_data = {} for varBind in varBinds: oid, value = varBind oid_str = str(oid) # Disk name if oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.2'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['name'] = value # Disk model elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.3'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['model'] = value # Disk temperature elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.6'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['temperature'] = value # Print out the disk information for index, info in disk_data.items(): name = info.get('name', 'Unknown') model = info.get('model', 'Unknown') temperature = info.get('temperature', 'Unknown') name = str(name) model = str(model) temperature = str(temperature) print(f"IP Address {ipaddress}, Disk {index}: Name: {name}, Model: {model}, Temperature: {temperature} °C") outinfo.append({'server_name': server_name, 'ip': ipaddress, 'disk': index, 'name': name, 'model': model, 'temperature': temperature})
Debe habilitar el protocolo SNMP en la configuración de Synology NAS:
Paso 2: Implementar el script y enviar datos para su procesamiento
Implementé el script directamente en el NAS en el entorno de Docker. Debe asegurarse de que el contenedor de Docker se inicie nuevamente después del reinicio final. Por ese motivo, configuré un archivo docker-compose.yaml simple:
version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature
Luego inicie Docker con docker-compose up -d
.
Estoy afiliado a 2minlog , un sistema simple para recopilar, procesar y visualizar datos. Envías los datos allí a través de solicitudes HTTPS (codificadas en la URL o en el cuerpo) y configuras un script de visualización allí. Los gráficos están disponibles desde cualquier lugar que los necesites.
Puedes utilizar 2minlog. También puedes enviar los datos a una base de datos o a un sistema de archivos local.
Paso 3: Visualización de datos
Configuré un script Matplotlib simple para mostrar el gráfico. En realidad, le pedí a ChatGPT (o1-preview) que lo hiciera y lo hizo bastante bien. El script Python no era perfecto, pero era lo suficientemente bueno como para terminar la tarea rápidamente. El mensaje se muestra a continuación.
Here is a csv file. Can you write a code: Split data into different graphs by combining the server name and name (eg, DS920+ / Disk 1). Each graph will show the temperature. There will be a title in each graph (eg, DS920+ / Disk 1) The graphs will have the same temperature range. The background will be black, graph background will be also black, the graph color will be from dark green (low temperatures) to light green (high temperatures). There will be two thin lines - 20 °C (blue) and 45 °C (red). Trim the data for last week with tickmarks at midnight of every day. The data are in UTC time. Convert it to Europe/Berlin time zone. The resolution of the total image is hxw 600 x 1024 pixels. Save the image to PNG. disk,ip,model,name,server_name,temperature,timestamp 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:19:48.723761 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:19:49.253975 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:19:49.818734 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:19:50.393793 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:19:50.873142 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:20:02.119583 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:20:02.596654 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:20:03.101480 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:20:03.697423 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:20:04.221348 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:25:02.254611 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:25:02.714633 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:25:03.295622 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:25:03.780728 ...
El script de visualización se implementa dentro de la plataforma 2minlog. También puede ejecutarlo localmente.
El script está disponible en GitHub .
Para terminar
Puede utilizar un 2minlog totalmente administrado para recopilar, procesar y visualizar los datos. Consulte la documentación . Muestro los resultados en una tableta Android que está sobre mi mesa y hago un ciclo entre los distintos gráficos con Image Tuner . También puede guardar los datos en su sistema de archivos local y hacer lo mismo.
La solución se ha probado en un NAS Synology, pero se puede adaptar a otros.
Referencias:
- Repositorio de GitHub: Proyecto de monitoreo de temperatura NAS
- Documentación de Pysnmp: Biblioteca de Pysnmp
- Chatbot del paquete Pysnmp: gurú de SNMP
- Configuración de pantalla: Actualización automática de pantalla completa y configuración de una tableta Android antigua como pantalla
- Archivos MIB de Synology**:** Guía de MIB de Synology
- 2minlog: plataforma de visualización de datos 2minlog
#Synology #SynologyNAS #Temperatura #Monitoreo #Visualización de datos #Matplotlib #SNMP #2minlog #Python #Docker