четверг, 28 ноября 2013 г.

Запуск zabbix-agent из-под другого пользователя

Столкнулся с интересной проблемой...
Остановил Xen-server и после старта выяснилось, что zabbix-agent не поднимается с сообщением:

# service zabbix-agent start
Starting ZABBIX agent: zabbix_agentd [30451]: user zabbix does not exist
zabbix_agentd [30451]: cannot run as root!
                                                           [FAILED]


Решение такое - добавляем пользователя zabbix:
# useradd -M -g zabbix -s /sbin/nologin zabbix

Запускаем, и видим в логах:
# tail -f /var/log/zabbix/zabbx-agent.log
...
zabbix_agentd [11587]: cannot create PID file [/var/run/zabbix/zabbix_agentd.pid]: [13] Permission denied
...

Изменяем права доступа:
chown -R zabbix:zabbix /var/run/zabbix

И вуаля - zabbx стартует и работает...

# service zabbix-agent start
Starting ZABBIX agent:                                     [  OK  ]

вторник, 26 ноября 2013 г.

Удаление файлов старше определенной даты в linux/unix

Удаляем все файлы из каталога /somedir, возраст которых превышает 140 суток
Способ 1
find /somedir -mtime +140 -exec rm {} \;

Способ 2
find /somedir -mtime +140 -delete

воскресенье, 17 ноября 2013 г.

Как написать правило SNAT в iptables для интерфейса с динамическим IP

Прихожу на работу утром, а бухгалтера жалуются, что не работает "Система Город".
Для подключения используется "централизованный" OpenVPN на роутере предприятия.
Проверяю состояние интерфейса:


и маршрутизацию:
# route -n | grep 10.221.128
10.221.128.0    0.0.0.0         255.255.128.0   U     0      0        0 tap0


 - все в порядке.
Проверяю телнетом со своего компа - не проваливается.
Хм.
Рестартанул скрипт rc.firewall - не помогает.
Смотрю tcpdump-ом на интерфейсе роутера:

# tcpdump -qnn -i tap0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:03:20.927793 IP 10.221.130.209.60475 > 10.221.128.1.3389: tcp 0
09:03:22.166023 ARP, Request who-has 10.221.130.209 tell 10.221.128.1, length 28
09:03:23.926820 IP 10.221.130.209.60475 > 10.221.128.1.3389: tcp 0
09:03:24.674988 ARP, Request who-has 10.221.130.209 tell 10.221.128.1, length 28

Отсюда понимаю, что система не знает ничего об адресе 10.221.130.209 - а это по идее адрес нашего интерфейса tap0.
Проверяю состояние tap0:
# ifconfig tap0
tap0      Link encap:Ethernet  HWaddr B2:2F:7F:0B:A3:3B
          inet addr:10.221.141.98  Bcast:10.221.255.255  Mask:255.255.128.0
          inet6 addr: fe80::b02f:7fff:fe0b:a33b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1532  Metric:1
          RX packets:1804 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:75768 (73.9 KiB)  TX bytes:2560 (2.5 KiB)

Ага, поменялся адрес интерфейса tap0, и правила в скрипте rc.firewall стали недействительными.
Уточняю у админов системы город - поменялось оборудование у них, а ip-шники присваиваются динамически.
Что же делать, думаю? Нужно в скрипте rc.firewall вместо константы использовать выражение, которое бы возвращало ip-адрес интерфейса tap0

Чуть чуть поразмыслив, нахожу вот такое решение:

/sbin/ifconfig tap0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'

и добавляю соответствующую переменную в скрипт rc.firewall:

GOROD_IP=`/sbin/ifconfig tap0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'`

Перезапускаю скрипт:
# /etc/rc.d/rc.firewall

