Шукати в цьому блозі

середа, 26 червня 2013 р.

bind: перенаправление кеширующих запросов

Предыстория такова. Был задано вопрос: как в кэширующем dns-сервере запросы определённым зонам отправлять на определённые dns-сервера?

Всем известна глобальная опция forwarders в секции options конфигурации bind. В ней задаётся безусловное перенаправление всех запросов к нашему серверу на другие dns-сервера. Однако задача ставилась таким образом, что, например, к домену domain.com необходимо перенаправить запрос к серверу отличному от описанного в глобальной опции forwarders секции options.

Слёту, что я смог придумать, в ответ на этот вопрос, это прописать для указанного домена slave зону, например так:
zone "domain.com" {
    type slave;
    file "/var/cache/bind/domain.com";
    masters {
      1.2.3.4;
      5.6.7.8;
    };
};
В принципе этот вариант работает, но как оказалось существует более элегантное решение, в котором не нужно "засорять" файловую систему "лишними" зонами доменов:
zone "domain.com" {
    type forward;
    forwarders {
      1.2.3.4;
      5.6.7.8;
    };
};
Надо признать, что второе решение, в свете оригинального вопроса, религиозно более верное.

ps: Справедливости ради так-же надо отметить, что решение было найдено самим вопрошающим, и как обычно это был pilson.

середа, 12 червня 2013 р.

(java.sql.SQLException) Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

Долго бился головой об стену, уже даже начал придумывать всяческие хитрые mysql-ные view-вы чтобы обмануть Java в проекте JDeveloper-а... Суть проблемы заключалась в том, что исторически сложилось так, что несущественные значения timestamp в mysql-базе заполнялись значениями '0000-00-00 00:00:00', а в Java они не преобразовывались нормально в значение timestamp и выбивали исключение.
Решение было найдено следующее. Во-первых, connection был преобразован в jdbc url, а во-вторых к нему был добавлен параметр zeroDateTimeBehavior установленный в значение convertToNull. О всех возможных значениях можно почитать на соответствующей странице руководства MySQL: Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J, а об использовании ADF Business Components совместно с MySQL тут "How To Use ADF Business Components with MySQL".
В итоге jdbc url стал выглядеть примерно так:
jdbc:mysql://hostname/database?ultraDevHack=true&capitalizeTypeNames=true&pedantic=true&zeroDateTimeBehavior=convertToNull&sqlmode=oracle


вівторок, 11 червня 2013 р.

Фрагментация файловой системы

Вот, возник тут "кухонный вопрос": "Как глянуть % фрагментации файловой системы ext4 в Linux?".
Был найден следующий ответ, посмотреть для всех подмонтированных ext4:
for D in $( mount | awk '$5~/ext4/ { print $1 }' ); do sudo fsck.ext4 -nvf ${D}; done
Вот non-contiguous это и есть % фрагментации.

Для конкретного файла фрагментацию можно посмотреть так:
$ filefrag -v public_html/linux/iso/KNOPPIX_V7.0.3CD-2012-06-25-EN.iso 
Filesystem type is: 9123683e
File size of public_html/linux/iso/KNOPPIX_V7.0.3CD-2012-06-25-EN.iso is 726409216 (177346 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  7485916           48094 
   1   48094  7603311  7534010  35134 
   2   83228 12453920  7638445  30774 
   3  114002 19315090 12484694  47884 
   4  161886 19577207 19362974  15460 eof
public_html/linux/iso/KNOPPIX_V7.0.3CD-2012-06-25-EN.iso: 5 extents found

понеділок, 27 травня 2013 р.

Законы Мёрфи для IT

Закон 1. Автоматизация бизнес-процессов не приводит к росту производительности — она приводит к большему количеству свободного времени у менеджеров/клерков исполнительного звена.

Следствие 1 закона. Большое количество свободного времени менеджеров оборачивается бóльшим количеством заявок на обслуживание и изобретательностью в перекладывании своей работы на других, в том числе сисадминов.

Дополнение к 1 закону. Любое время, потраченное на оптимизацию, в геометрической прогрессии увеличивает нагрузку на IT-отдел.

Вывод из 1 закона. Автоматизировать бизнес-процесс надо тогда и только тогда, когда это уже назрело и этого требует руководство. После внедрения обязательно потребовать премию.



Закон 2. Каждый менеджер/клерк стремиться сделать свою среду работы максимально удобной для себя в максимальный ущерб компании.

Дополнение к 2 закону. Уникальность бизнес-процессов компании — миф. Желание менеджера/клерка адаптировать интерфейс программ под свои нужды — это их нежелание осваивать работу со стандартной конфигурацией и программными средствами.

Следствие из 2 закона. Любое желание менеджера/клерка оптимизировать работу несёт вред.



Закон 3 (закон Парето для IT). 20% времени должно уделяться резервированию и документированию. Это лучше, чем 80% времени тратить на решение аварийных ситуаций.

Дополнение к 3 закону. 20% времени дают 80% результата по оптимизации и улучшению информационной системы. 80% времени и усилий пропадают зря.



Закон 4. IQ пользователя — величина отрицательная. Примите это как данность и делайте всё исходя из этой аксиомы — это сэкономит вам время и нервы.

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



Закон 5. Глючит всё. Всё, что не может глючить, всё равно заглючит от сопряжённых с ним элементов. Если что-то не глючит — значит, оно скоро сгорит.

Дополнение к 5 закону. Ошибки, которые могут случиться, случаются. Те, которых быть не может в принципе, случаются несколько реже.



Закон 6. Все сроки, назначаемые IT-специалистами, срываются.

Дополнение к 6 закону. Если вы удвоили сроки — добавьте ещё 10–20% на дедлайн.



Закон 7. Любая система хаотична. Степень хаоса системы прямо пропорциональна времени её эксплуатации.



Закон 8. Ни один программный продукт или платформа не готовы к использованию при первом релизе.

Следствие из 8 закона. Любой продукт можно внедрять только после 1–2 полноценных пакетов исправлений.

неділя, 26 травня 2013 р.

Установка Oracle в proxmox используя openvz-контейнер CentOS

Заходим в web-интерфейс управления proxmox и создаём на основе шаблока openvz-контейнер. В качестве шаблона я взял centos-6-standard_6.3-1_i386.tar.gz.
Например был создан контейнер с id 105.
"Протюнингуем" этот контейнер:
vzctl set 105 --kmemsize unlimited --save
vzctl set 105 --lockedpages unlimited --save
vzctl set 105 --privvmpages unlimited --save
vzctl set 105 --shmpages unlimited --save
vzctl set 105 --numproc unlimited --save
vzctl set 105 --numtcpsock unlimited --save
vzctl set 105 --numflock unlimited --save
vzctl set 105 --numpty unlimited --save
vzctl set 105 --numsiginfo unlimited --save
vzctl set 105 --tcpsndbuf unlimited --save
vzctl set 105 --tcprcvbuf unlimited --save
vzctl set 105 --othersockbuf unlimited --save
vzctl set 105 --dgramrcvbuf unlimited --save
vzctl set 105 --numothersock unlimited --save
vzctl set 105 --dcachesize unlimited --save
vzctl set 105 --numfile unlimited --save
vzctl set 105 --numiptent unlimited --save
эти же действия можно проделать соответствующим образом отредактировав конфигурационный файл контейнера /etc/pve/openvz/105.conf. Теперь можно запустить контейнер. В контейнере установим пакеты, которые нам могут потребоваться по зависимостям:
yum install binutils compat-db gcc gcc-c++ glibc glibc-common libstdc++ libstdc++-devel gnome-media-libs gnome-utils-libs make ksh sysstat libaio gnome-screensaver openmotif22 xorg-x11-twm xorg-x11-xinit xorg-x11-xauth usbutils urw-fonts shared-mime-info perl-libwww-perl perl-XML-Parser perl-URI perl-HTML-Tagset perl-HTML-Parser patch lvm2 intltool libIDL libart_lgpl libbonobo xterm libcap libcroco libgnomecanvas libexif libgnomecups libgnomeprint22 libsoup libwnck libxklavier unixODBC unixODBC-devel libaio-devel elfutils-libelf-devel compat-libstdc++-33 -y
Так-же может возникнуть необходимость установить rpm-пакет pdksh версии 5.2.14, но так как в репозитории установленного контейнера его нет то придётся его скачать из "сторонних" источников:
wget ftp://ftp.sunet.se/pub/Linux/distributions/redhat/redhat-archive/redhat/linux/6.1/en/os/i386/RedHat/RPMS/pdksh-5.2.14-1.i386.rpm
rpm -i pdksh-5.2.14-1.i386.rpm
Проверяем:
rpm -q pdksh
Добавляем группы и пользователей:
groupadd oinstall
groupadd dba
useradd -m -g oinstall -G dba oracle
usermod -s/bin/bash oracle
passwd oracle
Проверяем:
id oracle
uid=1000(oracle) gid=1000(oinstall) groups=1000(oinstall),1001(dba)
Добавляем необходимые лимиты в /etc/security/limits.conf:
oracle  soft nproc  2047
oracle  hard nproc  16384
oracle  soft nofile  1024
oracle  hard nofile  65536
Создаём директории для нашего Oracle:
mkdir /home/oracle/11gR2_db
mkdir -p /u01/app/oracle/product/11.2.0/db_1
mkdir /u01/app/oracle/oradata
mkdir /u01/app/oraInventory
chown -R oracle:oinstall /u01/app/oracle /home/oracle/11gR2_db
chown -R oracle:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oracle /home/oracle/11gR2_db /u01/app/oraInventory
 И, если не будет установлен libstdc++.so.5, можно создать символическую ссылку:
ls -l /usr/lib/libstdc++.so.5 || \
ln -s /usr/lib/libstdc++.so.6.0.13 /usr/lib/libstdc++.so.5
Отредактируем /etc/sysctl.conf на предмет следующих значений:
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=4194304
net.core.wmem_default=1048576
net.core.rmem_max=4194304
net.core.wmem_max=1048576
fs.aio-max-nr=1048576
и применим изменения:
sysctl -p
Вполне вероятно, что некоторые значения fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max и fs.aio-max-nr придётся установить не в контейнере, а на самом хосте управления. Будьте готовы к этому. Если вы не являетесь администратором хоста управления то помните, что "админ шоколадки не пьёт!".
На данным момент времени мы потратили достаточно усилий и проделали работу результаты которой не хотелось бы потерять если дальше что-то пойдёт не так. Поэтому останавливаем контейнер, создаём резервную копию и запускаем его снова чтобы двигаться дальше.
Скачиваем архивы с Oracle (в моём случае это linux_11gR2_database_1of2.zip и linux_11gR2_database_2of2.zip) и распаковываем их, подготавливаем окружение к последующей установке. Производим нижеследующие действия из под пользователя oracle:
cd ~oracle/11gR2_db
unzip linux_11gR2_database_1of2.zip
unzip linux_11gR2_database_2of2.zip
cd ~oracle/11gR2_db/database
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1/
export ORACLE_SID=ORA11G
 Если не установлена переменная окружения DISPLAY то попробуем сделать это самостоятельно:
export DISPLAY=localhost:0.0
"Кстати, о птичках". Наткнулся на "удивительный" баг когда при выставленном в sshd_config значении X11Forwarding yes, этот самый x11-форвардинг не работал.
Наткнулся на следующее "решение": в /etc/security/pam_env.conf определяем следующие строки:

REMOTEHOST      DEFAULT=localhost OVERRIDE=@{PAM_RHOST}
DISPLAY         DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
XAUTHORITY      DEFAULT= OVERRIDE=@{XAUTHORITY}
Но в моём случае это не помогло. Но зато помогла установка AddressFamily в значение inet в файле /etc/ssh/sshd_config. Пишут, что это известный баг. Вот только отчего-то очень не очевидный и мало кто приподнимает завесу тайны. Лично у меня ушел целый день на то чтобы совершенно случайно наткнутся на это решение и ву-а-ля X11Forwarding мгновенно заработал. 
И ещё, так как успешно-неудачных попыток при написании этого мануала было чуть менее чем более (и никто не сможет утверждать, что у него будет не так-же) то файлики с инсталяцией Oracle я предварительно скачал в /var/lib/vz, а затем, так как контейнеры находятся на том же разделе файловой системы, в момент когда это было необходимо, перед распаковкой, просто создавал жёсткие ссылки:

cd /var/lib/vz/private/105/home/oracle/11gR2_db
ln /var/lib/vz/linux_11gR2_database_1of2.zip linux_11gR2_database_1of2.zip
ln /var/lib/vz/linux_11gR2_database_2of2.zip linux_11gR2_database_2of2.zip
Достаточно быстро и достаточно удобно.
Ну так вот, теперь мы перед финишной прямой. Хорошей идеей будет создание очередной резервной копии.
Запускаем установку:
./runInstaller -ignoreSysPrereqs
После успешного окончания установки заходим root-ом и выполним следующие скрипты:
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/11.2.0/db_1/root.sh
Для успешного выполнения скрипта root.sh мне пришлось немного подредактировать 84-ю строку, заменив
$ECHO 6553600 > $FSMAXFILE
на
$ECHO 6553600
Добавляем в .bashrc учётной записи oracle следующие строки:
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_HOSTNAME=localhost
export ORACLE_UNQNAME=oracle
export ORACLE_SID=oracle
ORACLE_HOSTNAME и ORACLE_UNQNAME можно определить из имени OC4J_DBConsole_*:
ls -l $ORACLE_HOME/oc4j/j2ee| grep OC4J_DBConsole
drwxr-x---  6 oracle oinstall 4096 Май 26 12:36 OC4J_DBConsole

drwxr-x--- 10 oracle oinstall 4096 Май 26 12:49 OC4J_DBConsole_localhost_oracle
В файле /etc/oratab будут содержаться ссылки на базы, а также указания какие из них должны запускаться автоматически:
oracle:/u01/app/oracle/product/11.2.0/db_1:Y
Любители sqlplus могут попробовать выполнить следующую команду:
sqlplus / as sysdba
Всё это хорошо, но к сожалению установщик Oracle совсем забыл о том, что мы не просто хотим установить Oracle, но ещё и использовать его после каждой перезагрузки контейнера, а для этого нам нужен какой-никакой стартовый скрипт. Вот его нам придётся создать вручную, /etc/init.d/dbora:
#!/bin/sh -e

# chkconfig: 345 90 10
# description: Oracle 11G custom start/stop script

. /etc/rc.d/init.d/functions

LOCKFILE=/var/lock/subsys/oracle
DAEMON=oracle
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
ORACLE_OWNER=oracle

restart() {
    stop
    start
}

case $1 in
    'start')
        if [ -f $LOCKFILE ]; then
            echo $0 already running.
            exit 1
        fi
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/lsnrctl start"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/dbstart $ORACLE_HOME"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/emctl start dbconsole"
        #su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/isqlplusctl start"
        touch $LOCKFILE
    ;;
    'stop')
        if [ ! -f $LOCKFILE ]; then
            echo $0 already stopping.
            exit 1
        fi
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/lsnrctl stop"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/dbshut"
        su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/emctl stop dbconsole"
        #su - ${ORACLE_OWNER} -c "${ORACLE_HOME}/bin/isqlplusctl stop"
        rm -f $LOCKFILE
    ;;
    restart)
        restart
    ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit
    ;;
