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:
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:
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:
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.
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 .
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.
#Synology #SynologyNAS #Temperatura #Monitoreo #Visualización de datos #Matplotlib #SNMP #2minlog #Python #Docker