앞서 포스팅한 개념들과 오픈소스 기술들을 활용해서, 간단하게 집에 있는 네트워크 기기들의 상태들을 모니터링 할 수 있는 시스템을 구축해보도록 하려고 한다. 내 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 에 저장하는 로직을 만들어 보도록 하자.
'Project > 개인 Project' 카테고리의 다른 글
| [개인 Project] NAS 를 이용한 개인 모니터링 시스템 구축하기 -3 편 (WAS 와 DB 연동) (1) | 2025.05.22 |
|---|---|
| [개인 Project] NAS 를 이용한 개인 모니터링 시스템 구축하기 -2 편 (데이터 DB 저장) (4) | 2025.05.20 |
| [Project] API 응답문 데이터 통일화 및 알고리즘 적용 마무리 (0) | 2025.03.28 |
| [Project] API 응답문 데이터 통일화 및 알고리즘 적용하기 -2 (0) | 2025.03.27 |
| [Project] API 응답문 데이터 통일화 및 알고리즘 적용하기 -1 (0) | 2025.03.26 |