суббота, 22 декабря 2012 г.

CentOS 6 и KVM. Запуск виртуалки.

Необходимо было запустить виртуалку с Ubuntu на хосте с CentOS6 (64 bit). Собственно, небольшое описание того, что было сделано. Во-первых, хочу отметить, что при настройке надо быть внимательным, иначе получаются весьма забавные вещи. В моем случае, не обратил внимание на вывод команды ip addr show, где было state DOWN для интерфейса в составе моста - из-за чего и было потрачено много времени впустую. Виртуалка была поднята на хосте с Gentoo и переезжала на хост с CentOS ввиду загруженности машины с Gentoo.

1. Проверяем, что процессор поддерживает необходимые инструкции:

egrep '(svm|vmx)' /proc/cpuinfo

2. Проверяем загружены ли необходимые модули:

lsmod | grep kvm

3. Сервер имеет 2 сетевых интерфейса (на самом деле есть еще один, но он отдан под IPMI). Подключаем оба в сеть, копируем /etc/sysconfig/network-scripts/ifcfg-eth0 в /etc/sysconfig/network-scripts/ifcfg-br0. Приводим ifcfg-eth0 к виду (mac-адрес, ip-адрес, маску, шлюз, адрес днс-сервера поменяйте на свои):

DEVICE="eth0"
BRIDGE="br0"
NM_CONTROLLED="no"
ONBOOT=yes
HWADDR=00:25:90:78:74:8C

Файл ifcfg-br0 в таком виде:

DEVICE="br0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Bridge"
DELAY=0
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"
IPADDR=192.168.1.XX
NETMASK=255.255.255.0
GATEWAY=192.168.1.Z
DNS1=192.168.1.XY

Файл ifcfg-eth1:

DEVICE="eth1"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Ethernet"
UUID="7a455c42-2ceb-4cf2-a13c-a86baf7d42ef"
HWADDR=00:25:90:78:74:8D
PEERDNS=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth1"
IPADDR=192.168.1.XZ
NETMASK=255.255.255.0


В данном случае eth1 будет использоваться под нужды сервера, eth0 будет входить в состав моста br0 и обслуживать виртуалку(и).

4. Устанавливаем нужные пакеты для работы с мостом и виртуальными TUN/TAP интерфейсами:
sudo yum -y install tunctl bridge-utils

5. Рестартуем сеть командой:
sudo service network restart

6. Проверяем состояние интерфейсов (должны быть в UP):
ip addr show | grep eth | grep state

2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

7. Проверяем загружен ли модуль tun:
lsmod | grep tun
Если нет - то:
modprobe tun

Модуль tun - это универсальный TUN/TAP драйвер, позволяющий создавать программные сетевые устройства (программная сетевая карта). TAP симулирует Ethernet устройство и работает на канальном уровне, а TUN работает на сетевом уровне. 
Пакет, посылаемый операционной системой через TUN/TAP устройство, обрабатывается программой, которая контролирует это устройство, в данном случае qemu (см. команду в конце заметки).

Создаем виртуальное устройство tap0:
tunctl -b

8. Поднимаем устройство tap0:
ifconfig tap0 up

9. Проверить/установить параметры в файле sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

10. Проверить правила iptables, чтоб не блокировали нужный трафик (в моем случае iptables не использовался). Например, командой:

iptables -I RH-Firewall-1-INPUT -i br0 -j ACCEPT

11. Добавляем интерфейсы в состав моста:

brctl addif br0 eth0
brctl addif br0 tap0

12. Стартуем виртуалку:
/usr/libexec/qemu-kvm -hda /some/path/ubuntu10.04_2.img -m 6144 \
-net nic,macaddr=00:1a:dd:d8:bc:b6 -net tap,ifname=tap0,script=no,downscript=no \
-vnc :0 -name ubuntu -smp 4 -daemonize 

Литература:
http://www.linux-kvm.org/page/Networking
https://wiki.archlinux.org/index.php/QEMU#Networking
https://wiki.archlinux.org/index.php/KVM


вторник, 20 ноября 2012 г.

Переименовать md-устройство


Увидел такую картину на новом сервере:
[root@proteus ~]# cat /proc/mdstat 
Personalities : [raid1] 
md2 : active raid1 sda2[1] sdb2[2]
      157285304 blocks super 1.2 [2/2] [UU]
      
md127 : active (auto-read-only) raid1 sda3[1] sdb3[0]
      1795714000 blocks super 1.2 [2/2] [UU]
      
md1 : active raid1 sda1[1] sdb1[0]
      511936 blocks [2/2] [UU]
      
unused devices: <none>
[root@proteus ~]# cat /etc/mdadm.conf 
ARRAY /dev/md1 UUID=caa9382c:0099a987:4fbed893:ae34e34e
ARRAY /dev/md/2 metadata=1.2 UUID=68e6b327:6a4816f8:9bbb1e28:6c4a224b name=L146:2

Остановить устройство:

[root@proteus ~]# mdadm --stop /dev/md127 
mdadm: stopped /dev/md127

Собрать заново, используя метаданные на дисках:

[root@proteus ~]# mdadm --assemble /dev/md3 /dev/sda3 /dev/sdb3 --name=3 --update=name
mdadm: /dev/md3 has been started with 2 drives.

Проверка:
[root@proteus ~]# cat /proc/mdstat 
Personalities : [raid1] 
md3 : active raid1 sdb3[0] sda3[1]
      1795714000 blocks super 1.2 [2/2] [UU]
      
md2 : active raid1 sda2[1] sdb2[2]
      157285304 blocks super 1.2 [2/2] [UU]
      
md1 : active raid1 sda1[1] sdb1[0]
      511936 blocks [2/2] [UU]
      
unused devices: <none>

Записать в файл /etc/mdadm.conf:

[root@proteus ~]# mdadm --examine --scan > /etc/mdadm.conf 
[root@proteus ~]# cat /etc/mdadm.conf 
ARRAY /dev/md1 UUID=caa9382c:0099a987:4fbed893:ae34e34e
ARRAY /dev/md/2 metadata=1.2 UUID=68e6b327:6a4816f8:9bbb1e28:6c4a224b name=L146:2
ARRAY /dev/md/3 metadata=1.2 UUID=84bd3509:99237831:c00651e9:04d792ba name=proteus:3

Обновить initramfs:
[root@proteus ~]# cd /boot
[root@proteus ~]# mv initramfs-2.6.32-279.14.1.el6.x86_64.img initramfs-2.6.32-279.14.1.el6.x86_64.img.bak
[root@proteus ~]# dracut /boot/initramfs-2.6.32-279.14.1.el6.x86_64.img $(uname -r)

Контрольная перезагрузка:
[root@proteus ~]# reboot

P.S.: Если вы увидели «active (auto-read-only)» в файле /proc/mdstat, то, возможно, вы просто ничего не записывали в этот массив. Например, после монтирования раздела и любых изменений в примонтированном каталоге, статус автоматически меняется.



The file /boot/grub/stage1 not read correctly.


Сегодня пришлось помучится с установкой нового сервера под ОС CentOS6. На хостинге имелась возможность заказать бесплатную установку ОС. Сервер с 2-мя дисками по 2Т. Разбиение после автоустановки оказалось не подходящим мягко говоря:

# fdisk -l
Диск /dev/sda: 2000.4 ГБ, 2000398934016 байт
******
Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *         524      243201  1949311035   83  Linux
/dev/sda2               1         523     4200966   82  Linux своп / Solaris
Пункты таблицы разделов расположены не в дисковом порядке

Диск /dev/sdb: 2000.4 ГБ, 2000398934016 байт
*******

Разбил как нужно sdb:
# fdisk -l /dev/sdb
Диск /dev/sdb: 2000.4 ГБ, 2000398934016 байт
******
Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sdb1               1          64      512000   83  Linux
Раздел 1 не заканчивается на границе цилиндра.
/dev/sdb2              64       19646   157286400   83  Linux
Раздел 2 не заканчивается на границе цилиндра.

Создал файловые системы, подмонтировал, скопировал данные с sda.
При попытке установить загрузчик grub на sdb:

# grub-install --recheck --no-floppy /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
The file /boot/grub/stage1 not read correctly.

Если делать из консоли grub:
# grub
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no

Error 15t: File not found
grub> root (hd1,0)
root (hd1,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd1)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd1) (hd1)1+27 p (hd1,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.

Файл /boot/grub/stage1 находится на диске. Что за хрень?
Оказывается, старый grub не поддерживает 256 битные inode, которые были введены для легкой миграции на ext4.
Проверить размер инод на файловой системе можно так:
# tune2fs -l /dev/sda1 | grep -i 'inode size'
Inode size:               256

Решение - отформатировать заново раздел с 128-битными inode.
# mkfs.ext3 -I 128 /dev/sda1

Поскольку данные я скопировал на sdb, форматировал sda спокойно. )

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

Gentoo и "ImportError: No module named setuptools"

При попытке установить rdiff-backup (emerge rdiff-backup-1.2.8-r1.ebuild) вылезла такая ошибка:
*****

  File "setup.py", line 4, in <module>
    from setuptools import setup, Extension

ImportError: No module named setuptools
****
Полностью вывод ошибки копировать не буду потому как он большой. В глаза бросилась именно вышеуказанное сообщение. В Gentoo я новичок, как и в Python. Пришлось гуглить, пока не нашел действенный рецепт на каком-то точно не гентушном форуме. Запуск команды python-updater, которая находит и перестраивает проблемные пакеты появившиеся после обновления версии Python, решает проблему. Что за обновление Python было не скажу потому как зашел на этот хост первый раз и нужно было срочно установить такой пакет. Собственно, все, заметка для себя - вдруг придется зайти куда-то, где обновили Python и поломались пару пакетов. ))

среда, 31 октября 2012 г.

Разборки с LSI MegaRAID SAS 9240-8i

Собственно, поставили задачу поднять на SuperMicro X9SCI/X9SCA CentOS. Сервер слабенький, но дисков напихано 8 штук по 2 терабайта каждый. В поставку входит рэйд-контроллер LSI MegaRAID SAS 9240-8i. Заходим на сайт производителя и внимательно изучаем документацию. Скачиваем последние версии прошивки, драйверы, утилиты.
Обновление прошивки проходит с помощью утилиты MegaCli из ОС (на выбор DOS, Windows, Linux, FreeBSD, VMware, Solaris). В моем случае я сначала разбил диски на 2 виртуальных диска (2 в "зеркало", остальные в 5-й рэйд) и установил на один из них CentOS 6. Можно и выполнить прошивку рэйд-контроллера до установки, не суть важно. Главное, чтоб не пропало питание во время прошивки.

Установка утилиты тривиальна:
sudo rpm -ivh MegaCli-8.05.06-1.noarch.rpm
cd /opt/MegaRAID/MegaCli/

Сохранить текущую конфигурацию:
./MegaCli64 -CfgSave -f RaidCfgSave -a0

Распаковать прошивку в в папку с утилитой и выполнить прошивку:
./MegaCli64 -adpfwflash -f imr_fw.rom -a0

Цифра после a в предыдущих командах это номер адаптера в системе (в моем случае один адаптер с индексом 0). Узнать количество адаптеров можно командой ./MegaCli64 -adpCount

Перезагрузиться:
sudo reboot

Также на сайте производителя можно скачать пакет с MIBS. Требуется установка net-snmp:
sudo yum -y install net-snmp net-snmp-utils

Установка пакета от LSI
rpm -ivh sas_snmp-12.08-0303.x86_64.rpm

Копирование конфигурационного файла:
sudo mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.def
sudo cp /etc/lsi_mrdsnmp/lsi_mrdsnmpd.conf /etc/snmp/snmpd.conf

Перезапуска служб:
sudo service snmpd restart
sudo service lsi_mrdsnmp restart

Добавить в автозагрузку:
sudo chkconfig snmpd on
sudo chkconfig lsi_mrdsnmpd on

Скопировать MIBS в директорию с другими MIBS:
sudo cp /etc/lsi_mrdsnmp/sas/LSI-AdapterSAS.mib /usr/share/snmp/mibs/LSI-AdapterSAS.mib.txt

Проверка:
snmpwalk -v1 -c public 127.0.0.1 -m LSI-MegaRAID-SAS-MIB .1.3.6.1.4.1.3582

понедельник, 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

понедельник, 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 успокоился. Как говорится - "Не думай о секундах свысока".

пятница, 25 мая 2012 г.

Запланированная перезагрузка маршрутизатора cisco.

Возникла необходимость в сабже. Имеется устройство:

Router1#sh ver
Cisco IOS Software, C870 Software (C870-ADVIPSERVICESK9-M), Version 12.4(15)T7, RELEASE SOFTWARE (fc3)
ROM: System Bootstrap, Version 12.3(8r)YI4, RELEASE SOFTWARE

Router1 uptime is 22 minutes
System returned to ROM by power-on
System restarted at 15:26:54 FET Thu May 24 2012
System image file is "flash:c870-advipservicesk9-mz.124-15.T7.bin"

Cisco 871 (MPC8272) processor (revision 0x300) with 118784K/12288K bytes of memory.
Processor board ID FHK124728XM
MPC8272 CPU Rev: Part Number 0xC, Mask Number 0x10
5 FastEthernet interfaces
128K bytes of non-volatile configuration memory.
28672K bytes of processor board System flash (Intel Strataflash)

Клиент сильно желает перегружать ежедневно ночью. Попытка решить задачу с помощью команды reload не привела к ожидаемым результатам, необходимо каждый раз подтверждать перезагрузку, что не подходит. После недолгих поисков было найдено решение - использовать EEM (Embedded Event Manager).

Router1# conf t
Router1(config)#event manager applet RELOAD-ROUTER

Router1(config-applet)#event timer cron name "RELOAD" cron-entry "0 6 * * *"

Router1(config-applet)#exit

четверг, 24 мая 2012 г.

Как сохранить устанавливаемые с помощью yum rpm-пакеты

Иногда бывает полезно сохранять устанавливаемые с помощью yum пакеты. Например, когда внезапно понадобилась старая версия пакета, которой уже нет в публичном доступе.
Нижеследующие действия производились на RHEL6, но в 99% случаев подойдут и для CentOS, SL, Fedora.
sudo vi /etc/yum.conf
# Прописываем/изменяем переменную cachedir, в которой будут сохраняться устанавливаемые с помощью yum пакеты
cachedir=/var/cache/yum/$basearch/$releasever

# keepcache=0, означает удалять пакеты после успешной установки. Меняем на 1.
keepcache=1

Сохраняем изменения. Теперь в указанной выше директории будут сохраняться пакеты. Их можно будет устанавливать либо с помощью yum localinstall SOME_PACKAGE.rpm или rpm -ivh SOME_PACKAGE.rpm


Литература:
man yum.conf

среда, 9 мая 2012 г.

SSH, проброс портов

Собственно, довольно таки избитая тема. Оставлю небольшую заметку себе на память.
Предыстория: На работе начались проблемы с ДНС-сервером под Win2008R2, я в это время находился в заслуженном отгуле. Необходимо было подключиться и исправить. Своего ноута с настроенным впн-клиентом под рукой не оказалось - пришлось пользоваться ноутом друга. Настраивать там впн не имело особого смысла, потому решил сделать проброс порта через SSH.
Итак, вот она заветная строчка:
ssh -p 3821 -L 3389:192.168.0.2:3389 USERNAME@DOMAIN.COM
где
-p 3821 порт, на котором висит SSHD, можно не указывать, если используется стандартный 22-й. В моем случае такой.
-L 3389:192.168.0.2:3389. Формат данной записи такой (согласно man ssh)
-L [bind_address:]port:host:hostport. Строчка говорит о том, что данный порт на локальном хосте (клиенте) будет пробрасываться на указанный хост и порт на удаленной стороне. Т.е. bind_address я НЕ указываю (в моем случае), затем идет локальный порт 3389 (можно указать другой), затем IP-адрес и порт удаленной машины.
USERNAME@DOMAIN.COM имя пользователя и домен для аутентификации (НЕ доменные, не путать)

Кроме того, перед выполнением данных действий необходимо убедиться, что на стороне сервера разрешена опция AllowAgentForwarding в файле конфигурации sshd.
[jack@FW ~]$ sudo grep Allow /etc/ssh/sshd_config
AllowAgentForwarding yes


Итак, после ввода данной строчки и успешной аутентификации, сворачиваем клиент в сторону, но НЕ закрываем. Открываем RDP-клиент и пробуем соединиться на 127.0.0.1:3389. Получилось? Тогда вперед.
PS: Проблема с ДНС-сервером была решена.

Литература:
man ssh
http://www.lissyara.su/articles/freebsd/trivia/ssh_port_forwarding/

суббота, 5 мая 2012 г.

Установка nodejs на RHEL6.2

Краткая заметка на память о сабже.

1. Скачать пакет с информацией о репозитории:
wget -c http://nodejs.tchol.org/repocfg/el/nodejs-stable-release.noarch.rpm

2. Установить скачанный на предыдущем шаге пакет
sudo rpm -ivh nodejs-stable-release.noarch.rpm
или
sudo yum localinstall nodejs-stable-release.noarch.rpm

3. Установить nodejs
sudo yum install nodejs

4. Создать тестовый js-файл для проверки работы сервера:
cat test.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8888, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8888/');


5. Запуск сервера nodejs
sudo nodejs test.js

четверг, 5 апреля 2012 г.

Canon MF3110 и Windows 7 64-бит

Дано: Windows7 64 бит, принтер Canon MF3110.
Задача: заставить работать.
На сайте производителя имеются драйвера только под 32-х битную версию. Переставлять Windows заказчик не дает. После непродолжительных поисков было найдено решение народных умельцев. Небольшая заметка на память.
Для данного устройства под 64-битную Windows подходят драйвера для LaserBase MF5770 того же производителя.
1. Итак, скачиваем драйвера отсюда - http://software.canon-europe.com/software/0037099.asp
2. Распаковываем во временную папку.
3. Добавить принтер с помощью мастера в Панель Управления -> Устройства и Принтеры
3.1 выбрать Сетевой принтер
3.2 Использовать существующий порт, выбрать USB
3.3 Установка с диска, выбрать папку с драйвером, выбрать файл CNXRPKA6
3.4 Выбрать Canon MF5700 Series
3.5 Согласиться "Заменить текущий драйвер"

Литература:
http://genmed-root.blogspot.com/2011/03/canon-mf3110-windows-7-x64.html

среда, 4 апреля 2012 г.

Настройка awstats для снятия статистики proftpd


Предположим пакет proftpd установлен и настроен. Задача сводится к получению статистики из файла /var/log/xferlog (путь к файлу может отличаться, проверьте директиву TransferLog в конфигурационном файле proftpd.conf) и приведению ее к удобочитаемому виду.

Пример лог-файла xferlog
Wed Jan 01 19:29:35 2012 1 192.168.1.1 102 /home/test/123.txt b _ o r test ftp 0 * c

Подробную информацию о том, что именно записывается в данный лог-файл можно получить из документации, в частности описание директивы LogFormat.

Отредактировать файл /etc/awstats/awstats.DOMAIN.COM.conf (приведу лишь измененные строчки)
# Файл с данными
LogFile="/var/log/xferlog"
# Тип лог-файла, для web-сервера W, F — для ftp и т.п.:
LogType=F
# Строка, описывающая формат лог-файла
LogFormat="%time3 %other %host %bytesd %url %other %other %method %other %logname %other %code %other %other"
# Указываем имя домена
SiteDomain="DOMAIN.COM"
# Указываем все возможные псевдонимы домена
HostAliases="localhost 127.0.0.1 www.DOMAIN.COM ftp.DOMAIN.COM"
# В какой папке будут лежать БД awstats, на основе этих данных awstats сгенерирует отображаемую статистику.
DirData="/var/www/awstats/DOMAIN.COM"
# Путь к папке с иконками
DirIcons="/awstats/icon/"

Добавляем в cron:
crontab -e
30 * * * * /var/www/awstats/awstats.pl -config=DOMAIN.COM -update >/dev/null
40 * * * * awstats_buildstaticpages.pl -config=DOMAIN.COM -update -lang=ru -awstatsprog=/var/www/awstats/awstats.pl -dir=/var/www/awstats/DOMAIN.COM/ >/dev/null