Проверяю правила:
# iptables-save | grep 10.221
-A POSTROUTING -s 192.168.0.0/24 -d 10.221.128.0/24 -o tap0 -j SNAT --to-source 10.221.141.98
-A INPUT -s 10.221.0.0/16 -d 10.221.141.98/32 -p tcp -m tcp --sport 3389 --dport 1024:65535 -j ACCEPT
-A FORWARD -s 192.168.0.0/24 -d 10.221.0.0/16 -p tcp -m tcp --sport 1024:65535 --dport 3389 -j ACCEPT
-A FORWARD -s 10.221.0.0/16 -d 192.168.0.0/24 -p tcp -m tcp --sport 3389 --dport 1024:65535 -j ACCEPT
-A OUTPUT -s 10.221.141.98/32 -d 10.221.0.0/16 -p tcp -m tcp --sport 1024:65535 --dport 3389 -j ACCEPT

Вижу правильный IP в последнем правиле - все в порядке, теперь можно спать спокойно...

среда, 13 ноября 2013 г.

Программный рэйд на RHEL4

Достался рабочий сервер Oracle.
Стоит задача поднять рэйд.
Аппаратного нет, поэтому создаем программный.

Все работы производятся прямо на боевой системе, база данных остановлена.

Смотрим имеющиеся разделы (/dev/sda), создаем на втором диске (/dev/sdb) разделы для программного raid:
VBNKSB->/home/it3# fdisk -l

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          13      104394+  83  Linux
/dev/sda2              14      121600   976647577+  8e  Linux LVM

Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sdb1   *           1          62      497983+  fd  Автоопределение Linux raid
/dev/sdb2              63        1036     7823655   fd  Автоопределение Linux raid
/dev/sdb3            1037      121601   968438362+  fd  Автоопределение Linux raid

После создания меняем тип разделов на fd (Linux raid), устанавливаем загрузочный флаг на /dev/sdb1.
К стати, точки монтирования спланированы следующим образом:
/dev/sdb1 - /boot
/dev/sdb2 - /swap
/dev/sdb3 - /
(в последствии /dev/sdb1 станет /dev/md0, /dev/sdb2 -> /dev/md1 и т.д.)


Сохраняем изменения, перезагружаем систему.

Создадим устройства MD на втором диске, но перед созданием желательно затереть нулями разделы:
dd if=/dev/zero of=/dev/sdb1 bs=4096 && dd if=/dev/zero of=/dev/sdb2 bs=4096 && dd if=/dev/zero of=/dev/sdb3 bs=4096

Причем, /dev/sdb3 достаточно большой и его затирание протекает долго, поэтому можно ограничиться несколькими секундами после запуска последней команды.

Создаем устройства md:

# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
 # mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb2 missing
 # mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sdb3 missing

Создадем файловые системы на RAID:

  # mkfs.ext3 /dev/md0 &&  mkfs.ext3 /dev/md2 && mkswap /dev/md1

Клонируем загрузочный раздел боевого винта на загрузочный раздел raid:
# dd if=/dev/sda1 of=/dev/md0 bs=4096

Монтируем корневой раздел raid:
# mkdir /mnt/root
# mount /dev/md2 /mnt/root

Копируем систему на новый раздел:
# cp -axvp / /mnt/root

 Редактируем fstab для монтирования root раздела с RAID:
# nano /mnt/root/etc/fstab
вместо строки 
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
пишем
/dev/md2                /                       ext3    defaults        1 1

вместо строки
LABEL=/boot             /boot                   ext3    defaults        1 2
пишем 
/dev/md0                /boot                   ext3    defaults        1 2

вместо
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
пишем
/dev/md1                /swap                   swap    defaults        0 0

Создаем загрузочный образ для RAID:
# mkdir /mnt/root/initrd-raid
# cd /mnt/root/initrd-raid
# mkinitrd -v --fstab=/mnt/root/etc/fstab /mnt/root/initrd-raid/initrd-`uname -r`-raid.img `uname -r`
# cd /mnt/root/initrd-raid
# zcat initrd-`uname -r`-raid.img | cpio -i

