понедельник, 23 июля 2012 г.

Малое значение RLimitMEM

Небольшая предыстория. Клиент обратился с просьбой решить проблему с запуском nagios. Собственно, сам nagios был установлен и даже запускался, но веб-интерфейс вываливался с ошибкой:
error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory

Другие сайты, работающие на данном хосте, запускались без проблем.
После недолгих копаний в системе и конфигурационных файлах httpd и nagios был найден виновник. В файле httpd.conf обнаружилась директива RLimitMEM, ограничивающая размер памяти для процессов, порожденных "детьми" httpd, включая CGI-скрипты. 
В данном случае, решение было либо закомментировать данную директиву, либо увеличить ее размер. Я сперва пошел первым путем, потом подобрал нужное значение параметра.

Литература:
http://httpd.apache.org/docs/current/mod/core.html#rlimitmem

пятница, 20 июля 2012 г.

Proftpd xferlog в mysql

Собственно, задача стояла записывать успешную/неспешную загрузку файлов пользователями proftpd. Установка сервера тривиальна (yum install proftpd proftpd-mysql) при подключении нужных репозиториев, например CentAlt. Сами пользователи находятся в БД mysql.

Создаем таблицу со следующими полями (думаю названия говорят сами за себя и не нуждаются в комментариях):

CREATE TABLE `ftpxferlog` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(60) NOT NULL DEFAULT '',
  `filename` text,
  `size` bigint(20) DEFAULT NULL,
  `ip` tinytext,
  `action` tinytext,
  `duration` tinytext,
  `field_localtime` timestamp NULL DEFAULT NULL,
  `success` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_usersucc` (`username`,`success`)
) ENGINE=InnoDB;

Можете создать пользователя, который может вносить информацию в эту таблицу
(GRANT INSERT ON DB.ftpxferlog TO SOME_USER@localhost identified by 'SOME_PASS';
FLUSH PRIVILEGES;)
В моем случае такого отдельного пользователя не потребовалось, поскольку я создал одного пользователя со всеми правами для конкретной базы данных;

В конфигурационном файле изменяем/добавляем:

#Указываем информацию для соединения с базой данных.
SQLConnectInfo  DB@localhost USERNAME PASSWORD

# Директива используется для логгирования информации в таблицу. Можно указывать несколько директив, что я буду делать.
# Первый параметр - список FTP-команд, для которых будет срабатывать логгирование.
# Второй параметр - название запроса, определенного директивой SQLNamedQuery
SQLLog RETR,STOR transfer1
SQLNamedQuery transfer1 INSERT "NULL, '%u', '%f', '%b', '%a', '%m', '%T', now(), '1'" ftpxferlog

SQLLog ERR_RETR,ERR_STOR transfer2
SQLNamedQuery transfer2 INSERT "NULL, '%u', '%f', '%b', '%a', '%m', '%T', now(), '0'" ftpxferlog

Литература:
http://www.iezzi.ch/archives/110

четверг, 19 июля 2012 г.

Postfix, warning: dict_nis_init.

С postfix работал немного, больше с exim. Недавно наткнулся в логах Postfix на такую строчку:
warning: dict_nis_init: NIS domain name not set - NIS lookups disabled 

Быстрое решение:

Для удаления этого предупреждения необходимо удалить упоминания о NIS в конфигурации Postfix.
# postconf | grep nis: 
alias_maps = hash:/etc/aliases nis:mail.aliases
Запретить запросы к NIS: 
# postconf -e alias_maps=hash:/etc/aliases

суббота, 14 июля 2012 г.

rsync и ssh на нестандартном порту

Уже который раз лезу в маны/гугл, чтоб вспомнить это.

rsync -av --rsh="ssh -p PORT" SOME_FOLDER USER@HOST:/DEST

Формат xferlog

Заметка на память. По умолчанию лог файл содержит:

current-time – текущее время
transfer-time – время передачи, сек
remote-host – удаленный хост
file-size – размер переданного файла в байтах
file-name – имя файла
transfer-type – тип передачи (a – символьный (ascii); b – двоичный)
special-action-flag – флаг (C – сжатый; U – несжатый; T – tar’ed; _ - неопределенно)
direction – направление (o – upload; i – download; d – удаление)
access-mode – режим доступа (a – анонимный; r - действующий)
username – имя пользователя
service-name – имя сервиса (как правило ftp)
authentication-method – тип авторизации (0 – нет; 1 – RFC931)
authenticated-user-id – ID пользователя или ‘*’
completion-status – статус сессии (c – успешно; i – не успешно)

вторник, 10 июля 2012 г.

SSH через Proxy

Внезапно под вечер возникла необходимость в ssh соединении на сервер через proxy. Для такой операции понадобится corkscrew. Если вы используете Windows, то вас спасет вкладка proxy. Данная заметка для дистрибутива Fedora, обладатели других дистрибутивов только по другому установят corkscrew, остальное все одинаково. 
Итак, утилиту corkscrew необходимо установить для начала.
yum install corkscrew

В папке .ssh нужно создать файл config и ОБЯЗАТЕЛЬНО установить на него права 600 или 400, иначе не заработает. Содержимое файла примерно такое:

Host *
  ProxyCommand corkscrew some-proxy.com 8080 %h %p
Где,
Host * - говорит о том, что мы будем использовать прокси для всех хостов. В моем случае нужен был только один - можно указывать имя или IP-адрес.
Переменные %h %p - соответствуют хосту и порту, подставляются ssh-клиентом автоматически.
Для проверки ssh somehost.com
Если на прокси-сервере используется аутентификация по логину/паролю, то нужно создать файл с такой информацией. Например, 
cat ~/.ssh/proxyauth
username:password
Далее редактируем ~/.ssh/config, меняем ProxyCommand на:
ProxyCommand corkscrew some-proxy.com 8080 %h %p ~/.ssh/proxyauth


Литература:
man corkscrew

суббота, 7 июля 2012 г.

Восстановление из rommon Cisco 871

Вообщем, произошла вчера неприятная ситуация с клиентским маршрутизатором Cisco 871. Не грузится и все тут.  Подключили консольный кабель, в  настройках putty ввожу

Baud rate: 9600
Data: 8 bit
Parity: none
Stop: 1 bit
Flow control: none.


На экране высвечивается:
rommon 1>
Понятно - IOS не загрузился.
Для начала немного теории. В работе с маршрутизаторами иногда возникают непредвиденные ситуации, например, потеря пароля для входа в привилегированный режим, или маршрутизатор по каким-либо причинам не может обнаружить образ операционной системы в памяти или во всех доступных по сети ресурсах. Из данного режима возможно восстановить работоспособность маршрутизатора загрузив новый/предыдущий образ, используя tftp или X-modem. Стоит заметить, что в данном режиме не доступны функции автодополнения команд, как при загруженном IOS.
Смотрим что на flash:
> dir flash:
Файлов нет, только свободное пространство. Придется заливать новый образ, куда делся старый будем разбираться потом.

Собственно, план работ:
1. Скачать нужный образ IOS из сети
2. Поднять/настроить tftp-сервер
3. Подключиться к консоли cisco, запустить скачивание образа на flash-память
4. Перегрузить/проверить работу

1. Для заливки  будем использовать tftp, потому как он быстрее xmodem. Скачиваем образ c870-advipservicesk9-mz.124-24.T7.bin. ОБЯЗАТЕЛЬНО проверить md5-сумму фала и размер с данными об образе на сайте cisco.com. Лучше скачать несколько образов (на всякий случай). Особое внимание стоит обратить на размер flash-памяти и объем оперативной памяти. Сначала был соблазн скачать новую версию 15-серии , но для нее требуется больше оперативной памяти.

2. Далее поднимаем tftp-сервер. Поскольку делал все с Win7, по старинке скачал tftpd32 отсюда. Настройка его слишком тривиальна, чтоб описывать (выбрать корневую папку). Далее разбираемся с Windows firewall, нужно временно открыть 69 порт по протоколу udp для выделенного для  cisco IP-адреса или для всей локальной подсети. Обязательно проверить tftp-клиентом (входит в состав tftpd32) работу tftp-сервера.

3. Параметры подключения указаны в начале заметки. Итак, какие команды вообще есть:

rommon 1 > ?
alias               set and display aliases command
boot                boot up an external process
break               set/show/clear the breakpoint
confreg             configuration register utility
cont                continue executing a downloaded image
context             display the context of a loaded image
cookie              display contents of cookie PROM in hex
dev                 list the device table
dir                 list files in file system
dis                 disassemble instruction stream
dnld                serial download a program module
frame               print out a selected stack frame
help                monitor builtin command help
history             monitor command history
meminfo             main memory information
repeat              repeat a monitor command
reset               system reset
set                 display the monitor variables
stack               produce a stack trace
sync                write monitor environment to NVRAM
sysret              print out info from last system return
unalias             unset an alias
unset               unset a monitor variable
xmodem              x/ymodem image download
rommon 2 >

Команда tftpdnld используется только случае аварийного восстановления, так как предварительно стирает все существующие данные с flash-памяти перед загрузкой нового IOS в маршрутизатор (есть вариант загрузки образа в память БЕЗ сохранения на flash-память). Для выполнения tftpdnld необходимо заполнение системных переменных режима ROMmon, которые будут использованы для создания соединения и передачи. Вот эти обязательные переменные:

IP адрес маршрутизатора    IP_ADDRESS=ip_address
Маска подсети     IP_SUBNET_MASK=subnet_mask
IP адрес шлюза по умолчанию   DEFAULT_GATEWAY=ip_address
IP адрес TFTP сервера      TFTP_SERVER=ip_address
Имя загружаемого файла IOS     TFTP_FILE=filename

В моем случае это были:
> IP_ADDRESS=192.168.1.1
IP_SUBNET_MASK=255.255.255.0
DEFAULT_GATEWAY=192.168.1.234
TFTP_SERVER=192.168.1.234
TFTP_FILE=c870-advipservicesk9-mz.124-24.T7.bin


Далее запускаем команду:
> tftpdnld
Соглашаемся с приведенными настройками. Смотрим за прогрессом скачивания образа. 
Тут случается главная засада: получаем сообщение о поврежденном файле или ошибке устройства хранения. 

File reception completed.
TFTP flash copy: Invalid file header, copy terminated.
Reason: Wrong target platform OR corrupt file.

Пытаюсь загрузить несколько разных образов IOS - результат тот же. Пытаюсь загрузить образ в память (tftpdnld -r) - ноль на массу. Начинаю уже грешить на сбойную flash-память, и тут решаю перегрузить на всякий случай маршрутизатор по питанию.  После загрузки процесс записи прошел успешно. Залил ранее сохраненный конфигурационный файл и заработало.



Литература:
http://telecom.opennet.ru/cisco/rommon.shtml

вторник, 3 июля 2012 г.

Высокая загрузка MySQLd & leap second.

Внезапно. На серверах скакнула загрузка, причина быстро выяснилась - mysqld жрал процессор как сумасшедший. Без запросов (потушил php-fpm) сжирал стабильно 50-70% процессора. Было найдено следующее решение без перезагрузки системы:

# service ntpd stop
# date -s "`date`"
# service ntpd start


И mysqld успокоился. Как говорится - "Не думай о секундах свысока".