Перезапуск crond.
service crond restart

Настройки виртуального хоста nginx можно взять из моей предыдущей заметки http://jskyworker.blogspot.com/2011/10/awstats-web-nginx.html

Литература:

пятница, 16 марта 2012 г.

Error allocating block bitmap (4)

У меня крутится несколько виртуальных машин на ESXi5, к одной виртуальной машине подключен диск объемом 2Т. После перезагрузки вылезла ошибка на этапе проверки файловой системы:
Error allocating block bitmap (4): 

Give root password for maintenance (or type Control-D to continue)



Замечательно. Опытным путем было установлено, что утилите e2fsck не хватает памяти для проверки файловой системы. Т.е. можно увеличить размер памяти для виртуальной машины на время для ее загрузки, либо временно убрать раздел из /etc/fstab, а потом после старта системы запустить проверку на НЕ смонтированном разделе (опять же, если есть swap-раздел/swap-файл размером от 2Г).

Литература: http://blog.ronnyegner-consulting.de/2011/08/18/ext4-and-the-16-tb-limit-now-solved/

вторник, 14 февраля 2012 г.

Настройка nginx для работы exilog.


Небольшая заметка о настройке nginx для работы exilog. Опции exilog я не привожу, исходя из соображений безопасности и тривиальности настройки. Сам nginx не умеет CGI, для этого придется проксировать CGI-запросы на маленький производительный сервис thttpd. Собственно, сами действия:
1. Скачать thttpd

2. Распаковать


3. Конфигурирование
./configure —prefix=/usr

4. Наложить патч (http://wiki.nginx.org/ThttpdRealIP)

По умолчанию, thttpd не пропускает заголовок X-Forwarded-For. Этот патч преобразует X-Forwarded-For в Remote-Addr.

--- thttpd-2.25b/libhttpd.c 2003-12-25 20:06:05.000000000 +0100
+++ thttpd-2.25b-patched/libhttpd.c 2005-01-09 00:26:04.867255248 +0100
@@ -2207,6 +2207,12 @@
if ( strcasecmp( cp, "keep-alive" ) == 0 )
hc->keep_alive = 1;
}
+ else if ( strncasecmp( buf, "X-Forwarded-For:", 16 ) == 0 )
+ { // Use real IP if available
+ cp = &buf[16];
+ cp += strspn( cp, " \t" );
+ inet_aton( cp, &(hc->client_addr.sa_in.sin_addr) );
+ }
#ifdef LOG_UNKNOWN_HEADERS
else if ( strncasecmp( buf, "Accept-Charset:", 15 ) == 0 ||
strncasecmp( buf, "Accept-Language:", 16 ) == 0 ||

5. Компиляция
make
Если вылазит ошибка
htpasswd.c:52: ошибка: несовместимые типы для ‘getline’
Нужно отредактировать файл htpasswd.c и заменить название функции 'getline' by 'my_getline', поскольку такое название уже существует.

6. Установка
make install

cp ./contrib/redhat-rpm/thttpd.init /etc/init.d/thttpd
cp ./contrib/redhat-rpm/thttpd.conf /etc/

7. Отредактировать /etc/thttpd.conf, привести к виду:
dir=/var/www
#chroot
user=apache
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
port=9000
cgipat=**.pl
host=127.0.0.1
# charset=iso-8859-1

8. Добавить в автозагрузку thttpd
chkconfig --add thttpd

9. Настройка nginx
location /exilog {
proxy_pass http://127.0.0.1:9000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

10. Перезапуск nginx 
service nginx reload

Литература:

суббота, 11 февраля 2012 г.

Nginx+roundcube+ssl+non-standart port.

История о том, как взялся настроить связку nginx+php-fpm+roundcube в одной небольшой конторке. Собственно, во многих своих проектах стараюсь уходить от apache+mod_php к nginx+php-fpm, поскольку ее (связки) производительность и надежность, на мой взгляд, просто замечательная. Итак, задача сводилась к поднятию web-сервера с поддержкой SSL на нестандартном порту 8443. Под управлением данного web-сервера будут крутиться несколько сайтов, в том числе и roundcube.
Настройка конфигурации roundcube взята из моей предыдущей статейки, не буду поэтому повторяться, приводя аналогичные настройки. Генерация собственных сертификатов подробно описана на просторах интернета и вроде как вполне тривиальная задача, приведу просто команды, чтоб самому было легче вспоминать).
Итак,
1. Скачать дистрибутив roundcubemail-0.7.1.tar.gz с официального сайта.
2. Подключить репозиторий nginx и установить web-сервер
wget -c http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm
yum -y install nginx-release-rhel-6-0.el6.ngx.noarch.rpm
yum -y install nginx
3. Подключить репозиторий remi и установить php-fpm

wget -c http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
yum -y install php-fpm

4. Сгенерировать SSL-сертификаты/ключи и просмотреть информацию о них, переместить в директорию /etc/nginx/conf.d/

openssl req -new -x509 -extensions v3_ca -keyout private/rootCA.key -out rootCA.crt -days 5000 -config ./openssl.cnf
openssl x509 -in rootCA.crt -noout -purpose
openssl x509 -in rootCA.crt -noout -text
openssl x509 -in rootCA.crt -noout -dates


openssl req -new -nodes -out webmail.DOMAIN.csr -keyout webmail.DOMAIN.key -config ./openssl.cnf
openssl ca -out webmail.DOMAIN.crt -infiles webmail.DOMAIN.csr -config ./openssl.cnf
mv webmail.DOMAIN.{crt,key} /etc/nginx/conf.d/
chown 0.0 /etc/nginx/conf.d/webmail.DOMAIN.{crt,key}
chmod 444 /etc/nginx/conf.d/webmail.DOMAIN.crt
chmod 400 /etc/nginx/conf.d/webmail.DOMAIN.key

5. Настройка nginx+php-fpm. Приведу только измененные строки

server {
    listen       80;
    server_name  webmail.DOMAIN webmail;
    access_log  /var/log/nginx/webmail-access.log main;
    error_log /var/log/nginx/webmail-error.log;
    rewrite ^ https://webmail.DOMAIN:8443$request_uri permanent;
}


server {
    listen       8443;
    server_name  webmail.DOMAIN webmail;


    ssl                  on;
    ssl_certificate      /etc/nginx/conf.d/webmail.DOMAIN.crt;
    ssl_certificate_key  /etc/nginx/conf.d/webmail.DOMAIN.key;
    ssl_session_timeout  10m;
    ssl_session_cache    shared:SSL:10m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2;
    ssl_prefer_server_ciphers   on;


    access_log  /var/log/nginx/webmail-access.log main;
    error_log /var/log/nginx/webmail-error.log;
    root /var/www/rcube;
    index index.php;


    error_page 497 https://$host:8443$request_uri;


    location ~ ^/.+\.(jpg|png|gif)$ {
        expires max;
    }


    location ~* ^/(config|logs|temp|bin|sql)/.+$ {
        deny all;
    }


    location ~ \.php$ {
        fastcgi_param HTTPS on;
        include /etc/nginx/conf.d/php-pharm;
    }


    location ~ /\.ht {
        deny  all;
    }
}

6. Дальнейшая настройка roundcube (см. статью).

7. Важные моменты:
Указав, rewrite ^ https://webmail.DOMAIN:8443$request_uri permanent; я думал, что все сделано, но не тут то было. В ответ я получил 400 ошибку:
400 Bad Request
The plain HTTP request was sent to HTTPS port
Если изменить rewrite на обычный 443 порт и директиву listen соот. поменять 8443 на 443, то все работает.
Недолгий поиск в интернете приводит к решению. При переходе по протоколу HTTP по адресу, на котором HTTPS (ssl on), то будет сгенерирована (нестандартная) ошибка 497, соответственно на нее надо повесить error_page с перенаправлением. Ошибки 411, 414, 495, 496 и 497 могут возникнуть только на уровне сервера, НЕ на уровне location.

Литература:
http://forum.nginx.org/read.php?2,155978