понедельник, 15 октября 2012 г.

Bind и кириллические домены

Пару дней назад возникла необходимость настроить на сервере кириллический домен. Если кратко, то имя домена декодируется по стандарту RFC3492, а затем прописывается в BIND как обычный домен. Online-перекодировщик предназначен для преобразования русских имён доменов в кодировку Punycode, которая используется в многоязычной системе доменных имён.
Заходим на данный сайт, вводим нужный нам домен, например, смарт.рф, на выходе получаем - xn--80axnbi.xn--p1ai.
Настройка bind.
В файле named.conf прописываем:


zone "xn--80axnbi.xn--p1ai" {
        type master;
        file "/etc/named/DOMAIN.RF";
};

Файл зоны DOMAIN.RF может быть таким:

$TTL    3600
xn--80axnbi.xn--p1ai.   IN    SOA   ns1.xn--80axnbi.xn--p1ai. noc.gmail.com. (
                        20121011 ; serial
                        28800
                        7200
                        604800
                        86400 )
                IN      NS      ns1.smart.ru.
                IN      NS      ns2.smart.ru.
@            IN      A         zz.zz.xx.xx

Также в настройках nginx или apache можно указывать в качестве имени сервера - xn--80axnbi.xn--p1ai. Например:
nginx
server_name smart.ru www.smart.ru xn--80axnbi.xn--p1ai;

apache2
ServerName smart.ru 
ServerAlias xn--80axnbi.xn--p1ai

суббота, 13 октября 2012 г.

Badblocks такие badblocks.

Буквально час назад появился увлекательный квест - вырубили электричество в моем и соседних домах, и все бы ничего да вот после возобновления подачи электричества перестала загружаться ОС. Жаловалась, что не могла прочитать сектор с диска. Очевидно, надо проверять жесткий диск на наличие badblocks. Диск терять было жалко. Рука сначала потянулась к HirenBoot CD, загрузился с него, запустил MHDD - не видит дисков. Ладно, есть установочный диск с Fedora, загрузился.
1. fdisk -l 
********************

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648    51611647    25600000   83  Linux
/dev/sda3        51611648    55707647     2048000   82  Linux своп / Solaris
/dev/sda4        55707648   976773167   460532760    5  Расширенный
/dev/sda5        55709696   976773119   460531712   8e  Linux LVM

2. e2fsck -cvfp /dev/sda1
Отрабатывает нормально, без ошибок.
3. e2fsck -cvfp /dev/sda2
Вот тут на консоль посыпались сообщения вида:

Oct 13 21:32:47 Zeus kernel: [ 3336.559122] ata2.00: failed command: READ FPDMA QUEUED
Oct 13 21:32:47 Zeus kernel: [ 3336.559133] ata2.00: cmd 60/08:00:88:db:40/00:00:00:00:00/40 tag 0 ncq 4096 in
Oct 13 21:32:47 Zeus kernel: [ 3336.559135]          res 51/40:08:88:db:40/00:00:00:00:00/40 Emask 0x409 (media error) <F>
Oct 13 21:32:47 Zeus kernel: [ 3336.559147] ata2.00: status: { DRDY ERR }
Oct 13 21:32:47 Zeus kernel: [ 3336.559149] ata2.00: error: { UNC }
Oct 13 21:32:47 Zeus kernel: [ 3336.570044] ata2.00: configured for UDMA/133
Oct 13 21:32:47 Zeus kernel: [ 3336.570054] ata2: EH complete
Oct 13 21:32:51 Zeus kernel: [ 3340.200282] ata2.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
Неприятно. Жду пока отработает команда e2fsck. Выдает несколько ошибок о том, что проблема с инодами файла /var/log/messages, которые автоматически не исправляются. Ладно, запускаю:
4. e2fsck -cvfy /dev/sda2
Исправляет таки ошибки, помечает badblocks. Пробую перегрузиться
5. reboot
Система стартует нормально. Но, нужно покупать еще один жесткий диск и делать рэйд-массив, а пока - здоровья вам и вашим жестким дискам.

пятница, 12 октября 2012 г.

Журналирование событий iptables в отдельный файл

Имеется сервер с CentOS 6 с настроенным фаерволом (iptables). В правилах фаервола есть цепочка:

-N drop-and-log-it
-A drop-and-log-it -j LOG
-A drop-and-log-it -j REJECT --reject-with icmp-host-prohibited
 Данная цепочка вызывается далее в правилах для логгирования определенных событий, например, логгирования попыток соединения к mysql:
-A INPUT -p tcp -m tcp --dport 3306 -j drop-and-log-it

По умолчанию записи попадают в файл /var/log/messages. Записей следующего вида бывает много, что затрудняет чтение данного файла:
Oct 12 22:31:31 web01 kernel: IN=eth0 OUT= MAC=30:85:a9:a4:ee:55:78:fe:3d:46:ec:88:08:00 SRC=Z.Z.Z.Z DST=X.X.X.X LEN=60 TOS=0x10 PREC=0x00 TTL=55 ID=51274 DF PROTO=TCP SPT=38133 DPT=3306 WINDOW=14600 RES=0x00 SYN URGP=0

Нужно выделить сообщения фаервола в отдельный файл. Логгированием занимается rsyslog, следовательно, настраивать будем правила в конфигурационном файле /etc/rsyslog.conf, но сначала изменим цепочку drop-and-log-it, добавив специальный префикс "iptables: " для дальнейшего отлова данных сообщений. Итак, полностью цепочка выглядит так:

-N drop-and-log-it
-A drop-and-log-it -j LOG  --log-prefix "iptables: "
-A drop-and-log-it -j REJECT --reject-with icmp-host-prohibited


Перезапускаем фаервол:
sudo service iptables restart

Редактируем файл /etc/rsyslog.conf, перед правилами в секции RULES вставляем:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~


Сохраняем файл и перезапускаем rsyslog.
sudo service rsyslog restart

Для автоматической ротации файла /var/log/iptables создаем файл /etc/logrotate.d/iptables с таким содержанием:
/var/log/iptables.log
{
        rotate 5
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                service rsyslog reload > /dev/null
        endscript
}

четверг, 20 сентября 2012 г.

MySQL error "Can't create new tempfile" при восстановлении таблицы.


В логах mysql много ошибок подобного рода.
120920  9:25:28 [ERROR] /usr/sbin/mysqld: Table './old_sm/phones' is marked as crashed and last (automatic?) repair failed
Поскольку автоматическое исправление не сработало, то будем исправлять вручную.
Перед любым таким действием настоятельно рекомендуется сделать резервное копирование данных.
Заходим в командную строку mysql.
Запускаем проверку таблицы.

mysql> check table phones;
+-----------------------+-------+----------+--------------------------------------------+
|           Table                 | Op      | Msg_type | Msg_text                                          |
+-----------------------+-------+----------+--------------------------------------------+
|             old_sm.phones | check | warning     | Table is marked as crashed and last repair failed |
|             old_sm.phones | check | error         | Found 6833 keys of 3930951                        |
|             old_sm.phones | check | error         | Corrupt                                           |
+-----------------------+-------+----------+--------------------------------------------+
3 rows in set (0.37 sec)

Запускаю восстановление таблицы.

mysql> repair table phones;
+-----------------------+--------+----------+-------------------------------------------+
|           Table                 | Op        | Msg_type | Msg_text                                                 |
+-----------------------+--------+----------+-------------------------------------------+
|             old_sm.phones | repair    | error        | Can't create new tempfile: './old_sm/phones.TMD' |
|             old_sm.phones | repair    | status       | Operation failed                                         |
+-----------------------+--------+----------+-------------------------------------------+
2 rows in set (0.01 sec)

Т.е. при запущенном mysql-сервере восстановлению не подлежит. Останавливаю mysql
service mysql stop
Запускаю восстановление с помощью myisamchk. Данный метод будем работать с таблицами на движке MyISAM. Если у вас таблицы на движке InnoDB может помочь пересоздание таблицы с заливкой старых данных.
root@112-1:/var/lib/mysql/old_sm# myisamchk -r -f phones.MYI 
- recovering (with sort) MyISAM-table 'phones.MYI'
Data records: 3930951
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5

Запускаю mysql сервер
service mysql start
Ошибка пропала, что и требовалось.

суббота, 15 сентября 2012 г.

Как создать установочную флешку с Windows7 в Linux

