תמיד תהיתי לגבי טמפרטורת הדיסקים הקשיחים ב-NAS שלי. יש לי את ה-NAS בחדר סגור ללא מיזוג אוויר. יתרה מכך, פירקתי את ה-NAS לפני זמן מה, והדיסקים היו ממש לוהטים... לא מדדתי אז את הטמפרטורה, אבל התחלתי להיות מודאג. אתה יכול למצוא דיונים רבים על טמפרטורת כונן NAS וניטור זה מסביבת Linux/Python. אבל אף אחד מהפתרונות לא עבד בשבילי!
מה שרציתי:
נאסוף נתונים באמצעות פרוטוקול SNMP באמצעות חבילת pysnmp .
הבנת SNMP ו-MIBs
SNMP (Simple Network Management Protocol) הוא פרוטוקול בשימוש נרחב לניטור התקינות והביצועים של התקני רשת. זה מאפשר איסוף נתונים כגון טמפרטורות, שימוש במעבד ומצב דיסק.
MIBs (Management Information Bases) הם מסדי נתונים של מידע שניתן לבצע שאילתה באמצעות SNMP. כל פיסת נתונים מזוהה על ידי OID (זיהוי אובייקט), המזהה באופן ייחודי משתנה שניתן לקרוא או להגדיר באמצעות SNMP.
עליך לציין את ערכי ה-MIB לאיסוף. יש לי Synology NAS. הם מפרסמים את קובץ MIB בדפים שלהם. אנחנו צריכים לאסוף:
יש צ'אט בוט מצוין בדף pysnmp. זה כתב לי את גוף הסקריפט של Python, טיפל בכל הקשיים עם SNMP API וטיפול בקריאות אסינכרון. להלן סעיף המפתח:
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})
עליך להפעיל את פרוטוקול SNMP בהגדרות Synology NAS:
פרסתי את הסקריפט ישירות על ה-NAS בסביבת Docker. עליך לוודא שהמכולה של Docker מתחילה שוב לאחר ההפעלה מחדש. הגדרתי קובץ docker-compose.yaml פשוט מסיבה זו:
version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature
לאחר מכן הפעל את ה- Docker עם docker-compose up -d
.
אני קשור ל -2minlog - מערכת פשוטה לאיסוף, עיבוד והצגה של נתונים. אתה שולח לשם את הנתונים באמצעות בקשות HTTPS (מקודדות ב-URL או בגוף) ומגדיר שם סקריפט להדמיה. לאחר מכן, הגרפים יהיו זמינים מכל מקום שאתה צריך.
אתה יכול להשתמש ב-2minlog. לחלופין, ניתן לשלוח את הנתונים למסד נתונים או למערכת קבצים מקומית.
הגדרתי סקריפט פשוט של Matplotlib כדי להציג את הגרף. למעשה, ביקשתי מ-ChatGPT (o1-preview) לעשות את זה, וזה עשה די טוב. התסריט של Python לא היה מושלם, אבל הוא היה מספיק טוב כדי לסיים את המשימה במהירות. ההנחיה נמצאת למטה.
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 ...
סקריפט ההדמיה נפרס בתוך פלטפורמת 2minlog. אתה יכול גם להפעיל אותו באופן מקומי.
התסריט זמין ב- GitHub .
אתה יכול להשתמש ב -2minlog מנוהל במלואו כדי לאסוף, לעבד ולהמחיש את הנתונים. בדוק את התיעוד . אני מציג את התוצאות בטאבלט אנדרואיד שיושב על השולחן שלי ועובר במחזוריות לפי הגרפים השונים עם Image Tuner . אתה יכול גם לשמור את הנתונים במערכת הקבצים המקומית שלך ולעשות אותו דבר.
הפתרון נבדק ב-Synology NAS, אך ניתן להתאים אותו לאחרים.
#Synology #SynologyNAS #טמפרטורה #ניטור #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker