Категории

четверг, 27 декабря 2012 г.

Linux Ubuntu создаем файл подкачки Swap

Обычно swap создают размером в 2 раза превышающим размер доступной оперативной памяти.
Шаг первый: Создадим файл с помощью команды низкоуровневого копирования dd Файл забьём нулями из /dev/zero и разметим на 256 блоков по 1 Мб каждый:
Ubuntu$ sudo dd if=/dev/zero of=/swap256.swap bs=1M count=256
Шаг второй: отформатируем получившийся файл как swap устройство:
Ubuntu$ sudo mkswap /swap256.swap
Шаг третий: подключаем отформатированный файл (после второго шага это уже полноценный swap) с помощью команды swapon которая как раз для этого и предназначена.
Ubuntu$ sudo swapon /swap256.swap
Четвёртый шаг: делаем так чтобы swap файл подключался каждый раз при загрузке системы. Для этого в /etc/fstab добавляем одну строчку:
/swap256.swap none swap sw 0 0
Контролировать использование swap можно как обычно через опцию sysctl vm.swappiness
У меня в /etc/sysctl.conf прописано:
vm.swappiness=10
Это значит, что система будет использовать swap, если останется 10% от объема оперативной памяти.

Ссылки по теме:
1. Ubuntu. Как создать swap файл подкачки
2. Swappiness

среда, 26 декабря 2012 г.

Asterisk 1.8 и статистика по SNMP в zabbix

Прежде чем начинать собирать статистику с Asterisk по протоколу snmp, нужно чтобы в нем был модуль res_snmp.so:
FreeBSD# asterisk -rvvvv
...
pbx*CLI> module show like snmp                                                                                                                   Module                         Description                              Use Count 
res_snmp.so                    SNMP [Sub]Agent for Asterisk             0         
1 modules loaded
Как видим, все на месте. Для тех, у кого это нет этого модуля, нужно пересобрать порт с нужной опцией:
FreeBSD# make config
[*] SNMP      SNMP protocol
Когда разобрались с наличием модуля, идем в конфиг /usr/local/etc/asterisk/res_snmp.conf и включаем SNMP:
[general]
; We run as a subagent per default -- to run as a full agent
; we must run as root (to be able to bind to port 161)
subagent = yes
; SNMP must be explicitly enabled to be active
enabled = yes
Как видим, Asterisk не может открыть 161 порт (по нему работает протокол snmp), если он запущен не от пользователя root. Но не беда, по умолчанию asterisk работает как суб-агент snmp это значит, что он может отдавать данные в демон snmpd через сокет и ему не надо будет открывать 161 порт.
Готовим конфиг для snmp, вот мой конфиг /usr/local/etc/snmp/snmpd.conf:
syslocation  "Univers Server Room"
syscontact  admin@my_organization_dom
rocommunity  public ТУТ_IP_сервера_zabbix

master agentx
agentXPerms  0660 0550 asterisk asterisk
agentXSocket /var/agentx/master
Если с запуском Asterisk 1.8 в jail не возникло проблем, то с запуском snmpd было 2 проблемы:
1. Не запускался демон snmpd:
FreeBSD# service snmpd restart
snmpd not running? (check /var/run/net_snmpd.pid).
Starting snmpd.
/usr/local/etc/rc.d/snmpd: WARNING: failed to start snmpd
Сообщение об ошибке как-то не особо помогло в решении проблемы, но все-же рискнем заглянуть в логи:
FreeBSD# cat /var/log/snmpd.log 
init_kmem: kvm_openfiles failed: /dev/mem: No such file or directory
Agent initialization failed
Решение оказалось простым man snmpd:
FreeBSD# man snmpd
....
-r      Do not require root access to run the daemon.  Specifically, do
               not exit if files only accessible to root  (such  as  /dev/kmem
               etc.) cannot be opened.
.....
Как сказано в мане, говорим демону snmpd запускаться с опцией -r, добавляем в /etc/rc.conf строку:
#----------------------------- SNMP ---------------------------------------#
snmpd_enable="YES"
snmpd_flags="-r"
#--------------------------------------------------------------------------#
И пробуем еще раз, теперь должно все запуститься:
FreeBSD# service snmpd restart
Stopping snmpd.
Waiting for PIDS: 27711.
Starting snmpd.
Error 2 (No such file or directory) could not get the assoclist
Опять какая-то ошибка, немного погуглив яндексом в рамблере нашел страничку с описанием бага #2311, там говорится про ядро FreeBSD и отсутствие в нем SCTP (У меня в ядре как раз небыло этого SCTP) и эту ошибку можно спокойно проигнорировать. Ну чтож, если говорят, что все должно работать, то проверяем:
FreeBSD# sockstat | grep snmpd
root     snmpd      27758 6  udp4   *:161                 *:*
root     snmpd      27758 7  stream /var/agentx/master
root     snmpd      27758 8  tcp4   *:199                 *:*
root     snmpd      27758 9  stream /var/agentx/master
Как видим, snmpd слушает 161 порт (по нему работает протокол snmp) и сокет /var/agentx/master. Значит мы все сделали правильно, и теперь двигаемся дальше к настройке zabbix.
...... Тут должна быть часть о настройке Zabbix :) Позже допишу. ......

Ссылки по теме:
1. FreeBSD jails and net-snmp
2. SourceForge SNMPd bug: #2311 5.7.1 errors at startup on FreeBSD systems without SCTP
3. Asterisk MIB Definitions
4. asterisk-users mailing list - ASTERISK and SNMP
5. Мониторим Asterisk при помощи snmp и Zabbix

пятница, 21 декабря 2012 г.

Установка git + gitweb + nginx + fcgiwrap на FreeBSD.

Понадобился репозиторий для хранения конфигов серверов и активного сетевого оборудования. Почитав про системы контроля версий и немного поразмыслив выбрал git.
У меня уже имелся готовый веб хостинг на nginx под FreeBSD - решил использовать его. Итак смотрим что есть в составе порта git:
FreeBSD# cd /usr/ports/devel/git/
FreeBSD# make config
[*] CONTRIB    Install contributed scripts
[*] CURL       Data transfer via cURL
[*] CVS        Enable CVS support
[ ] ETCSHELLS  Modify /etc/shells
[*] GITWEB     Install gitweb
[ ] GUI        GUI (Graphical User Interface)
[ ] HTMLDOCS   Install additional documentation
[*] ICONV      Encoding conversion via iconv
[*] NLS        Native Language Support
[*] P4         Enable Perforce support
[*] PERL       Perl scripting language
[ ] SVN        Subversion support
Меня интересовали 2 вещи, какая-нибудь простенькая веб морда интерфейс и собственно сам git. Видим, что в составе порта есть GITWEB, как говорит wikipedia "gitweb - написан на Perl (Kay Sievers). Большинство приведённых ниже крупных публичных git-репозиториев его и применяет."
Настраиваем по вкусу и ставим:
FreeBSD# make config-recursive
FreeBSD# make install clean
Затем идем в /etc/rc.conf и приводим блок с веб сервером примерно к такому виду:
#----------------------------- nginx --------------------------------------#
nginx_enable="YES"  # (bool) Set to "NO" by default. Set it to "YES" to enable nginx
nginx_profiles=""  # (str) Set to "" by default. Define your profiles here.
nginxlimits_enable="NO"  # (bool) Set to "NO" by default. Set it to yes to run `limits $limits_args` just before nginx starts.
nginx_flags=""   # (str) Set to "" by default. Extra flags passed to start command.
nginxlimits_args="-e -U www" # (str) Default to "-e -U www" Arguments of pre-start limits run.

php_fpm_enable="YES"  # 

fcgiwrap_enable="YES"  # 
fcgiwrap_user="www"  # (str) run fcgiwrap as user
#fcgiwrap_socket="unix:/var/run/fcgiwrap/fcgiwrap.sock" #this could also be: tcp:[ipv4_addr]:port (for ipv4) | tcp6:[ipv6_addr]:port (for ipv6)
#fcgiwrap_flags="-c 4"
fcgiwrap_profiles="gitweb"
fcgiwrap_gitweb_socket="unix:/var/run/fcgiwrap/gitweb.socket"
#--------------------------------------------------------------------------#
Я специально запускаю отдельный экземпляр fcgiwrap для каждого "сайта". Если не дай бог упадет, то упадет только один сайт, а не все сразу. :)
Теперь настройки nginx:
server {
#-------------------------- Options --------------------------#
 listen 192.168.4.27:443;
 server_name git.local git;

 open_file_cache max=100000 inactive=40s;
 open_file_cache_valid 60s;
 open_file_cache_min_uses 2;
 open_file_cache_errors on;

#ssl
# ssl on;
# ssl_certificate  ssl/git/git.local.crt;
# ssl_certificate_key ssl/git/git.local.key;

#logs
 access_log /var/log/nginx/git.local_https_access.log;
 error_log /var/log/nginx/git.local_https_error.log;


#-------------------------- Configs --------------------------#
 # Default config
 include confs/main.conf;
 gzip off;

#-------------------------- Locations ------------------------#

# Main location
 location / {
  root /usr/local/www/gitweb;
  index gitweb.cgi;

  location ~ ^/(.*\.cgi)$ {
   include  fastcgi_params;
   fastcgi_pass unix:/var/run/fcgiwrap/gitweb.socket;
   fastcgi_index gitweb.cgi;
   fastcgi_param SCRIPT_FILENAME /usr/local/www/gitweb/gitweb.cgi;
   fastcgi_param DOCUMENT_ROOT /usr/local/www/gitweb;
  }

 }

}
Теперь самое интересное, после установки порта devel/git в каталоге веб сервера /usr/local/www ничего не появилось, хотя опция GITWEB была отмечена, беглый анализ логов установки и поиск по винту навел на папочку:
FreeBSD# find /usr -name gitweb
/usr/local/share/examples/git/gitweb
FreeBSD# # ls /usr/local/share/examples/git/gitweb
gitweb.cgi static
Вот оно! Копируем всю найденную папку gitweb в каталог веб сервера:
FreeBSD# cp /usr/local/share/examples/git/gitweb /usr/local/www
Запускаем сервисы:
FreeBSD# service nginx reload
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
FreeBSD# service fcgiwrap start
===> fcgiwrap profile: gitweb
Starting fcgiwrap.
Переходим по ссылке http://git.local - все работает, ура! :)
P.S. Памятка работы с git репозиторием:
  1. Создаю на сервере новую папку (например /git/www/test).
    $ mkdir -p /git/www/test
  2. Делаю в ней инициализацию пустого репозитория git init:
    $ cd /git/www/test
    $ git init
  3. На локальной машине скачиваю созданный репозиторий:
    $ git clone projects@example.ru:/git/www/test/.git
    Это создаст локальную копию удалённого репозитория (пока пустого).
  4. Накидываю кучу файлов в локальную папку, которую мы создали на предыдущем шаге. Делаю, так сказать, каркас проекта. Если нужно — добавляю исключения в файл (.gitignore).
  5. Выполняю:
    $ cd /git/www/test
    $ git add .
    $ git commit
    $ git push
    Обязательно ввожу комментарий к своим изменениям - желательно писать всегда что-то адекватное, чтобы потом можно было понять что именно было изменено.
    $ git add . - добавляет новые файлы в репозиторий от текущего каталога.
    $ git commit - Фиксирует новую ревизию кода - тут-то и спросит ввести комментарий.
    $ git push - Отправляет изменения на сервер.
  6. Всё. Локальный и удалённый репозиарии обновлены и синхронизированы.
  7. Работаю над проектом. После каких-либо осмысленных изменений делаю вновь шаг 5. Не забывайте предварительно зайти в ту папку, с которой работали.

Если вы веб-разрабочик и вам нужно довольно часто показывать текущий результат работы — очень полезно будет положить файл post-receive в папку .git/hooks какого-либо проекта с таким содержимым:
#!/bin/sh
cd ..
env -i git checkout -f
echo "Удалённый репозиторий успешно обновлён!"
И дайте ему права на исполнение. Теперь после каждого обновления (шаг 5) будет также обновляться рабочее дерево проекта и реальные файлы всегда будут последней, актуальной версии (а этого почти все и ожидают, когда обновили удалённый репозиторий, но так по умолчанию не происходит).
UPD: 21.06.2014
Если после настройки появляется ошибка:
404 - No projects found.
Возможно причина в правах на репазитории, необходимо, чтобы владельцем файлов в репазиториях был тот же пользователь, что и у fcgiwrap. Если репазитории храятся в /git-repos, то решением будет:
cd /git-repos
chown -R www:www .


Ссылки по теме:
1. Wikipedia - Git
2. HOWTO: GIT hosting = nginx + cgit + gitosis + ssh
3. Устанавливаем и настраиваем cGit на Ubuntu
4. Собственный сервер Git на базе Ubuntu или Debian/GNU Linux
5. Tip по использованию Git под Windows
6. Installing Git and Gitweb on FreeBSD
7. Simple CGI support for Nginx (fcgiwrap)
8. 4.1 Git на сервере - Протоколы
9. Configuring GitWeb - 404 - No projects found

вторник, 18 декабря 2012 г.

VirtualBox и FreeBSD, не запускаются виртуальные машины при загрузке системы.

Столкнулся с проблемой на FreeBSD - не запускаются виртуальные машины при загрузке системы. Все оказалось довольно просто - нужные модули ядра не подгружались при загрузке системы, выход оказался очень прост - при запуске скрипта /usr/local/etc/rc.d/vboxheadless подгружать эти модули, если они вдруг не загружены.
Открываем стартовый скрипт /usr/local/etc/rc.d/vboxheadless, находим там строки:
vboxheadless_start()
{
 local machine mpidfile pid vmname vmuser vmflags vmdelay
И добавляем заветные строки, которые будут проверять и загружать необходимые модули ядра, если потребуется:
vboxheadless_start()
{
 local machine mpidfile pid vmname vmuser vmflags vmdelay

( ! kldstat | grep vboxnetflt >/dev/null ) && kldload vboxnetflt
( ! kldstat | grep vboxnetadp >/dev/null ) && kldload vboxnetadp
Ну и не забываем в /etc/rc.conf указать нужные настройки:
#---------------------- VirtualBox ----------------------------------------#
vboxnet_enable="YES"
vboxheadless_enable="YES"  # (bool): Set to "NO" by default. Set it to "YES" to enable vboxheadless.
vboxheadless_user="root"  # (str): Default user account to run with. (default: vboxusers)
vboxheadless_stop="poweroff"  # (str): Default stop cmd for VBoxManage controlvm. (default: savestate)
vboxheadless_delay="0"   # (int): Default startup/shutdown delay in seconds. (default: 0)
vboxheadless_machines="Win7"  # (str): Space separated list of machines.
#--------------------------------------------------------------------------#
А так же в файле /boot/loader.conf добавляем строку:
vboxdrv_load="YES"
Теперь все будет само запускаться, при загрузке системы!

среда, 12 декабря 2012 г.

Настраиваем запись логов в isc-dhcp-server под FreeBSD

После установки и настройки порта isc-dhcpd-server очень захотелось, чтобы логи от этого демона складировались в отдельный файлик, например /var/log/dhcpd.log, а не в общий системный лог /var/log/messages. Как этого достичь описано ниже.
Первым делом добавляем строку в конфиг демона dhcpd /usr/local/etc/dhcpd.conf:
log-facility local7; # куда в syslog шлем логи
Теперь в syslog принимаем от демона dhcpd логи - добавляем строки в файл /etc/syslog.conf:
!dhcpd
local7.*  /var/log/dhcpd.log

#если встретили эту сроку (я имею ввиду это -> !*), то закоментируйте, а то не заработает :)
#!*
А так же рассказываем syslog'у, что у нас есть dhcpd демон, для этого добавляем опцию в /etc/rc.conf:
syslogd_flags="-l /var/db/dhcpd/var/run/log -ss"
И не забываем про ротацию логов в /etc/newsyslog.conf добавляем строки:
#dhcp
/var/log/dhcpd.log  644  15    300 *     XC

Ссылки по теме:
1. FreeBSD: DHCP-сервер для локальной сети на базе ISC DHCP Server
2. Cisco DHCP Snooping with ISC DHCPd
3. Reagent Team - dhcp opt 82