Редактируем файл init:
# nano init
добавляем после
   raidautorun /dev/md2
две строки:
raidautorun /dev/md0
raidautorun /dev/md1

Монтируем новый загрузочный раздел в /mnt/root/boot
mount /dev/md0 /mnt/root/boot

Копируем новый диск в каталог /mnt/boot
# find . -print | cpio -o -Hnewc | gzip -c > /mnt/root/boot/initrd-`uname -r`-raid.img
# rm /mnt/boot/initrd-2.6.18-92.el5.img
# ln -s initrd-`uname -r`-raid.img /mnt//root/boot/initrd-2.6.18-92.el5.img

Редактируем загрузочное меню:
nano /mnt/root/boot/grub/grub.conf

изменяем строку  kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/xxx
на
 kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/md2 rhgb quiet

Устанавливаем grub на RAID
# for i in dev proc sys; do mount -o bind /$i /mnt/root/$i; done
# chroot /mnt/root
# grub-install --recheck --no-floppy /dev/md0

Выходим из chroot
# Ctrl+d

Размонтируем файловые системы!!!
# for i in dev proc sys; do umount /mnt/root/$i; done
# umount /mnt/root/boot
# umount /mnt/root

Перезагружаем сервер и в BIOS выбираем загрузку с нужного нам диска.
Убеждаемся, что загрузились с диска, являющегося членом RAID-массива

# df -h
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/md2              910G  721G  143G  84% /
/dev/md0               99M   14M   80M  15% /boot
tmpfs                 5,9G     0  5,9G   0% /dev/shm

Копируем куда-нибудь таблицу разделов диска, являющегося членом RAID-массива:

# fdisk -l /dev/sdb

Диск /dev/sdb: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sdb1   *           1          62      497983+  fd  Автоопределение Linux raid
/dev/sdb2              63        1036     7823655   fd  Автоопределение Linux raid
/dev/sdb3            1037      121601   968438362+  fd  Автоопределение Linux raid

Создаем точно такие же разделы на /dev/sda:

# fdisk /dev/sda

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          13      104394+  83  Linux
/dev/sda2              14      121600   976647577+  8e  Linux LVM

Команда (m для справки): d
Номер раздела (1-4): 2

Команда (m для справки): d
Выбранный раздел 1

Команда (m для справки): n
Действие команды
   e   расширенный
   p   основной раздел (1-4)
p
Номер раздела (1-4): 1
Первый цилиндр (1-121601, по умолчанию 1):
Используется значение по умолчанию 1
Последний цилиндр или +size или +sizeM или +sizeK (1-121601, по умолчанию 121601): 62

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1               1          62      497983+  83  Linux

Команда (m для справки): t
Выбранный раздел 1
Шестнадцатеричный код (введите L для получения списка кодов): fd
Системный тип раздела 1 изменен на fd (Автоопределение Linux raid)

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1               1          62      497983+  fd  Автоопределение Linux raid

Команда (m для справки): a
Номер раздела (1-4): 1

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          62      497983+  fd  Автоопределение Linux raid

Команда (m для справки): n
Действие команды
   e   расширенный
   p   основной раздел (1-4)
p
Номер раздела (1-4): 2
Первый цилиндр (63-121601, по умолчанию 63):
Используется значение по умолчанию 63
Последний цилиндр или +size или +sizeM или +sizeK (63-121601, по умолчанию 121601): 1036

Команда (m для справки): t
Номер раздела (1-4): 2
Шестнадцатеричный код (введите L для получения списка кодов): 82
Системный тип раздела 2 изменен на 82 (Linux своп / Solaris)

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          62      497983+  fd  Автоопределение Linux raid
/dev/sda2              63        1036     7823655   82  Linux своп / Solaris

