Project/개인 Project

[개인 Project] NAS 를 이용한 개인 모니터링 시스템 구축하기 -1 편 (데이터 추출)

강_토발즈 2025. 5. 19. 00:16

 

 

 

앞서 포스팅한 개념들과 오픈소스 기술들을 활용해서, 간단하게 집에 있는 네트워크 기기들의 상태들을 모니터링 할 수 있는 시스템을 구축해보도록 하려고 한다. 내 NAS 에서는 python3.9 , MariaDB 10, Apache HTTP Server 2.4 를 지원하고 있기 때문에, 일단 데스크탑이 작동하면 데스크탑 정보, SNMP 를 이용한 네트워크 정보, Gefroce 의 smi 명령어를 이용해서 GPU 정보를 추출하는 스크립트를 만들고, 이 정보를 NAS 의 MariaDB 로 저장한다. 그리고 DB 에 저장된 값들을 이용해서 간단하게 웹 페이지로 조회 및 모니터링 할 수 있는 흐름으로 만들어 보려고 한다. 대략적인 아키텍쳐는 아래와 같다.

 

 

 

1. 프로젝트 흐름

 

  • Python 라이브러리 없이, Shell script, 및 SNMP, gpu-smi 로 시스템 정보와 GPU 정보를 수집한다. (Python 라이브러리를 활요하면 시스템 정보, 네트워크 정보를 쉽게 가져올 수 있지만, 프로토콜 학습을 위해 돌아가는 길을 선택)
  • -Python 을 활용해서 MariaDB 에 바로 저장하도록 한다.
    (추 후 SpringBoot 로 시스템 정보와 GPU 정보를 DB에 저장하는 Rest API 서버로 업그레이드 한다. )
  • 저장된 정보를 보여주는 간단한 웹 페이지를 만들고 배포한다.

 

2. 시스템 정보, GPU 정보, 네트워크 정보를 추출하기

 

2-1. Desktop 으로부터 추출할 정보와 방법은 아래와 같다.

정보 종류 수집 방법  사용되는 프로토콜
CPU 정보 top, mpstat, /proc/stat shell script
메모리 사용량 free, /proc/meminfo, snmpget SNMP and sehll script
디스크 사용량 df, snmpget SNMP and sehll script
네트워크 트래픽 snmpget, /proc/net/dev SNMP
GPU 정보 nvidia-smi shell script

 

 

2-2.MIB 모듈 로딩하기

 

시스템 정보를 추출하기 위해 OID 를 사용하므로, 제대로 된 매핑을 위해 MIB 모듈을 다운로드하고, snmp 에서 사용할 수 있도록 차단 해제 해준다

 

- 모듈 다운로드

sudo apt install snmp-mibs-downloader

 

 

- 환경 설정 파일을 수정하여, 보안을 위해 차단한 MIB 로딩을 사용할 수 있도록 한다. ( 클라이언트가 MIB 읽을 수 있도록 mibs : 주석 처리)

sudo nano /etc/snmp/snmp.conf

 

 

mib :  이 항목을 주석 처리한다.

 

 

- SNMP 에이전트가 UCD 데이터를 노출하도록 view에 .1.3.6.1.4.1.2021 추가한다.

 

sudo vi /etc/snmp/snmpd.conf

 

 

 

view   systemview  included   .1.3.6.1.2.1.1
view   systemview  included   .1.3.6.1.4.1.2021
view   systemview  included   .1.3.6.1.2.1.2
view   systemview  included   .1.3.6.1.4.1.2021.9

 

위의 항목들을 추가하고 ( 시스템 정보, 네트워크 정보, 디스크 정보를 보겠다는 설정 정보를 추가하는 것)

 

systemonly -> systemview 로 수정한 뒤 저장하고 종료한다.

 

 

- 설정이 반영되기 위해 프로토콜 재시작하기

 

sudo systemctl restart snmpd

 

 

 

2-3. 정보수집 스크립트 파일 작성 

 

 

- 내용은 아래와 같다. 

#!/bin/bash

# SNMP 기본 설정
COMMUNITY="public"
TARGET="127.0.0.1"

# CPU Load (1분 평균)
CPU_LOAD=$(snmpget -v2c -c $COMMUNITY $TARGET UCD-SNMP-MIB::laLoad.1 | awk '{print $NF}')

# Memory
MEM_TOTAL=$(snmpget -v2c -c $COMMUNITY $TARGET UCD-SNMP-MIB::memTotalReal.0 | awk '{print $NF}')
MEM_AVAIL=$(snmpget -v2c -c $COMMUNITY $TARGET UCD-SNMP-MIB::memAvailReal.0 | awk '{print $NF}')
MEM_USED=$((MEM_TOTAL - MEM_AVAIL))

# Disk (첫 번째 디스크)
DISK_USED=$(snmpget -v2c -c $COMMUNITY $TARGET UCD-SNMP-MIB::dskPercent.1 | awk '{print $NF}')

# Network (ifInOctets.2 는 네트워크 인터페이스 목록 2를 나타냄)
NET_IN=$(snmpget -v2c -c $COMMUNITY $TARGET IF-MIB::ifInOctets.2 | awk '{print $NF}')
NET_OUT=$(snmpget -v2c -c $COMMUNITY $TARGET IF-MIB::ifOutOctets.2 | awk '{print $NF}')

# GPU Info via nvidia-smi
GPU_INFO=$(nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv,noheader,nounits 2>/dev/null)
IFS=',' read -r GPU_UTIL GPU_MEM GPU_TEMP <<< "$GPU_INFO"

# 타임스탬프
NOW=$(date '+%Y-%m-%d %H:%M:%S')

# 출력
echo "[$NOW]"
echo "CPU Load (1min):        $CPU_LOAD"
echo "Memory Used (KB):       $MEM_USED / $MEM_TOTAL"
echo "Disk Used (%):          $DISK_USED"
echo "Network In (bytes):     $NET_IN"
echo "Network Out (bytes):    $NET_OUT"
echo "GPU Util (%):           $GPU_UTIL"
echo "GPU Memory Used (MB):   $GPU_MEM"
echo "GPU Temp (°C):          $GPU_TEMP"

 

 

- 이 스크립트의 이름을 sysInfoScrapper 로 지어 줬다.

 

- 텍스트 편집기에서 작성한 후 .sh 파일로 저장하고, 터미널에서 사용권한을 부여한 뒤 파일을 이름을 입력하여 사용해보면 결과가 아래와같이 나오게 된다.

 

 

 

 

오늘은 snmp 프로토콜과 shell script 를 이용해서 시스템 정보를 추출하는 과정까지 진행하였다.
다음에는 이 스크립트 파일을 주기적으로 실행하는 crontab 을 만들고, 일정 주기가 지나면 NAS 로 정보들을 전송하도록 구성한다.

(.CVS 파일), 이후 NAS 에서는 전달받은 CVS 파일을 읽고 정보들을 DB 에 저장하는 로직을 만들어 보도록 하자.