esac

exit $?
Далее:
chmod +x /etc/init.d/dbora
chkconfig --add dbora
chkconfig dbora on
reboot-им контейнер!
Теперь зайти в Oracle Enterprise Manager можно по ссылке https://oraclecontainerhost:1158/em, пользователь SYS, пароль тот, что вводился при установке, входить как SYSDBA.

Продолжение возможно будет следовать... ;)

вівторок, 21 травня 2013 р.

exim - проверка работоспособности

Проверяем какой маршрутизатор и доставщик будет использоваться:
exim -bt user_at_domain
Отправляем тестовое письмо:
exim -v -odf olden@isalon.kiev.ua
LOG: MAIN
  cwd=/home/user 4 args: exim -v -odf user_at_domain
test
.
LOG: MAIN
  <= user_at_domain U=user P=local S=325
LOG: MAIN
  cwd=/var/spool/exim4 5 args: /usr/sbin/exim4 -v -odi -Mc 1UeNoa-0002CX-ER
delivering 1UeNoa-0002CX-ER
LOG: MAIN
  => user  F= R=mysqluser T=mysql_delivery S=442
LOG: MAIN
  Completed
.

понеділок, 20 травня 2013 р.

Juniper - rollback compare и другие "дежурные" команды

Собственно эта статья и не статья, а так, заметка, памятка, с "дежурными" командочками, которые когда нужны то отчего-то постоянно вылетают из головы.

Сравнить две конфигурации, например текущую и предыдущую, можно так:
> show system rollback compare 1 0
JunOS хранить 50 последних "закоммиченых" конфигураций, включая текущую. Так что если сказать show system rollback compare 49 0 то можно получить очень большой diff ;)

Список доступных сохранённых конфигураций (коммитов) можно посмотреть так:
> show system commit

Посмотреть на каком маршрутизаторе в сети живёт тот или иной адрес, если в сети используется ibgp, можно так:
> show route table inet.0 1.2.3.4 extensive | match orig
При этом Originator ID: это и будет ip-адрес того маршрутизатора, который проанонсил сеть включающую искомый адрес.

Посмотреть текущую загрузку порта маршрутизатора, практически в реальном времени, можно так:
> monitor interface ge-1/0/0.3785
А обмен между портом маршрутизатора и портом клиента так:
> monitor traffic interface ge-1/0/0.3785
Однако следует заметить, что так можно посмотреть только локальный трафик. Трафик идущий транзитно таким образом не отслеживается.