FastNetMon

Saturday, 30 March 2013

Установка и использование Docker на Ubuntu 12.04

Что это и зачем? Грубо говоря, это способ запустить любой процесс в полностью изолированном от текущей машины окружении. Задать можно и объем диска и объем озу и потребление процессора. Файловая система контейнера создается из полностью чистого Ubuntu base (впрочем, это можно изменить).

Устанавливаем зависимости:
apt-get update
apt-get install -y lxc wget bsdtar curl
Стягиваем дистрибутив:
wget "http://get.docker.io/builds/$(uname -s)/$(uname -m)/docker-master.tgz"
tar -xf docker-master.tgz
cd docker-master
 Запускаем:
./docker run -i -t base /bin/bash

Далее нам вывалится следующее:

docker run -i -t base /bin/bash
Image base not found, trying to pull it from registry.
Pulling repository base
Pulling tag base:ubuntu-12.10
Pulling b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc metadata
Pulling b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc fs layer
Pulling 27cf784147099545 metadata
Pulling 27cf784147099545 fs layer
Pulling tag base:latest
Pulling tag base:ubuntu-quantl
Pulling tag base:ubuntu-quantal
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

Это означает, что более-менее все окей и мы работаем внутри контейнера:

ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18060  1956 ?        S    11:30   0:00 /bin/bash
root        13  0.0  0.0  15528  1132 ?        R    11:30   0:00 ps aux


Выход из него осуществляется по CTRL+D или exit.

Запускаем тестовое приложение, которое запускает шелл в отдельном контейнере и выдает результаты его работы на текущий шелл:
 ./docker run base /bin/echo hello world
2013/03/30 12:32:27 docker run base /bin/echo hello world
hello world


Thursday, 28 March 2013

Tuesday, 26 March 2013

Почему глава РЖД Владимир Якунин похож на Джеймса Таггарта?

Недавно прочел совершенно потрясащую книгу Айн Рэнд - Атлант Расправил Плечи, где был один весьма неприятный герой - Джеймс Таггарт, презедент ж/д компании. Так вот, недавно пролистывал новости и наткнулся на вот это, теперь просто нереально отделить товарища Якунина от его вымышленного альтер-эго, совпадение образов ну просто потрясающее! 

Monday, 25 March 2013

Почему cat file > file обнуляет файл, а не копирует файл?

Правильный (на мой взгляд) ответ найти было крайне сложно, но мне это удалось!

Суть в том, что в данном случае нам нужно открыть два файла - исходный (file) на чтение и целевой (file) на запись. Так как у нас используется одна угловая скобка, то мы должны занулить. В итоге получается, что сначала Bash открывает file на чтение (все ок), а потом открывает его на запись и тем самым обнуляет. Вот и все.

Источник: http://stackoverflow.com/questions/3055005/bash-is-it-ok-to-use-same-input-file-as-output-of-a-piped-command

Saturday, 23 March 2013

Почему PowerDNS 2.9.22 из Debian Squeeze 6 абсолютно не годен к продакшену

В нем используется ванильная 2.9.22 версия PowerDNS.

С момента ее выхода прошло много времени и в последующих релизах (в пределах 2.9.22 же) вышли следующие фиксы:

  1. Don't crash on communication error with pdns_control (commit 2015).
  2. Fix crashes in the BIND backend (commit 1693, commit 1692)

С банами номер 1 и 2 я столкнулся в чистом продакшене,  PowerDns вис без явных на то оснований при регулярном вызове pdn_control rediscover (вполне возможно, вис бы он и без этого).  

Вообще, лично я рекомендую использовать предлагаемый разработчиками PowerDNS .deb пакет с версией 3.2.

Friday, 22 March 2013

PowerDNS: Trying to insert non-zone data

