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