Небольшая предыстория: на ноутбуке знакомой (Hp Compaq 6720s) стала "глючить" Windows Vista - работа в  обычном режиме стала невозможна, постоянные подвисания процессора превращали работу в тихий ад. Более менее сносно можно было работать в безопасном режиме, но отсутствовал звук и возможность переключать раскладки клавиатуры. Разбираться в глюках Windows очень не хотелось, предложил знакомой переустановить систему на новую когда-то купленную Windows 7. Согласие было получено моментально. Далее появилась первая засада - ноутбук отказывался грузиться с DVD, просто отказывался. Рядом стоящий системник с Linux грузился отлично с данного DVD. Решил пойти коротким путем и сделать установочную флешку с Windows 7 и с нее уже установить операционную систему на ноутбуке. Далее короткая заметка на память о проделанном.
Во-первых, нужна флешка не менее 4-х гигабайт, диск с Windows 7, компьютер с Linux (в моем случае Fedora 17).
1. Установить пакет ntfsprogs, содержащий библиотеки и утилиты для работы с файловой системой NTFS.
sudo yum -y install ntfsprogs
2. Подключить флешку, с помощью fdisk создать на ней один раздел
3. Изменить тип раздела на NTFS (тип 7)
4. Пометить раздел как загрузочный (установить соответствующий флаг)
5. Сохранить изменения (w) и выйти
6. Создать на флешке файловую систему
sudo mkfs.ntfs -f -L WIN7 /dev/sdb1
где -f означает быстрое форматирование
-L задает метку файловой системы
7. Монтируем флешку
sudo mount /dev/sdb1 /mnt
8. Монтируем DVD с Windows 7
sudo mount /dev/cdrom /media
9. Копируем файлы из DVD на флешку
sudo cp -r /media/* /mnt/
10. Отмонтировать флешку и DVD после завершения.
sudo umount /dev/sdb1; sudo umount /dev/cdrom

Вот и все. Флешка готова, загрузился с нее и поставил Windows 7.

среда, 15 августа 2012 г.

Установка и базовая настройка pnp4nagios

PNP — это дополнение к Nagios, которое анализирует данные о производительности от плагинов и автоматически сохраняет их в RRD базу данных. Для установки нужны:
  • Perl >= 5.x без дополнительных модулей
  • RRDtool >= 1.x, лучше 1.2
    PHP >= 5.1.6 для Web-интерфейса на базе Kohana
  • Nagios >= 2.x или Icinga
  • Kohana нужен загруженный модуль “mod_rewrite”.
Предполагается, что у вас уже установлен Nagios, httpd и они работают. Установка будет проходить на CentOS 6.3 x86_64. Итак, начнем.
1. Скачать архив исходных кодов с сайта pnp4nagios.org.
2. Распаковать
tar xzf pnp4nagios-0.6.18.tar.gz
cd pnp4nagios-0.6.18
3. Установка необходимых пакетов:
yum -y install rrdtool rrdtool-perl openssl-devel gcc php-gd

4. Установка:
./configure --prefix=/opt/pnp4nagios
# компилирует компоненты типа NPCD, написанного на C
make all
# установка файлов по правильным путям
make install
# конфигурационные файлы для process_perfdata.pl и npcd будут скопированы в etc/pnp
make install-config
# будет скопирован файл pnp4nagios.conf в директорию /etc/httpd/conf.d/
make install-webconf
# устанавливает скрипт инициализации NPCD
make install-init

5. Конфигурирование:
а) выбор режима сбора данных
PNP поддерживает несколько режимов обработки данных производительности. Режимы различаются по сложности и ожидаемой производительности. Подробнее http://docs.pnp4nagios.org/pnp-0.6/modes. Я выбрал режим «Bulk Mode with npcdmod», который с точки зрения Nagios наилучший поскольку не будет блокировать Nagios, а само изменение конфигурационного файла Nagios затронет всего 2 строчки.
Nagios использует временный файл для хранения данных и выполняет команду спустя некоторое время. Вместо немедленной обработки с помощью process_perfdata.pl этот файл перемещается в spool-директорию. NPCD-сервис (Nagios Performance C Daemon) мониторит эту директорию на предмет появления новых файлов и передает их имена на вход process_perfdata.pl. Обработка данных производительности полностью отделена от Nagios. NPCD может стартовать множество потоков для обработки данных.

б) настройка режима сбора данных
Отредактировать nagios.cfg:
process_performance_data=1
broker_module=/opt/pnp4nagios/lib/npcdmod.o config_file=/opt/pnp4nagios/etc/npcd.cfg

Данный режим использует в качестве обработчика событий модуль npcdmod.o. Этот модуль (npcdmod.o) принимает на себя задачу обработки данных требуемых для PNP.

6. Рестартовать сервисы:
service httpd restart
service ncpd restart
service nagios restart

7. Добавить/проверить в автозагрузку при старте системы:
chkconfig httpd on
chkconfig ncpd on
chkconfig nagios on

8. Проверка установки:
зайти на url http://<server name>/pnp4nagios/

Появится страница “PNP4Nagios Environment Tests”, которая включает разные проверки необходимых компонентов системы. Перед следующим шагом все проверки должны быть пройдены успешно. Если что-то не так, читать http://docs.pnp4nagios.org/pnp-0.6/verify до прояснения. Если все тесты пройдены успешно, файл pnp4nagios/share/install.php должен быть удален или переименован, либо создать файл с именем pnp4nagios/share/install.ignore, который запрещает вызов инсталлятор после дальнейших обновлений.

9. Добавление иконки PNP в веб-интерфейс Nagios.
Нужно добавить к определениям шаблонов хостов и сервисов строчку action_url, например так:
define host{
name generic-host
*****
action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=_HOST_' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=_HOST_
register 0
}

define service{
name generic-service
********
action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&srv=$SERVICEDESC$' class='tips' rel='/pnp4nagios/index.php/popup?host=$HOSTNAME$&srv=$SERVICEDESC$
register 0
}

и перезапустить Nagios
service nagios restart

10. Дополнительные настройки:
а) Debug
http://<server-name>/pnp4nagios/debug/?host=<HOST>&srv=<SERVICE>
вместо
http://<server-name>/pnp4nagios/index.php/graph?host=<HOST>&srv=<SERVICE>

б) Отредактировать файлы config.php и local_config.php
# Масштабировать предварительный просмотр графиков при всплывании
$conf['popup-width'] = "597px";
изменять этот параметр нужно в ОБОИХ конфигурационных файлах (config.php и local_config.php)

# Список директорий для поиска шаблонов. Ищется до первого совпадения.
$conf['template_dirs'][] = '/opt/pnp4nagios/share/templates';
$conf['template_dirs'][] = '/opt/pnp4nagios/share/templates.dist';

в) SSI
Вы можете интегрировать PNP в Nagios таким образом, чтобы текущие графики показывались в виде всплывающих страничек без необходимости кликания по иконкам. Для этого нужно создать файл /usr/share/nagios/html/ssi/status-header.ssi, либо скопировать файл status-header.ssi из исходный кодов PNP в директорию /usr/share/nagios/html/ssi.
Содержимое файла status-header.ssi (модифицированное):
<script src="/pnp4nagios/media/js/jquery-min.js" type="text/javascript"></script>
<script src="/pnp4nagios/media/js/jquery.cluetip.js" type="text/javascript"></script>
<script type="text/javascript">
jQuery.noConflict();
jQuery(document).ready(function() {
jQuery('a.tips').cluetip({ajaxCache: false, dropShadow: false,showTitle: false, width: '620', height: '700', sticky: true, arrows: false, closeText: '<img src="/pnp4nagios/media/images/close1.png" BORDER="0">', closePosition: 'top' });
});
</script>

Иконка close1.png не входит в поставку PNP, поэтому ее нужно создать самому, либо воспользоваться какой-то готовой, либо скопировать входящий в исходные коды PNP файл и ничего не делать.

Литература:

вторник, 14 августа 2012 г.

Ошибка 1062 Error 'Duplicate entry' при репликации MySQL

Собственно, вылезла такая ошибка в выводе команды show slave status\G:

***
Slave_IO_Running: Yes
Slave_SQL_Running: No
***
Last_Errno: 1062
Last_Error: Error 'Duplicate entry' ******
***

Репликация остановилась, работает только поток считывания данных (slave_io) с master-сервера. Это нормальная ситуация, ошибки случаются. По умолчанию, slave-сервер в случае ошибки останавливает поток slave_sql, который выполняет инструкции из бинарного лога от master-сервера. Предполагается, что администратор БД вручную исправит ошибку.
Причины бывают разные, в моем случае причиной была аварийная остановка slave-сервера.
Как исправить?
Пропустить запрос, вызывающий ошибку. Либо так:
mysql> SLAVE STOP; 
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE;
Либо указав в конфигурационном файле my.cnf в секции [mysqld] опцию:
slave-skip-errors = 1062
и перезапустить сервер, например, service mysqld restart. Также проверить вывод команды show slave status\G - бывают случаи, когда сервер mysqld запускается с опцией --skip-slave-start, которая запрещает автозапуск репликации при старте сервера.
В данном случае (slave-skip-errors = 1062) сервер будет игнорировать ВСЕ такие ошибки, возникающие при репликации. В первом варианте, только одну инструкцию пропустит из бинарного лога.

Литература:
http://dev.mysql.com/doc/refman/5.5/en/replication-options-slave.html#option_mysqld_slave-skip-errors