четверг, 5 декабря 2013 г.

Как автоматически восстанавливать лимиты на интернет и реконфигурировать SAMS каждый месяц


1.       Лимиты на интернет удобно запоминать в поле ip текущего пользователя
1.1 Для уже созданных пользователей его легко заполнить, выполнив следующий запрос в базе squidctrl:

UPDATE squidusers set ip = quotes where quotes is not null

1.2   Для новых пользователей заводим себе привычку дополнять поле ip информацией о лимите на инет.

2.       В файлик (например) /root/scripts/sams_reconfig.sql записываем следующий запрос:

UPDATE squidusers set quotes = ip where ip is not null

3.       В /etc/cron.monthly/sams_reconfig.sh пишем следующее:

#!/bin/sh

CONF=/etc/sams.conf

if [ ! -r "${CONF}" ] ; then
echo "${CONF} is not readable"
exit 1
fi

DBUSER=`grep ^MYSQLUSER "${CONF}" | awk -F'=' '{print $2}'`
DBPASS=`grep ^MYSQLPASSWORD "${CONF}" | awk -F'=' '{print $2}'`
DBNAME=`grep ^SAMS_DB "${CONF}" | awk -F'=' '{print $2}'`
CACHENUM=`grep ^CACHENUM "${CONF}" | awk -F'=' '{print $2}'`

if [ -z "${DBUSER}" ] || [ -z "${DBPASS}" ] || [ -z "${DBNAME}" ] || [ -z "${CACHENUM}" ] ; then
[ -z "${DBUSER}" ] && echo "MYSQLUSER is not defined in ${CONF}"
[ -z "${DBPASS}" ] && echo "MYSQLPASSWORD is not defined in ${CONF}"
[ -z "${DBNAME}" ] && echo "SAMS_DB is not defined in ${CONF}"
[ -z "${CACHENUM}" ] && echo "CACHENUM is not defined in ${CONF}"
exit 2
fi

CMD="mysql --user=\"${DBUSER}\" --password=\"${DBPASS}\" --database=\"${DBNAME}\" < /root/scripts/sams_reconfig.sql"

eval ${CMD}

CMD="mysql --user=\"${DBUSER}\" --password=\"${DBPASS}\" --database=\"${DBNAME}\" -ss --execute=\"INSERT INTO reconfig (\\\`number\\\`, \\\`service\\\`, \\\`action\\\`) VALUES (${CACHENUM}, 'squid', 'reconfig');\""

eval ${CMD}

exit $?


Ну, там делаем скрипт исполняемым, и все: каждый месяц данные о лимитах будут заменяться значениями из поля ip, после этого будет производиться реконфигурирование squid

четверг, 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

четверг, 8 августа 2013 г.

Сentos добавление жесткого диска

1. Загрузить операционную систему, войти с правами суперпользователя и выполнить команду dmesg.
Имея размер винчестера, и зная в каком SATA порту он стоит, можно прикинуть как определило наше устройство ядро Linux. Предположим sdc.
2. Теперь необходимо создать на новом HDD раздел. Это приведёт к удалению всей имеющейся на нем информации. Поэтому определять какой винчестер наш в п.2 надо особенно внимательно.
Для этого запускаем /sbin/fdisk /dev/sdc
Теперь задаем команды, нажатием кропки «m» вызывается справка.
Смотрим, какие есть уже разделы «p», удаляем «d» если они есть, задаем новую на весь винчестер «n», «p», «1″, «нажать Enter», «нажать Enter», «w».
Раздел готов. Это раздел на весь винчестер.
3. Необходимо отформатировать новый раздел командой /sbin/mkfs.ext3 /dev/sdc1
На все, что спросит программа форматирования можно нажать клавишу Enter, но скорее всего ничего она не спросит.
4. Создаём новую точку монтирования и монтируем новый винчестер.
Предположим, что существует правило по которому новые винчестеры, монтируются в каталоги, называемые dataN и находящиеся в корневом каталоге. Т.е. необходимо посмотреть, какие есть такие каталоги в / и назначить вместо N в имени каталога, порядковое число от 0 и далее.
А теперь смонтируем в этот каталог наш новый винчестер.
/bin/mount /dev/sdc1 /data1
5. Проверяем какие разделы у нас есть на этом этапе командой df -h
6. Добавляем винчестер в конфигурацию системы, для того чтобы он подсоединялся на этапе загрузки системы.
Редактируем /etc/fstab добавляя в него строку:
/dev/sdc1 /data1 ext3 defaults 1 2
В конце файла, обязательно необходимо оставить пустую строку.
7. Перегружаемся и проверяем командой df -h нормально ли примонтировался наш винчестер после цикла перегрузки.
8. Вслучае если что то пошло не так и система начинает грузится «файловая система доступна только для чтения»  для редактирования fstab в консоле надо смонтировать диск для чтения
mount -oremount,rw /