MRTG и SNMP настройка под Gentoo
MRTG (Multi Router Traffic Grapher) — является свободным программным обеспечением под лицензией GPL. Это инструмент для организации сервиса для мониторинга и измерения сетевого трафика с течением времени. Данные с различных сетевых устройств собираются при помощи протокола SNMP, а затем отображаются в виде графиков.
Установка
Для работы с mrtg понядобятся следующие пакеты:
Code: Необходимые пакеты |
net-analyzer/net-snmp media-libs/gd net-analyzer/mrtg sys-process/dcron sysstat |
Ставяться все пакеты стандартным
Настройка
Создание папок для конфигов
Под рутом создаём следующие папки:
место для конфигурационных файлов. Лежат *.cfg и *.sh а так же файлы, которые создаёт mrtg.
Папка с заданиями для крона.
создаём папку для веб вывода данных
Конфигурация SNMP демона
SNMP (англ. Simple Network Management Protocol — простой протокол управления сетью) — это протокол управления сетями связи на основе архитектуры TCP/IP.
Далее создаём (правим) конфиг.
#### # First, map the community name (COMMUNITY) into a security name # (local and mynetwork, depending on where the request is coming # from): # sec.name source community com2sec local 127.0.0.0/24 public #### # Second, map the security names into group names: # sec.model sec.name group MyROGroup v1 local group MyROGroup v2c local group MyROGroup usm local #### # Third, create a view for us to let the groups have rights to: # incl/excl subtree mask view all included .1 80 #### # Finally, grant the 2 groups access to the 1 view with different # write permissions: # context sec.model sec.level match read write notif access MyROGroup "" any noauth exact all none none ############################################################################### # System contact information # syslocation Russia.Moscow syscontact Alexander <gav-alex@bk.ru>
Делаем это не обращая внимание на предупреждения не делать этого =). В файле /etc/snmp/snmpd.conf.example можно почитать, что означают те или иные параметры конфига.
Теперь проверяем настройки другого конфига snmp. Где надо убедиться, что у нас есть там необходимая единственная нам строчка, которая говорит о том, что все данные надо брать из конфига, который мы создали чуть выше - /etc/snmp/snmpd.conf
# Initial (empty) options. SNMPD_FLAGS="-C -c /etc/snmp/snmpd.conf"
Теперь добавляем демон в атозапуск и стартуем его. Теперь у нас есть основной источник для фидинга данных =).
Настройка конфигов для мониторинга сетевых интерфейсов
Дадим систему самой создать дефолтный конфиг, который потом немного подправим под свои нужды.
/usr/bin/cfgmaker \ --output=/etc/mrtg/traffic.cfg \ --ifdesc=ip \ --ifref=descr \ --global "WorkDir: /var/www/stat/htdocs/mrtg/net" \ --global "Options[_]: bits,growright" \ public@localhost
Далее в ручную поправим файл для того, чтобы активировать lo и ppp.
В итоге у меня вышел вот такой файл.
### Global Config Options # for UNIX # WorkDir: /home/http/mrtg ### Global Defaults # to get bits instead of bytes and graphs growing to the right # Options[_]: growright, bits EnableIPv6: no WorkDir: /var/www/stat/htdocs/mrtg/net Options[_]: bits,growright,nopercent ###################################################################### # System: router_a # Description: Linux router_a 2.6.27-gentoo-r8-released_by_alex- #1 SMP Tue Apr 21 00:13:13 MSD 2009 x86_64 # Contact: Alexander <gav-alex@bk.ru> # Location: Russia.Moscow ###################################################################### ### Interface 1 >> Descr: 'lo' | Name: 'lo' | Ip: '127.0.0.1' | Eth: '' ### Target[localhost_lo]: \lo:public@localhost: SetEnv[localhost_lo]: MRTG_INT_IP="127.0.0.1" MRTG_INT_DESCR="lo" MaxBytes[localhost_lo]: 125000000 Title[localhost_lo]: Localhost bandwidth XSize[localhost_lo]: 600 YSize[localhost_lo]: 150 RouterUptime[localhost_lo]: public@localhost PageTop[localhost_lo]: <h1>Localhost bandwidth @ router_a</h1> <div id="sysdetails"> <table> <tr> <td>System:</td> <td>router_a located in Russia.Moscow</td> </tr> <tr> <td>Maintainer:</td> <td>Alexander <gav-alex@bk.ru></td> </tr> <tr> <td>Description:</td> <td>lo </td> </tr> <tr> <td>ifType:</td> <td>softwareLoopback (24)</td> </tr> <tr> <td>ifName:</td> <td>lo</td> </tr> <tr> <td>Max Speed:</td> <td>10.0 Mbits/s</td> </tr> <tr> <td>Ip:</td> <td>127.0.0.1 (localhost)</td> </tr> </table> </div> ### Interface 2 >> Descr: 'eth0' | Name: 'eth0' | Ip: '10.134.46.181' | Eth: '00-22-15-64-00-4f' ### Target[localhost_eth0]: \eth0:public@localhost: SetEnv[localhost_eth0]: MRTG_INT_IP="10.134.46.181" MRTG_INT_DESCR="eth0" MaxBytes[localhost_eth0]: 125000000 Title[localhost_eth0]: Internet bandwidth XSize[localhost_eth0]: 600 YSize[localhost_eth0]: 150 RouterUptime[localhost_eth0]: public@localhost PageTop[localhost_eth0]: <h1>Internet bandwidth @ router_a</h1> <div id="sysdetails"> <table> <tr> <td>System:</td> <td>router_a located in Russia.Moscow</td> </tr> <tr> <td>Maintainer:</td> <td>Alexander <gav-alex@bk.ru></td> </tr> <tr> <td>Description:</td> <td>eth0 </td> </tr> <tr> <td>ifType:</td> <td>ethernetCsmacd (6)</td> </tr> <tr> <td>ifName:</td> <td>eth0</td> </tr> <tr> <td>Max Speed:</td> <td>100.0 Mbits/s</td> </tr> <tr> <td>Ip:</td> <td>10.134.46.181</td> </tr> </table> </div> ### Interface 3 >> Descr: 'eth1' | Name: 'eth1' | Ip: '192.168.0.1' | Eth: '00-22-15-63-eb-fd' ### Target[localhost_eth1]: \eth1:public@localhost: SetEnv[localhost_eth1]: MRTG_INT_IP="192.168.0.1" MRTG_INT_DESCR="eth1" MaxBytes[localhost_eth1]: 125000000 Title[localhost_eth1]: LAN bandwidth XSize[localhost_eth1]: 600 YSize[localhost_eth1]: 150 RouterUptime[localhost_eth1]: public@localhost PageTop[localhost_eth1]: <h1>LAN bandwidth @ router_a</h1> <div id="sysdetails"> <table> <tr> <td>System:</td> <td>router_a located in Russia.Moscow</td> </tr> <tr> <td>Maintainer:</td> <td>Alexander <gav-alex@bk.ru></td> </tr> <tr> <td>Description:</td> <td>eth1 </td> </tr> <tr> <td>ifType:</td> <td>ethernetCsmacd (6)</td> </tr> <tr> <td>ifName:</td> <td>eth1</td> </tr> <tr> <td>Max Speed:</td> <td>100.0 Mbits/s</td> </tr> <tr> <td>Ip:</td> <td>192.168.0.1</td> </tr> </table> </div>
Настройка мониторинга активости процессора
Сперва я пытался пойти по обычному пути. Создал конфиг следующего содержания:
WorkDir: /var/www/localhost/htdocs/mrtg LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt Target[localhost.cpu]:ssCpuRawUser.0&ssCpuRawUser.0:public@127.0.0.1 + ssCpuRawSystem.0&ssCpuRawSystem.0:public@127.0.0.1 + ssCpuRawNice.0&ssCpuRawNice.0:public@127.0.0.1 RouterUptime[localhost.cpu]: public@127.0.0.1 MaxBytes[localhost.cpu]: 100 Title[localhost.cpu]: CPU Load PageTop[localhost.cpu]: <H1>Active CPU Load %</H1> Unscaled[localhost.cpu]: ymwd ShortLegend[localhost.cpu]: % YLegend[localhost.cpu]: CPU Utilization Legend1[localhost.cpu]: Active CPU in % (Load) Legend2[localhost.cpu]: Legend3[localhost.cpu]: Legend4[localhost.cpu]: LegendI[localhost.cpu]: Active LegendO[localhost.cpu]: Options[localhost.cpu]: growright,nopercent
Даже скачал недостающий файл UCD-SNMP-MIB.txt, однако, это не прокатило. Данные которые получал MRTG были совершенно неверные и график строился не тот, что ожидалось.
Поэтому подумав, я понял, что Mrtg ведь может строить вообще любые графики, лишь бы был источник информации. Ему на фход передаются 2 значение (Input и Output), которые он и отображает на графиках. Потому было решено создать собственный конфиг для сбора инфы о загрузке моего E6600.
PageTop[localhost.cpu]: <H1>Active CPU Load %</H1> XSize[localhost.cpu]: 600 YSize[localhost.cpu]: 150 RouterUptime[localhost.cpu]: public@localhost WorkDir: /var/www/stat/htdocs/mrtg/cpu #Browser Title Title[localhost.cpu]:CPU Load Target[localhost.cpu]: `/etc/mrtg/cpu_utilization.sh` MaxBytes[localhost.cpu]: 150 Options[localhost.cpu]: growright,unknaszero,nopercent,gauge,pngdate LegendI[localhost.cpu]: User, % LegendO[localhost.cpu]: System, % YLegend[localhost.cpu]: CPU Utilization Legend1[localhost.cpu]: Avg load by User in % Legend2[localhost.cpu]: Avg load by System in % ShortLegend[localhost.cpu]: % #Colours[localhost.cpu]: Yellow#FFFF00,Crimson#DC143C,GREEN#00eb0c,BLUE#1000ff
Поясню некоторые параметры:
PageTop - HTML, которые добавляется до графиков
XSize, YSize - размеры генерируемой картинки (максимум 600 на 150).
RouterUptime - вывод информаци и названии систему, а так же её аптайм.
WorkDir - рабочая папка, куда будет генится отчёт (веб директория в нашем случае)
Title - заголовок, который помещается в HTML tag <tite></title>
Target - Источник данных. В нашем случае это скриптик, который я написал. Его рассмотрим ниже.
MaxBytes - максимально возможное значение данныех, которое будет считаться валидным.
Options - опции построения графика (в нашем случае это: 1)строить справа на лево, 2) все неизвестные значения принимать как нулевые, 3) не показывать процентное соотношение текущих значений парамотров относительно их максимумов возможных, 4) данные по которым строим график не являются накопительными, т.е. строим например графики температуры процессора, 5) вписывать дату в png картинку)
LegendI - название первой кривой на графике (входные данные)
LegendO - название второй кривой на графике (выходные данные)
Legend1 - внизу после графиков указывается легенда, что означает конкретный цвет.
Legend2 - внизу после графиков указывается легенда, что означает конкретный цвет.
ShortLegend - это в каких единицах измеряется текущая величина (например у процессора это %)
Colours - цветовая схема построения графика
YLegend - подпись оси ординат на самой картинке png.
Создание скрипта для снятия показаний с процессора
Для сбора информации о загруженности процессора как я и писал выше, использую sysstat. В этот пакет входит масса различных програмок для вывода разнообразной инфы. Меня интересует именно процессор. Т.к. mrtg выводит данные беря их 1 раз в 5 минут, то нет смысла собирать данные по каждому ядру в отдельности. Я пошёл по пути сбора общей загрузки процессора. Для этого скрипт делает 10 замеров с интервалом в 1 секунду, выводя из этих данных среднее значение. При этом замеряется сразу общая загрузка ЦП не делая акценты на ядра. Для этого всего используется команда sar -u 1 10.
Далее мы скриптом выбираем строчку, с усреднёнными данными командой grep "Average" и далее работаем уже с ней. Командой awk '{print $3+$4 }'` мы заносим в переменную USER сумму третьего и четвёртого слова строки выбранной grep "Average". А именно это загрузка процессора приложениями пользоватея, работающих с обычным приоритетом, а так же те, приоритет которых был понижен - nice. Строка awk '{print $5 }'` собирает данные о процессорном времени, потраченном на приложения уровня ядра системы. В итоге у меня вышел такой скрипт:
#!/bin/sh DATA=`sar -u 1 10 | grep "Average"` USER=`echo $DATA | awk '{print $3+$4 }'` SYSTEM=`echo $DATA | awk '{print $5 }'` echo $USER echo $SYSTEM
Ну и банальное - надо дать права на исполнение данного скрипта:
Настройка мониторинга памяти
Надо сразу определится, что понятие память весьма обширно. Поэтому, есть смысл написать мониторинг для каждого случая. Пояснять каждую строку конфига смысла нет - все они говорят сами за себя. Некоторые тем более был рассмотрены в секции выше (о процессоре). Так что просто привожу содержимое конфигов.
Buffered RAM
LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt Target[stor_memory_buffers]: hrStorageSize.6&hrStorageSize.1:public@localhost * hrStorageAllocationUnits.6&hrStorageAllocationUnits.1:public@localhost PageTop[stor_memory_buffers]: <H1>Buffered data in RAM</H1> WorkDir: /var/www/stat/htdocs/mrtg/mem XSize[stor_memory_buffers]: 600 YSize[stor_memory_buffers]: 150 RouterUptime[stor_memory_buffers]: public@localhost Options[stor_memory_buffers]: growright,gauge,nopercent,pngdate LegendI[stor_memory_buffers]: Size: LegendO[stor_memory_buffers]: RAM: Legend1[stor_memory_buffers]: Memory buffers Legend2[stor_memory_buffers]: Physical RAM Size Title[stor_memory_buffers]: Memory buffers Kilo[stor_memory_buffers]: 1024 MaxBytes[stor_memory_buffers]: 10000000000 ShortLegend[stor_memory_buffers]: iB YLegend[stor_memory_buffers]: Bytes #kMG[localhost.mem]: k,M,G,T,P,X
Cached RAM
LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt Target[stor_cached_memory]: hrStorageSize.7&hrStorageSize.1:public@localhost * hrStorageAllocationUnits.7&hrStorageAllocationUnits.1:public@localhost PageTop[stor_cached_memory]: <H1>Cached data in RAM</H1> WorkDir: /var/www/stat/htdocs/mrtg/mem XSize[stor_cached_memory]: 600 YSize[stor_cached_memory]: 150 RouterUptime[stor_cached_memory]: public@localhost Options[stor_cached_memory]: growright,gauge,nopercent,pngdate LegendI[stor_cached_memory]: Used: LegendO[stor_cached_memory]: Total RAM: Legend1[stor_cached_memory]: Used cache Legend2[stor_cached_memory]: Total RAM Title[stor_cached_memory]: Cached memory Kilo[stor_cached_memory]: 1024 MaxBytes[stor_cached_memory]: 10000000000 ShortLegend[stor_cached_memory]: iB YLegend[stor_cached_memory]: Bytes #kMG[localhost.mem]: k,M,G,T,P,X
Physical RAM
LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt Target[stor_physical_memory]: hrStorageUsed.1&hrStorageSize.1:public@localhost * hrStorageAllocationUnits.1&hrStorageAllocationUnits.1:public@localhost PageTop[stor_physical_memory]: <H1>RAM Usage</H1> WorkDir: /var/www/stat/htdocs/mrtg/mem XSize[stor_physical_memory]: 600 YSize[stor_physical_memory]: 150 RouterUptime[stor_physical_memory]: public@localhost Options[stor_physical_memory]: growright,gauge,nopercent,pngdate LegendI[stor_physical_memory]: Used: LegendO[stor_physical_memory]: Total: Legend1[stor_physical_memory]: Used RAM Legend2[stor_physical_memory]: Total RAM Title[stor_physical_memory]: Physical memory Kilo[stor_physical_memory]: 1024 MaxBytes[stor_physical_memory]: 10000000000 ShortLegend[stor_physical_memory]: iB YLegend[stor_physical_memory]: Bytes #kMG[localhost.mem]: k,M,G,T,P,X
Swap
LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt Target[stor_swap_space]: hrStorageUsed.10&hrStorageSize.10:public@localhost * hrStorageAllocationUnits.10&hrStorageAllocationUnits.10:public@localhost PageTop[stor_swap_space]: <H1>Swap Usage</H1> WorkDir: /var/www/stat/htdocs/mrtg/mem XSize[stor_swap_space]: 600 YSize[stor_swap_space]: 150 RouterUptime[stor_swap_space]: public@localhost Options[stor_swap_space]: growright,gauge,nopercent,pngdate LegendI[stor_swap_space]: Used: LegendO[stor_swap_space]: Total: Legend1[stor_swap_space]: Used Swap Legend2[stor_swap_space]: Total Swap Title[stor_swap_space]: Swap Space Kilo[stor_swap_space]: 1024 MaxBytes[stor_swap_space]: 1000000000 ShortLegend[stor_swap_space]: iB YLegend[stor_swap_space]: Bytes #kMG[localhost.mem]: k,M,G,T,P,X
Virtual RAM
LoadMIBs: /usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt Target[stor_virtual_memory]: hrStorageUsed.3&hrStorageSize.3:public@localhost * hrStorageAllocationUnits.3&hrStorageAllocationUnits.3:public@localhost PageTop[stor_virtual_memory]: <H1>Virtual Memory Usage (Swap + RAM)</H1> WorkDir: /var/www/stat/htdocs/mrtg/mem XSize[stor_virtual_memory]: 600 YSize[stor_virtual_memory]: 150 RouterUptime[stor_virtual_memory]: public@localhost Options[stor_virtual_memory]: growright,gauge,nopercent,pngdate LegendI[stor_virtual_memory]: Used: LegendO[stor_virtual_memory]: Total: Legend1[stor_virtual_memory]: Used Virtual Legend2[stor_virtual_memory]: Total Virtual Title[stor_virtual_memory]: Virtual memory Kilo[stor_virtual_memory]: 1024 MaxBytes[stor_virtual_memory]: 10000000000 ShortLegend[stor_virtual_memory]: iB YLegend[stor_virtual_memory]: Bytes #kMG[localhost.mem]: k,M,G,T,P,X
Настройка мониторинга статистики пингов
Очень интересна может оказаться информация, показывающая как меняется пинг и потери до определённого хоста со временем. Я для себя выбрал гугл и яндекс.
Google ping statistics
WorkDir: /var/www/stat/htdocs/mrtg/net XSize[localhost.ping_google]: 600 YSize[localhost.ping_google]: 150 RouterUptime[localhost.ping_google]: public@localhost Title[localhost.ping_google]: Round Trip Time to google.com PageTop[localhost.ping_google]: <H1>Ping to google.com</H1> Target[localhost.ping_google]: `/etc/mrtg/ping_google.sh` MaxBytes[localhost.ping_google]: 2000 Options[localhost.ping_google]: growright,unknaszero,nopercent,gauge,pngdate LegendI[localhost.ping_google]: Pkt loss % LegendO[localhost.ping_google]: Avg RTT ms YLegend[localhost.ping_google]: RTT (ms) ShortLegend[localhost.ping_google]: n/a
Как видно из конфига, данные для mrtg поставляет скриптик, чьё содержимое выглядит как:
#!/bin/sh PING="/bin/ping" # Google, for example ADDR="google.com" DATA=`$PING -c10 -s500 $ADDR -q ` LOSS=`echo $DATA | awk '{print $18 }' | tr -d %` echo $LOSS if [ $LOSS = 100 ]; then echo 0 else echo $DATA | awk -F/ '{print $5 }' fi
В кратце можно пояснить, что скрипт пингует 10 раз хост с размером пакета 500 байт (параметр q означает "тихий вывод данных" - т.е. выводится лишь суммарная информация о выполненой команде). В переменную LOSS заносим потери обрезая символ процентов командой tr. Если потери равны 100, то пинг равен 0 мс, т.е. падение интернета!, иначе, выводим данные в милллисекундах.
Не забываем и о правах на исполнение скрипта:
Yandex ping statistics
WorkDir: /var/www/stat/htdocs/mrtg/net XSize[localhost.ping_yandex]: 600 YSize[localhost.ping_yandex]: 150 RouterUptime[localhost.ping_yandex]: public@localhost Title[localhost.ping_yandex]: Round Trip Time to ya.ru PageTop[localhost.ping_yandex]: <H1>Ping to ya.ru</H1> Target[localhost.ping_yandex]: `/etc/mrtg/ping_yandex.sh` MaxBytes[localhost.ping_yandex]: 2000 Options[localhost.ping_yandex]: growright,unknaszero,nopercent,gauge,pngdate LegendI[localhost.ping_yandex]: Pkt loss % LegendO[localhost.ping_yandex]: Avg RTT ms YLegend[localhost.ping_yandex]: RTT (ms) ShortLegend[localhost.ping_yandex]: n/a
Как видно из конфига, данные для mrtg поставляет скриптик, чьё содержимое выглядит как:
#!/bin/sh PING="/bin/ping" # Yandex, for example ADDR="ya.ru" DATA=`$PING -c10 -s500 $ADDR -q ` LOSS=`echo $DATA | awk '{print $18 }' | tr -d %` echo $LOSS if [ $LOSS = 100 ]; then echo 0 else echo $DATA | awk -F/ '{print $5 }' fi
Скрипт полностью аналогичен варианту пинга до гугла.
Не забываем и о правах на исполнение скрипта:
Создание заданий для крона
/etc/cron.mrtg/cpu
- !/bin/sh
/usr/bin/mrtg /etc/mrtg/cpu.cfg
/etc/cron.mrtg/mem
- !/bin/sh
/usr/bin/mrtg /etc/mrtg/mem.cfg
/etc/cron.mrtg/ping
- !/bin/sh
/usr/bin/mrtg /etc/mrtg/ping.cfg
/etc/mrtg/ping.sh
#!/bin/sh PING="/bin/ping" # Google, for example ADDR="google.com" DATA=`$PING -c10 -s500 $ADDR -q ` LOSS=`echo $DATA | awk '{print $18 }' | tr -d %` echo $LOSS if [ $LOSS = 100 ]; then echo 0 else echo $DATA | awk -F/ '{print $5 }' fi
/bin/chmod +x /etc/cron.mrtg/* /bin/chmod +x /etc/mrtg/ping.sh
Run each script 3 times (disregard the warnings) /etc/cron.mrtg/traffic /etc/cron.mrtg/cpu /etc/cron.mrtg/mem /etc/cron.mrtg/ping_google /etc/cron.mrtg/ping_yandex
Make the Index
/usr/bin/indexmaker --output=/var/www/localhost/htdocs/mrtg/index.html \ --title=".::Router_a Statistics::." \ --sort=name \ --enumerate \ /etc/mrtg/traffic.cfg \ /etc/mrtg/cpu.cfg \ /etc/mrtg/mem_physical.cfg \ /etc/mrtg/mem_virtual.cfg \ /etc/mrtg/mem_buffer.cfg \ /etc/mrtg/mem_swap.cfg \ /etc/mrtg/mem_cached.cfg \ /etc/mrtg/ping_google.cfg \ /etc/mrtg/ping_yandex.cfg
Make the mrtg.cfg
cfgmaker --global "WorkDir: /var/www/localhost/htdocs/mrtg/" \ --global "Options[_]: growright,bits" \ --ifref=ip \ public@localhost > /etc/mrtg/mrtg.cfg
Cronjob
/bin/cat >> /var/spool/cron/crontabs/root
- /5 * * * * /bin/run-parts /etc/cron.mrtg >/dev/null 2>&1
Если нет нужного файла
http://www.shrubbery.net/mibs/UCD-SNMP-MIB.txt
Ссылки
http://oss.oetiker.ch/mrtg/doc/mrtg-faq.en.html http://209.85.135.104/search?q=cache:F7kOdNopPnEJ:no.gentoo-wiki.com/HOWTO_SNMP_and_MRTG_Made_Easy+MRTG+gentoo+wiki&hl=en&ct=clnk&cd=1&client=opera http://forums.gentoo.org/viewtopic-t-105862-postdays-0-postorder-asc-start-50.html http://www.net-snmp.org/wiki/index.php/TUT:snmpwalk