Sempre m'he preguntat sobre la temperatura dels HDD al meu NAS. Tinc el NAS en una habitació tancada sense aire condicionat. A més, vaig desmuntar el NAS fa un temps, i els discs estaven molt calents... Aleshores no mesurava la temperatura, però em vaig començar a preocupar. Podeu trobar moltes discussions sobre la temperatura de la unitat NAS i el seguiment des d'un entorn Linux/Python. Però cap de les solucions em va funcionar!
El que volia:
Recollirem dades mitjançant el protocol SNMP mitjançant el paquet pysnmp .
Comprensió de SNMP i MIB
SNMP (Simple Network Management Protocol) és un protocol molt utilitzat per supervisar la salut i el rendiment dels dispositius de xarxa. Permet la recollida de dades com ara temperatures, ús de la CPU i estat del disc.
Les MIB (Management Information Bases) són bases de dades d'informació que es poden consultar mitjançant SNMP. Cada dada s'identifica mitjançant un OID (identificador d'objecte), que identifica de manera única una variable que es pot llegir o configurar mitjançant SNMP.
Heu d'especificar els valors de MIB que voleu recopilar. Tinc Synology NAS. Publiquen el fitxer MIB a les seves pàgines. Hem de reunir:
Hi ha un excel·lent bot de xat a la pàgina pysnmp. Va escriure el cos de l'script de Python per a mi, gestionant totes les dificultats amb l'API SNMP i gestionant trucades asíncrones. La secció clau és la següent:
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})
Heu d'habilitar el protocol SNMP a la configuració del Synology NAS:
Vaig implementar l'script directament al NAS a l'entorn Docker. Heu d'assegurar-vos que el contenidor Docker s'iniciï de nou després de l'eventual reinici. He configurat un fitxer simple docker-compose.yaml per aquest motiu:
version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature
A continuació, inicieu el Docker amb docker-compose up -d
.
Estic afiliat al 2minlog , un sistema senzill per recopilar, processar i visualitzar dades. Envieu les dades allà mitjançant sol·licituds HTTPS (codificades a l'URL o al cos) i hi configureu un script de visualització. Aleshores, els gràfics estan disponibles des de qualsevol lloc que necessiteu.
Podeu utilitzar el 2minlog. Alternativament, podeu enviar les dades a una base de dades o un sistema de fitxers local.
Vaig configurar un script Matplotlib senzill per mostrar el gràfic. De fet, vaig demanar a ChatGPT (o1-preview) que ho fes i ho va fer bastant bé. L'script de Python no era perfecte, però era prou bo per acabar la tasca ràpidament. La indicació és a continuació.
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 ...
L'script de visualització es desplega a la plataforma 2minlog. També podeu executar-lo localment.
L'script està disponible a GitHub .
Podeu utilitzar un 2minlog totalment gestionat per recopilar, processar i visualitzar les dades. Consulteu la documentació . Visualitzo els resultats en una tauleta d'Android asseguda a la meva taula i cicle pels diferents gràfics amb Image Tuner . També podeu desar les dades al vostre sistema de fitxers local i fer el mateix.
La solució es prova en un Synology NAS, però es pot adaptar per a altres.
#Synology #SynologyNAS #Temperatura #Monitorització #Visualització de dades #Matplotlib #SNMP #2minlog #Python #Docker