Данная ошибка означает, что Вы патаетесь добавить в зону одного домена совершенно другой домен (например, в зоне yandex.ru пытаетесь создать запись google.com.). Эта фича имеется как в 2.9.22 версии, так и в апстрим 3.2.  Создал баг в тикетку PowerDNS, http://wiki.powerdns.com/trac/ticket/719, возможно такое поведение исправят.

Thursday, 21 March 2013

Софт для организации вебинаров - Cisco WebEx Meeting Center

Послушал сейчас вебинар на нем - вполне приятное решение, даже на Mac OS X завелось сходу.

Wednesday, 20 March 2013

Почему конференция FAILOVER CONFERENCE полное говно?

Я вот часто встречаю приглшения на странные конференции, одни просто ни о чем, другие - просто мне не интересны (ну не мой профиль). А вот эта конференция - до мозга костей мой профиль (мой блог поэтому и зовется так).

Failover - подразумевает серьезную техническую составляющую. Верно? По-моему, бесспорно, очевидная вещь.

Но что же я вижу в докладчиках и докладах?

Итак, докладчики: http://www.failoverconf.ru/conf2013/agenda/speakers_list/, доклады: http://www.failoverconf.ru/conf2013/agenda/reports/

Тут мне сложно говорить цензурно (честно!), ибо Битрикс и отказоустойчивость. Ребята, вы что курите, а? Давайте еще доклад - Битрис и "быстарая работа", "битрикс и беспроблемная настройка и установка", "как запустить Битрикс на ОЧЕНЬ слабом VPS с 8 гб памяти после трех дней оптимизации".

Ок, хрен с ним с Битриксом. Но кого я вижу в докладчиках? Менеджеры, исполнительные директора и вообще не понятно кто. Черт подери, где суперкрутые админы с бородой, которые могут под пиво настроить кластер с лоад балансингом и фейлавером? Ах, да, а на десерт - пяток никому не известных контор (ну а если они неизвестны, то какая там может быть нагрузка?).

А из приятного - я бы с радостью послушал лишь Константина Осипова, он отличный специалист по MySQL и вполне неплохо выступает.

Друзья, а какие хорошие (технические! с тру админами и программерами!) конференции можете порекомендовать Вы?

Tuesday, 19 March 2013

How to format mounted filesystem? VERY DANGER!

Are you knew about FULL DATA LOSS in this operation? Sure? Okay, we can proceed.

If you are certainly read mkfs.ext4 manual page (man mkfs.ext4), you can read this:
In order to force mke2fs to create a filesystem even if the filesystem appears to be in use or is mounted (a truly dangerous thing to do), this option must be specified twice.
It's fine, try it:
mkfs.ext4 -F -F /dev/XXX
Oops:
mke2fs 1.41.12 (17-May-2010)
/dev/ploop56106p1 is mounted; will not make a filesystem here! 
There are bug (?) in man page, I'm discovered source code and found it (Debian 6, e2fsprogs, misc/util.c):

       if (mount_flags & EXT2_MF_BUSY) {
                fprintf(stderr, _("%s is apparently in use by the system; "),
                        device);
                if (force > 2) {
                        fputs(_("mke2fs forced anyway.\n"), stderr);
                        return;
                }
                goto abort_mke2fs;
        }
Yeppp! We are need specify -F option triple times! -F -F -F


mke2fs 1.41.12 (17-May-2010)
/dev/ploop56106p1 is mounted; mke2fs forced anyway.  Hope /etc/mtab is incorrect.
fs_types for mke2fs.conf resolution: 'ext4', 'default'
/dev/ploop56106p1: Device or resource busy while setting up superblock

Установка node.js на Debian Squeeze

Так как в Debian Squeeze нет пакета для node.js вообще, а версия node.js даже в sid лишь 0.6 (при последней 0.10) придется прибегнуть к сборке вручную

Собирается он тривиально:
apt-get install python g++ make
cd /usr/src
mkdir node_js
cd $_
wget http://nodejs.org/dist/node-latest.tar.gz
tar -xf node-latest.tar.gz
cd node-v*
./configure --prefix=/opt/nodejs
make
make install


Для теста давайте напишем простейший веб-сервер в файле example.js:

var http = require('http');
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
Запускаем:

/opt/nodejs/bin/node example.js
Server running at http://127.0.0.1:8124/
Все, теперь открываем в браузере данный адрес на 8124м порту и убеждаемся, что все работает:
curl http://stat.fastvps.ru:8124
Hello World
Чтобы данная инструкция была полной, стоит поговорить о менеджере пакетов node.js - npm. Он визуально очень хорошо работает и даже сам разрешает зависимости (огромный плюс!).

Попробуем установить пакет для пинга узлов:
/opt/nodejs/bin/npm install net-ping 

Тестируем ping.js:

var ping = require ("net-ping");
var session = ping.createSession ();
session.pingHost ("google.com", function (error, target) {
    if (error)
        console.log (target + ": " + error.toString ());
    else
        console.log (target + ": Alive");
});

Вуаля:

/opt/nodejs/bin/node  ping.js
8.8.8.8: Alive
Единственное, что странно -  npm сохраняет свои библиотеки  папке текущего юзера и при попытке запустить их не находясь в ней выдает ошибку. Как с этим бороться - рассмаотрим в следующих статьях;


Установка Xen Addition Tools на Clear OS 6.3

Изначально выдается вот такая ошибка:

./install.sh
Fatal Error: Failed to determine Linux distribution and version.
 Но ее можно победить явно указав, что у нас Red Hat (RHEL):

./install.sh  -d rhel -m 6
Distribution `rhel' version `6' given on command line.
The following changes will be made to this Virtual Machine:
  * update arp_notify sysctl.conf.
  * packages to be installed/upgraded:
    - xe-guest-utilities-6.1.0-1033.x86_64.rpm
    - xe-guest-utilities-xenstore-6.1.0-1033.x86_64.rpm
Continue? [y/n] y
Подготовка...     ########################################### [100%]
   1:xe-guest-utilities-xens########################################### [ 50%]
   2:xe-guest-utilities     ########################################### [100%]
You should now reboot this Virtual Machine.
После этого все заработает.

Monday, 18 March 2013

Что делает /sbin/reboot в Debian 6 Squeeze?

Начнем с того, что /sbin/reboot - это симлинк на /sbin/halt.
А далее код крайне прост, когда halt вызван как reboot включается вот такая переменная:
if (!strcmp(progname, "reboot")) do_reboot = 1;
А чуть ниже вот такой код:
      if (do_reboot) {
                init_reboot(BMAGIC_REBOOT); 
Предифайн у нас означет следующее:

#define BMAGIC_REBOOT           RB_AUTOBOOT


Далее в src/reboot.h:
#define init_reboot(magic)      reboot(magic)
 А reboot - это уже системный вызов Linux (man 2 reboot).

В описании системного вызова на случай RB_AUTOBOOT имеется следующее:

LINUX_REBOOT_CMD_RESTART (RB_AUTOBOOT,  0x1234567).   The message "Restarting system." is printed, and a default restart is performed immediately.  If not preceded by a sync(2), data will be lost.
А вот как работает reboot - дело отдельной статьи.

Данная заметка попытка понять - ограничивается ли reboot посылкой сигнала init процессу или он несколько более сложен.

Как задать число inodes для файловой системы ext4/ploop/openvz вручную?

Код ploop (версия ploop 1.6) создает файловую систему следюущим образом:

int make_fs(const char *device, const char *fstype)
{
       char part_device[64];
       char *argv[8];
       if (get_partition_device_name(device, part_device, sizeof(part_device)))
               return SYSEXIT_MKFS;
       argv[0] = "/sbin/mkfs";
       argv[1] = "-t";
       argv[2] = (char*)fstype;
       argv[3] = "-j";
       argv[4] = "-b4096";
       argv[5] = part_device;
       argv[6] = NULL;
       if (run_prg(argv))
               return SYSEXIT_MKFS;
       argv[0] = "/sbin/tune2fs";
       argv[1] =  "-ouser_xattr,acl";
       argv[2] = part_device;
       argv[3] = NULL;
       if (run_prg(argv))
               return SYSEXIT_MKFS;
       return 0;
}
Легко можно понять, что передать параметр сюда нельзя, также как и сам ploop не управляет числом inodes в создаваемой фс.

Но у mkfs.ext4 есть флаг -i, которым можно задать число inodes в целовой файловой системе явно:
-N number-of-inodes  Overrides the default calculation of the number of inodes that should be reserved for the  filesystem  (which  is  based  on  the  number of blocks and the bytes-per-inode ratio).  This allows the user to specify the number of desired inodes directly.

Таким образом, внеся легкий патч в код ploop, можно подхачить систему и создать фс с нужным числом inodes без поломки openvz :)

Thursday, 14 March 2013

netconsole Debian Squeeze initialization scripts

All scripts moved to GitHub: https://github.com/vps2fast/debian_netconsole

I'm providing open source script for managing netconsole module on Debian Squeeze for you! :)

Features:

  1. Autoconfigure mac address in routed network (automatically use gateway address mac or you can manually set destination server mac address)
  2. Script is very simple to configure 


You can install it manually:

apt-get install -y arping
cd /usr/src
wget https://fastvps.googlecode.com/svn/trunk/scripts/netconsole/netconsole_conf -O/etc/default/netconsole --no-check-certificate
wget https://fastvps.googlecode.com/svn/trunk/scripts/netconsole/netconsole -O/etc/init.d/netconsole --no-check-certificate
chmod +x /etc/init.d/netconsole

Now you need configure script:
nano /etc/default/netconsole
You need enable script autoload on startup:
ENABLE_NETCONSOLE="yes"

Also you need set DESTINATION_SERVER_IP.

Okay,  show must go on! Startup netconsole!
insserv netconsole
/etc/init.d/netconsole start

Tuesday, 12 March 2013

Установка mod_adobe_crossdomainpolicy.c на Debian 6

Устаналивать будем на Apache Worker.
cd /usr/src
mkdir adobe
cd adobe
wget http://www.beamartyr.net/projects/mod_adobe_crossdomainpolicy.c
# for apache worker
apt-get install -y libapr1-dev apache2-threaded-dev
apxs2 -cia mod_adobe_crossdomainpolicy.c


После этого в системе будет создан файл для загрузки модуля:
cat /etc/apache2/mods-available/adobe_crossdomainpolicy.load
LoadModule adobe_crossdomainpolicy_module /usr/lib/apache2/modules/mod_adobe_crossdomainpolicy.so
vim /etc/apache2/conf.d/adobe_crossdomain.conf

А содержимое, пожалуйста, возьмите по адресу (угловые скобки в Блоггере - это просто ад!): http://www.beamartyr.net/articles/adobepolicyfileserver.html)

 
Чтобы проверить, что все подцепилось воспользуйтесь командой с первоисточника.

Также я рекомендую в случае большого числа сообщений вида:
[Fri Mar 15 14:29:31 2013] [warn] [client 195.114.240.32] Invalid request: UERY_STRING}&area=memberIspViewer [L] (0 bytes) 

В логе сделать патч:

-ap_log_cerror(APLOG_MARK, APLOG_WARNING, 0,c, "Invalid request: %s (%d bytes)", data, size);
+ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0,c, "Invalid request: %s (%d bytes)", data, size);


Источник: http://www.beamartyr.net/articles/adobepolicyfileserver.html


Sunday, 10 March 2013

Как перекрыть встроенную bash команду на бинарик?

Итак, используем bash и Debian 6.

Пробуем заменить встроенную команду cd на нечто свое:

type cd
cd is a shell builtin

Создаем файлик /usr/bin/cd
#!/bin/bash
echo "replace you ls"

Выдаем ему exec флаг:
chmod +x /usr/bin/cd 
Но даже после этого вызывается встроенная cd.

Хотя bash видит обе версии:

type -a cd
cd is a shell builtin
cd is /usr/bin/cd

Обходников два: alias cd=/usr/bin/cd или вызов прямым путем: /usr/bin/cd
Note: some shells (e.g., bash(1)) have a built-in time command that provides less functionality than the command described here. To access the real command, you may need to specify its pathname (something like /usr/bin/time).
Источник: man time.


Wednesday, 6 March 2013

Установка munin на CentOS 5

Все предельно просто:
yum install -y munin
/etc/init.d/munin-node start
su munin -s /bin/bash
/usr/bin/munin-cron
После этого открываем веб-браузер на сайте: http://your-host.ru/munin. 

Выключить исполнение CRON задач в WordPress

У вордпресса есть ужасающая фича, если в нем включен автокрон, то он будет на каждое 10-20е  дергание страницы дергать по вебу страницу http://sitename/wp-cron.php и тем самым может затормаживать сайт НУ ОЧЕНЬ сильно.

Как победить? Вносим в wp-config.php:
define('DISABLE_WP_CRON', 'true');
А в обычном кроне на хостинге настраиваем дергание: cd /.../public_html; php -q wp-cron.php каждые 3 часа. 

Tuesday, 5 March 2013

Системы для управления множеством серверов

В умных книжках и блога это зовется "orchestration", но мне термин крайне не нравится :)

Таких систем довольно много - MCollective, Func (очень странный проект внутри проекта Fedora, много питона и мало понятной документации), Fabric (подразумевает использование мини-программ на Питоне, по этой причине не подходит), Capistrano (работает поверх ssh, по этой причине не подходит совершенно), а также куча parallel-ssh программ.

Буду рад, если кто еще подкинет подобное ПО!

Фикс бага Interrupted system call: FastCGI: comm with server "xxx" aborted: select() failed

update: самый простой и грамотный способ исправить баг - обновитесь на Debian Wheezy.

Платформа: Debian 6 Squeeze, mod_fastcgi (не mod_fcgid!!!), PHP 5.3.

С такой неприятной ошибкой можно весьма легко столкнуься на заданной платформе:

[Tue Mar 05 10:48:37 2013] [error] [client xx.xx.xx.xx] (4)Interrupted system call: FastCGI: comm with server "/var/www/fcgi/xxxx" aborted: select() failed


Бороться ней программной/настройками, к сожалению, невозможно - это баг в ПО, который исправляется исключительно обновлением. Но в Дебияне (даже в sid) нет обновленной версии и ее нужно собрать самостоятельно.

Быстрое решение

Итак, короткое решение - если Вам нужно починить прямо сейчас и Вы доверяете мне сборку бинарного пакета:
wget https://fastvps.googlecode.com/svn/trunk/patches/mod_fastcgi/libapache2-mod-fastcgi_2.4.6-1_amd64.debsudo dpkg -i libapache2-mod-fastcgi_2.4.6-1_amd64.deb
# Блокируем обновления пакета вообще, иначе при обновлении системы встанет бажная версия
echo "libapache2-mod-fastcgi hold" | dpkg --set-selections
Качественное решение

Этот вариант стоит выбрать в случае, если Вы не доверяете мне сборку бинарного пакета, но доверяете моему патчу и сами его наложите.

Используя собранный мною патч, собрать свой пакет вручную можно так:
cd /usr/src
# депенденси для сборки:
apt-get install -y dpkg-dev devscripts build-essential fakeroot
apt-get build-dep libapache2-mod-fastcgi
apt-get source libapache2-mod-fastcgi
cd libapache-mod-fastcgi-2.4.6/debian/patches
wget https://fastvps.googlecode.com/svn/trunk/patches/mod_fastcgi/upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.dpatch
echo "upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.dpatch" >  00list
cd ..
cd ..
debuild -us -uc
Решение для тех, кто хочет знать все

Наибольшее число информации по сабжевой проблеме Вы можете почерпнуть по адресу баг-трекера Дебияна. Официальный сайт модуля mod_fastcgi живет вот здесь. Вот альтернативные версии патча: http://article.gmane.org/gmane.comp.web.fastcgi.devel/2514

Сиутация такова, что системный вызов select в Linux нередко выдает код ошибки EAGAIN, при котором клиенсткая программа должна повторить попытку подключения, чтобы получить данные, баг mod_fastcgi в том, что он так не делает. Вариантов фикса два - сторонние патчи (я нашел 2-3 версии в сети) либо установка снапшота 2.7 версии mod_fastcgi (еще не вышедшей, но визуально не имеющей никаких проблем со стабильностью). Я выбрал второй вариант.

Итак, нам нужно сделать патч-обновление (между версией 2.6 и версией 2.7-SNAPSHOT-0910052141), которым пропатчить стандартный пакет в Дебияне. Вот мои итоговые патчи: https://code.google.com/p/fastvps/source/browse/trunk/patches/mod_fastcgi/upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.patch https://code.google.com/p/fastvps/source/browse/trunk/patches/mod_fastcgi/upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.dpatch


Сборка патча

Стягиваем Дебияновское дерево исходных кодов и то, что есть в снапшоте, чтобы собрать патч.

cd /usr/src# депенденси для сборки:apt-get install -y dpkg-dev devscripts build-essential fakerootapt-get build-dep libapache2-mod-fastcgiapt-get source libapache2-mod-fastcgicd /usr/srcmkdir origian_sources_mod_fastcgi_snapcd origian_sources_mod_fastcgi_snapwget http://www.fastcgi.com/dist/mod_fastcgi-SNAP-0910052141.tar.gztar -xf mod_fastcgi-SNAP-0910052141.tar.gz cd mod_fastcgi-SNAP-0910052141

Собираем патч между версиями:

diff -x 'debian' -rupN  /usr/src/libapache-mod-fastcgi-2.4.6 /usr/src/origian_sources_mod_fastcgi_snap/mod_fastcgi-SNAP-0910052141 > /tmp/upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.patch

Папка дебиян исключена специально, так как там все неактуальное.

Идем в папку пакета:

cd /usr/src/libapache-mod-fastcgi-2.4.6/
dpatch-edit-patch upgrade_mod_fastcgi_to_snap_2_4_7_0910052141
patch -p4 < /tmp/upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.patch
#Выходим из шелла:
exit

В итоге в папочке debian/patches будет созданн аккуратный патчик:
/usr/src/libapache-mod-fastcgi-2.4.6/debian/patches/upgrade_mod_fastcgi_to_snap_2_4_7_0910052141.dpatch

Все, теперь используя этот патч собираем полный пакет (мануал чуточку выше).

Отдельное спасибо блогу http://blog.mathieu-leplatre.info/apply-debian-patches-step-by-step.html за понятное руководство по работе с dpatch.

Как запустить бинарный time вместо bash функции?


Обычный bash:
root@stat:~# echo $SHELL
/bin/bash
Встроенная функция:
root@stat:~# time id
uid=0(root) gid=0(root) groups=0(root)
Бинарное приложение:
real 0m0.001s
user 0m0.000s
sys 0m0.001s
root@stat:~# \time id
uid=0(root) gid=0(root) groups=0(root)
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3760maxresident)k
0inputs+0outputs (0major+297minor)pagefaults 0swaps

Пример идеального технического мануала связанного с ядром Linux

Это просто шикарно: http://blog.dubbelboer.com/2012/04/09/syn-cookies.html