Команда (m для справки): t
Номер раздела (1-4): 2
Шестнадцатеричный код (введите L для получения списка кодов): fd
Системный тип раздела 2 изменен на fd (Автоопределение Linux raid)

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          62      497983+  fd  Автоопределение Linux raid
/dev/sda2              63        1036     7823655   fd  Автоопределение Linux raid

Команда (m для справки): n
Действие команды
   e   расширенный
   p   основной раздел (1-4)
p
Номер раздела (1-4): 3
Первый цилиндр (1037-121601, по умолчанию 1037):
Используется значение по умолчанию 1037
Последний цилиндр или +size или +sizeM или +sizeK (1037-121601, по умолчанию 121601):
Используется значение по умолчанию 121601

Команда (m для справки): t
Номер раздела (1-4): 3
Шестнадцатеричный код (введите L для получения списка кодов): fd
Системный тип раздела 3 изменен на fd (Автоопределение Linux raid)

Команда (m для справки): p

Диск /dev/sda: 1000.2 ГБ, 1000204886016 байт
255 heads, 63 sectors/track, 121601 cylinders
Единицы = цилиндры по 16065 * 512 = 8225280 байт

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1   *           1          62      497983+  fd  Автоопределение Linux raid
/dev/sda2              63        1036     7823655   fd  Автоопределение Linux raid
/dev/sda3            1037      121601   968438362+  fd  Автоопределение Linux raid

Команда (m для справки): w
Таблица разделов была изменена!

Вызывается ioctl() для перечитывания таблицы разделов.

ПРЕДУПРЕЖДЕНИЕ: Перечитывание таблицы разделов завершилось неудачей с ошибкой 16: Устройство или ресурс занято.
Ядро все еще использует старую таблицу.
Новая таблица будет использована при следующей перезагрузке.
Синхронизируются диски.


Перезагружаем сервер...
# shutdown -r now

 Теперь можно включать первый диск в RAID:

# mdadm -a /dev/md0 /dev/sda1
mdadm: added /dev/sda1
# mdadm -a /dev/md1 /dev/sda2
mdadm: added /dev/sda2
# mdadm -a /dev/md2 /dev/sda3
mdadm: added /dev/sda3

Процесс синхронизации (ребилда) массива можно смотреть с помощью команды:
# watch -n 1 cat /proc/mdstat

После завершения ребилда вносим последние изменения в настройки:

# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

И перезагружаемся. Для корректной загрузки в случае отказа одного из дисков, требуется настроить в BIOS загрузку системы с обоих жестких дисков по-очереди.

Вот и все  на этом настройка software RAID1 завершена. Все необходимые команды для работы с RAID можно найти здесь http://xgu.ru/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D1%8B%D0%B9_RAID_%D0%B2_Linux#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.BE.D0.B2.D0.BE.D0.B3.D0.BE_.D0.B4.D0.B8.D1.81.D0.BA.D0.B0

Основа для данной статьи взята отсюда >> http://www.mahno.su/jexr/http://pastebin.com/psaWg7QK

Как выполнить проверку целостности программного RAID-массива md0:
echo 'check' >/sys/block/md0/md/sync_action

Как посмотреть нашлись ли какие-то ошибки в процессе проверки программного RAID-массива по команде check или repair:
cat /sys/block/md0/md/mismatch_cnt

Для наблюдение за md-массивами добавляем в /etc/rc.d/rc.local следующую строку:

mdadm --monitor --scan --delay=120 -m admin@example.com --daemonise > /var/run/mdadm/mdadm.pid

понедельник, 4 ноября 2013 г.

rpmdb: Lock table is out of available locker entries

В общем, это сообщение говорит о том, что испорчена база rpmdb

Я забэкапил каталог:
tar cvzf rpm-backup.tar.gz /var/lib/rpm
Удалил битые файлы базы данных, которые использует yum и rpm:
rm /var/lib/rpm/__db.00*
Пересоздал файлы базы:

rpm --rebuilddb