Mindig is kíváncsi voltam a HDD hőmérsékletére a NAS-omban. A NAS egy zárt szobában van, légkondi nélkül. Ráadásul régebben szétszedtem a NAS-t, és nagyon forrók voltak a lemezek... Akkor még nem mértem a hőmérsékletet, de kezdtem aggódni. Számos vitát találhat a NAS-meghajtó hőmérsékletéről és annak Linux/Python környezetből történő megfigyeléséről. De nekem egyik megoldás sem vált be!
Amit akartam:
Az adatokat SNMP protokollon keresztül gyűjtjük a pysnmp csomagon keresztül.
Az SNMP és a MIB megértése
Az SNMP (Simple Network Management Protocol) egy széles körben használt protokoll a hálózati eszközök állapotának és teljesítményének figyelésére. Lehetővé teszi olyan adatok gyűjtését, mint például a hőmérséklet, a CPU-használat és a lemez állapota.
A MIB-ek (Management Information Bases) olyan információk adatbázisai, amelyek SNMP-n keresztül lekérdezhetők. Minden adatot egy OID (Object Identifier) azonosít, amely egyedileg azonosít egy változót, amely SNMP-n keresztül olvasható vagy beállítható.
Meg kell adnia a begyűjtendő MIB értékeket. Synology NAS-om van. A MIB fájlt közzéteszik az oldalaikon. Össze kell gyűjtenünk:
A pysnmp oldalon van egy kiváló chatbot . Ez írta nekem a Python szkript törzsét, kezelve az SNMP API-val kapcsolatos összes nehézséget és kezelve az aszinkron hívásokat. A legfontosabb rész a következő:
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})
Engedélyeznie kell az SNMP protokollt a Synology NAS beállításaiban:
A szkriptet közvetlenül a NAS-ra telepítettem a Docker környezetben. Biztosítania kell, hogy a Docker-tároló újrainduljon az esetleges újraindítás után. Ebből az okból állítottam be egy egyszerű docker-compose.yaml fájlt:
version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature
Ezután indítsa el a Dockert docker-compose up -d
paranccsal.
Csatlakozom a 2minloghoz – egy egyszerű rendszer az adatok összegyűjtésére, feldolgozására és megjelenítésére. Az adatokat HTTPS-kéréseken keresztül (az URL-ben vagy a törzsben kódolva) küldi el, és ott beállít egy vizualizációs szkriptet. A grafikonok ezután bárhonnan elérhetők.
Használhatja a 2minlogot. Alternatív megoldásként elküldheti az adatokat adatbázisba vagy helyi fájlrendszerbe.
Beállítottam egy egyszerű Matplotlib szkriptet a grafikon megjelenítéséhez. Valójában a ChatGPT-t (o1-preview) kértem meg, és elég jól sikerült. A Python szkript nem volt tökéletes, de elég jó volt a feladat gyors befejezéséhez. A felszólítás lent található.
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 ...
A vizualizációs szkript a 2minlog platformon belül kerül telepítésre. Helyben is futtathatja.
A szkript elérhető a GitHubon .
Használhat egy teljesen felügyelt 2minlogot az adatok összegyűjtésére, feldolgozására és megjelenítésére. Tekintse meg a dokumentációt . Az eredményeket az asztalomon ülő Android táblagépen jelenítem meg, és az Image Tuner segítségével körbejárom a különböző grafikonokat. Az adatokat a helyi fájlrendszerére is mentheti, és ugyanezt megteheti.
A megoldást Synology NAS-on tesztelték, de másokhoz is adaptálható.
#Synology #SynologyNAS #Hőmérséklet #Monitoring #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker