FastNetMon

Thursday, 12 February 2015

Установка htop на FreeBSD 10

Стандартный top на FreeBSD очень не интуитивен, поэтому воткнем же htop!

Итак, ставим:
pkg install htop

Активируем модули эмуляции Linux:
echo 'linux_load="YES"' >> /boot/loader.conf
echo 'linux_enable="YES"' >> /etc/rc.conf

Добавляем монтирование Linux proc fs в /etc/fstab:
linproc         /compat/linux/proc      linprocfs         rw 0 0

После этого перезагружаемся либо делаем:
mount linproc
И наслаждаемся видом htop!

Wednesday, 28 January 2015

Система фиксации входящих и исходящих DDoS атак с поддрежкой sFLOW v5/NetFlov v5/v9 и mirror-портов - FastNetMon

Друзья! Кто заинтересовался заголовком прошу на GitHub, попробовать новую версию FastNetMon, где добавлена поддержка NetFlow, что позволяет фиксировать атаки на любой имеющейся инфраструктуре с минимальными телодвижениям: https://github.com/FastVPSEestiOu/fastnetmon :)

Wednesday, 21 January 2015

Новое слово в хранении данных - BLOCK-RAID

Я довольно давно вынашивал эту идею и довольно странно, что она никем еще не реализована.

Как многие знают, при очень большом числе дисков в массиве - 12/24/48 или даже 96 стандартные режимы работы RAID (к ним я отношу 0/1/10/5/6) уже категорически неприменимы, ибо даже самый надежный RAID-6 дает совершенно неадекватные цифры по уровню надежности.

Разумеется, можно использовать совмещенные режимы, когда, например, RAID-0 собирается поверх нескольких RAID-6. Это немного улучшает ситуацию, но для кейсов 48/96 дисков по-прежнему не особо приятно себя ведет.

Кроме этого, очень мало реальных данных, которые будут эффективно разбросаны по 24м дискам (кейс RAID-6). Какой объем нужно записывать в среднем, чтобы он был разбросан по аж 24м дискам? Нереальный, согласитесь. А если писать на каждый диск по байту - тоже получится весьма и весьма печальная ситуация.

Кроме этого, редкий RAID даст собрать, скажем, 24х дисковый RAID-10 (тот же LSI ограничен 16ю дисками).

Намного более хорошая ситуация у нас с ZFS. Там есть режимы RAIDZ-1/2/3 которые в свою очередь являются аналогами RAID-5 (выдерживает отказ 1го диска) / RAID-6 (выдерживает отказ 2х дисков), а RAID-Z3 аналогов вовсе не имеет! Зато переживает отказ аж 3х любых дисков в массиве!

Но даже ZFS в чистом при большом числе дисков не панацея. Но если сделать, скажем ZFS stripe поверх десятка RAID-Z3, то можно достигнуть очень крутого уровня надежности и емкости!

Но если речь идет о хранении очень больших файлов, то самый гибкий вариант, который приходит в голову - это разбить файл на блоки и разбросать по N (2 и более) разным логическим устройствам!
Таким образом, мы сможем читать файл параллельно из двух мест (например, осуществляя выборку четных/нечетных блоков с разных дисков), но при записи придется писать на два устройства, что может привести к задержкам, так как скорость записи будет ограничена скоростью дисковых устройств.

Такой режим распределения данных используется в распределенном хранилище-mapdreduce кластере HADOOP (а также его реализации HDFS).

Но с учетом увеличения объемов локальных стораджей он вполне может быть использован и на локальных машинах и весьма успешно.

Конечно, такой режим приводит к 2-3х кратной потере места, но дает очень высокий уровень гибкости и полной независимости от числа дисков в массиве.

Но стоит отметить, что для случая механических дисков все не так очевидно - этот вариант будет точно очень плох для SATA и даже SAS. Но вот для SSD, когда скорости одного диска хватает почти любому приложению (а вот надежности - нет), будет просто идеален.

Стоит отметить, что такой режим можно легко реализовать с помощью Linux Device Mapper или же того же ZFS, с помощью использования опции copies:
copies=1 | 2 | 3
Controls the number of copies of data stored for this dataset. These copies are in addition to any redundancy provided by the pool, for example, mirroring or RAID-Z. The copies are stored on different disks, if possible. The space used by multiple copies is charged to the associated file and dataset, changing the used property and counting against quotas and reservations. Changing this property only affects newly-written data. Therefore, set this property at file system creation time by using the -o copies=N option.
Разве что стоит обратить внимание, что ZFS не умеет "жесткой" гарантии на размещение таких данных на разных дисках. Она лишь пытается, но не гарантирует.

Также стоит отметить потрясающий уровень гибкости такого решения.
  1. Мы можем на лету добавлять диски, сколько угодно и никакого полного копирования данных.
  2. Мы можем свободно удалять диск из системы не заменяя его ни на что при наличии свободного места на другом массиве - все данные перетекут на свободное место
  3. Мы можем собирать массивы из разных по скорости дисков и при выделении нового volume указывать, что "разместить на пуле с SSD".
  4. Мы можем постоянно двигать блоки с диска на диск (например, как раз в случае потребности в более высокой скорости). Причем, это может осуществляться динамически (сама система переносит их на более быстрый сторадж)!
  5.  При таком подходе даже теряя 3+ дисков, на которых размещен раздел мы теряем лишь  разделы, размещенные лишь на этом диске! Но других разделов это не касается!
Пункт 5 на самом деле очень и очень важный потому что в классических RAID (что программных, что аппаратных) потеря дисков больше чем допустима для соотвествующего уровня RAID - фатальна, а для BLOCK RAID - это можно пережить - повредятся лишь затронутые данные! Это крайне актуально особенно в случае хранения нескольких тысяч терабайт данных. Безусловно, потеря 1/100 этих данных будет крайне неприятна, но это в миллион раз менее неприятно и фатально, чем потеря ВСЕГО массива!

Добрые люди подсказали, что по похожей схеме устроен Google File System: https://ru.wikipedia.org/wiki/Google_File_System

ZFS on Linux боевые тесты на бажном железе!

В контексте моей повальной увлеченности ZFS последние лет 7 решил поднять его на Linux да не просто поднять - а выбрать самую бажную машину из парка и поставить на ней.

Насколько бажна эта машина и диски на ней? За последний год на ней диски менялись 12 раз! 2 раза менялся контроллер и 2 раза полностью пересоздавалась фс (ext4 поверх LSI/RAID-10) в связи с тотальным повреждением. 

Итак, после недели работы и активной записи перезаписи ZFS-таки перешел в состояние DEGRADED!

И порадовал меня 23 тыщами ошибок записи на /dev/sdd:
zpool status
  pool: data
 state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
    repaired.
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    data        DEGRADED     0     0     0
      mirror-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
      mirror-1  DEGRADED     0     0     0
        sdd     FAULTED      3 23.0K     0  too many errors
        sde     ONLINE       0     0     0
      mirror-2  ONLINE       0     0     0
        sdf     ONLINE       0     0     0
        sdg     ONLINE       0     0     0
При этом в dmesg творился настоящий ад!
[919595.775408] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.775492] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 07 67 c7 40 00 00 08 00
[919595.775551] end_request: I/O error, dev sdd, sector 124241728
[919595.775622] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.775698] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 08 59 39 50 00 00 08 00
[919595.775756] end_request: I/O error, dev sdd, sector 140065104
[919595.775808] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.775884] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 09 15 92 b8 00 00 08 00
[919595.775940] end_request: I/O error, dev sdd, sector 152408760
[919595.775987] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.776061] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 09 24 1c 40 00 00 08 00
[919595.776118] end_request: I/O error, dev sdd, sector 153361472
[919595.776165] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.776240] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 08 56 f5 00 00 00 08 00
[919595.776297] end_request: I/O error, dev sdd, sector 139916544
[919595.776349] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.776424] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 06 40 4a 30 00 00 08 00
[919595.776481] end_request: I/O error, dev sdd, sector 104876592
[919595.776529] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.776605] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 02 7f ef 10 00 00 08 00
[919595.776662] end_request: I/O error, dev sdd, sector 41938704
[919595.776709] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.776783] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 09 3e 8d 98 00 00 08 00
[919595.776841] end_request: I/O error, dev sdd, sector 155094424
[919595.776889] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.776965] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 09 8a 21 a8 00 00 08 00
[919595.777021] end_request: I/O error, dev sdd, sector 160047528
[919595.777070] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919595.777145] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 08 86 97 80 00 00 08 00
[919595.777202] end_request: I/O error, dev sdd, sector 143038336
[919596.519092] megaraid_sas: scanning for scsi0...
[919610.884574] __ratelimit: 94 callbacks suppressed
[919610.884625] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919610.884691] sd 0:2:3:0: [sdd] CDB: Read(10): 28 00 00 00 0a 10 00 00 10 00
[919610.884741] __ratelimit: 94 callbacks suppressed
[919610.884776] end_request: I/O error, dev sdd, sector 2576
[919610.884821] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919610.884887] sd 0:2:3:0: [sdd] CDB: Read(16): 88 00 00 00 00 01 5d 3f b4 10 00 00 00 10 00 00
[919610.884969] end_request: I/O error, dev sdd, sector 5859423248
[919610.885009] sd 0:2:3:0: [sdd]  Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[919610.885075] sd 0:2:3:0: [sdd] CDB: Read(16): 88 00 00 00 00 01 5d 3f b6 10 00 00 00 10 00 00
[919610.885155] end_request: I/O error, dev sdd, sector 5859423760
После этого выполняем замену сбойного диска и ждем ресилверинга :)

Для чистоты эксперимента нагрузка (тесты) с машины не снимается:
 zpool status
  pool: data
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
    continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Wed Jan 21 15:04:27 2015
    7.78G scanned out of 2.36T at 9.38M/s, 73h4m to go
    2.60G resilvered, 0.32% done
config:

    NAME             STATE     READ WRITE CKSUM
    data             DEGRADED     0     0     0
      mirror-0       ONLINE       0     0     0
        sdb          ONLINE       0     0     0
        sdc          ONLINE       0     0     0
      mirror-1       DEGRADED     0     0     0
        replacing-0  FAULTED      0     0     0
          sdd        FAULTED      3 23.0K     0  too many errors
          sdh        ONLINE       0     0     0  (resilvering)
        sde          ONLINE       0     0     0
      mirror-2       ONLINE       0     0     0
        sdf          ONLINE       0     0     0
        sdg          ONLINE       0     0     0

errors: No known data errors

Tuesday, 20 January 2015

Создание Linux Kdump поверх bonding

Настраиваем kdump как обычно, но добавялем в него опцию в файле /etc/kdump.conf:
options bonding mode=1 
Соответственно, режим бондинга меняете на свой!

Sunday, 11 January 2015

Анализ блочной фрагментации на ploop дисках OpenVZ

Всем привет, друзья!

Нарисовал простенький (по этой причине - довольно медленный) анализатор места внутри ploop диска потерянного на "slick" (не занятые полностью куски блоков):
https://gist.github.com/pavel-odintsov/d5c37316e538908e0f01

Если у Вас на весьма крупных дисках будут большие цифры фрагментации - стоит задуматься о том, чтобы уменьшить размер блока ploop. К сожалению, пока силами vzctl этого не сделать, но можно сделать силами ploop и вручную пересоздать диск контейнера им.

Monday, 29 December 2014

Профайлинг Perl приложений

Всем привет! Сегодня мы будем профайлить Perl приложения и искать в них узкие места!

Итак, я веду эксперименты над своей новой утилиткой - linux_network_activity_tracker.pl, которая на машинах с десятками тысяч процессов работает довольно медленно.

Итак, запускаем профайлинг:
perl -d:DProf linux_network_activity_tracker.pl
После того, как он отработал нам нужно запустить обработчик полученных данных:
dprofpp
В итоге нам будет сгенерирована удобная и доступная для понимания табличка:
Total Elapsed Time = 78.18037 Seconds
  User+System Time = 57.55037 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 57.1   32.89 32.893  26894   0.0012 0.0012  Antidoto::get_process_connections
 30.0   17.30 17.620    342   0.0506 0.0515  Antidoto::parse_tcp_connections
 6.52   3.750  3.750    342   0.0110 0.0110  Antidoto::parse_unix_connections
 1.00   0.576  1.019   6986   0.0001 0.0001  Antidoto::get_proc_status
 0.98   0.563  0.563   7328   0.0001 0.0001  Antidoto::read_file_contents_to_li
                                             st
 0.56   0.323  0.323 136504   0.0000 0.0000  Antidoto::_hex2ip
 0.28   0.160  0.160    342   0.0005 0.0005  Antidoto::build_inode_to_socket_lo
                                             okup_table
 0.13   0.073  1.092    342   0.0002 0.0032  Antidoto::get_init_pid_for_contain
                                             er
 0.05   0.028  0.037    342   0.0001 0.0001  Antidoto::parse_udp_connections
 0.02   0.010  0.010      4   0.0025 0.0025  main::BEGIN
 0.00       - -0.000      1        -      -  DynaLoader::dl_load_file
 0.00       - -0.000      1        -      -  DynaLoader::dl_undef_symbols
 0.00       - -0.000      1        -      -  DynaLoader::dl_find_symbol
 0.00       - -0.000      1        -      -  DynaLoader::dl_install_xsub
 0.00       - -0.000      1        -      -  Digest::MD5::bootstrap
По которой отлично видно, кто пожрал время CPU :)

Wednesday, 24 December 2014

Как работает механизм SYN Cookie в ядре Linux?

Всем привет! 

Итак, давайте определимся, чем же опасен для нас SYN флуд? Он опасен в первую очередь тем, что вынуждает сервер создавать тысячи и миллионы записей в системных таблицах/хэшах трекинга соединений.  Это вызывает две проблемы - замедление обработки и возможность упереться в лимит размера соотвествующей таблицы соединений. В этом случае самый очевидны способ спастись - не сохранять информацию о каждом пришедшем соединении.

Именно это и делает SYN cookie. В ответ на клиентский SYN пакет мы НЕ сохраняем никакой информации о соединении, а пакуем ее в ответный SYN+ACK пакет и отправляем клиенту. И лишь в случае, когда клиент ответит нам своим ACK передав эту информацию - мы ее проверим, распакуем информацию содержащуюся в нем и создадим запись о таком соединении и откроем обмен данными.

Уверен, многие в своей ежедневной практике используют  механизм  syn cookie, который позволяет решать проблемы с syn флудом.

Как известно, эта фича включается так:
sysctl -w net.ipv4.tcp_syncookies = 1
Но когда именно они включаются? Как работают? Всегда ли это панацея? На эти вопросы я постараюсь ответить ниже.

Вся обработка входящего tcp соединения начинается в файле net/ipv4/tcp_input.c в функции tcp_conn_request. Там сразу после приема пакета осуществляется следующая проверка:
if ((sysctl_tcp_syncookies == 2 || inet_csk_reqsk_queue_is_full(sk)) && !isn) {      want_cookie = tcp_syn_flood_action(sk, skb, rsk_ops->slab_name); }
Дословно она означает, что syn cookie включаются (не посылаются! А просто включаются!) если параметр sysctl -w net.ipv4.tcp_syncookies = 2 либо когда переполнится syn очередь для сокета (а она в свою очередь задается через параметр net.ipv4.tcp_max_syn_backlog = 2048).

Уже сейчас можно понять, что 2048 - это очень много и почти любое приложение после получения такого числа запросов на подключение погибнет. При этом syn cookie включенные в режиме "1" еще даже не включатся!

Чуточку дальше в том же файле tcp_input.c осуществляется проверка - а не переполнена ли очередь ожидания на слушающем (listen) сокете, она в свою очередь задается на уровне приложения, через второй аргумент системного вызова listen. И если она полна - то соединение просто отбрасывается, безотносительно режиму syn cookie вообще! Система предполагает, что приложение не может больше отработать и в принципе не принимает трафик. На этом обработка кончается. Если же очередь не забита - мы движемся дальше.

Обращаю внимание! Что syn cookie еще НЕ был отправлен! Даже если он был включен на какой-то из предыдущих проверок.

Теперь мы вызываем функцию cookie_init_sequence, которая в свою очередь дергает cookie_v4_init_sequence, которая объявлена в net/ipv4/syncookies.c. И там параметры входящего соединения хэшируются с помощью хэш функции sha1 (secure_tcp_syn_cookie). В свою очередь, стоит обратить внимание, что sha1 - это довольно тяжелая функция для процессора и довольно серьезный Intel E5 2620 может хэшировать не более 400 мегабайт/секунду в расчете на 1 ядро. Постойте пугаться! Не съедят syn cookie Ваш процессор, даже довольно слабый 2620 может обработать до 32Gb/s чисто на хэшировании, это огромные цифры, так что нагрузки на процессор пугаться не стоит - я просто привел информацию о том, что это не бесплатная операция.

И после того как эта cookie сформирована, мы посылаем ее клиенту. Как можно заметить - режим "2" работы syn cookie на сервере, где ожидаются атаки - предпочтительнее. Но стоит понимать, что syn cookie - это хак, который не особо согласуется с протоколом tcp и бывает, что он приводит к неработоспособности ряда фич, поэтому использовать его нужно лишь после тщательных тестов. Но при этом такой подход все равно  не защищает приложения должным образом.

Как хорошее и надежное решение данной проблемы стоит использовать iptables/netfilter цель SYN PROXY, которая блокирует  syn флуд раньше, чем они пойдет в обработку ядром (на этапе фильтрации через netfilter). Но тут стоит отметить, что данный функционал был добавлен в 3.12 ядре и присутствует только в RHEL/CentOS 7, в более младших версиях дистрибутивов такой возможности нету и вряд ли появится.

Но я бы хотел добавить, что syn cookie должны быть ВКЛЮЧЕНЫ в обязательном порядке. Вообще без них Linux упадет от самой слабой атаки syn флудом.

В чем же отличия 1 и 2го режимов syn cookie? В первом режиме они подключаются, когда переполняется очередь syn соединений на 1 порт, а во втором режиме они включаются безусловно даже очередь пуста. То есть для ВСЕХ соединений.

Подробнее читайте в документации ядра Linux - тут :) Все рассуждения основаны на анализе ядра ядра 3.18, в Вашей версии ядра все может быть ИНАЧЕ!

Tuesday, 23 December 2014

Сборка конструктора сетевых пакетов для C++ Crafter

Ставим зависимости:
sudo apt-get install libpcap0.8 libpcap0.8-dev

Берем здесь файлик crafter-0.3.tar.gz https://drive.google.com/folderview?id=0B4PDTNA2TABgVWRSaW5yLW5UbFk&usp=sharing

Кладем его на сервер в папку /usr/src
cd /usr/src
tar -xf crafter-0.3.tar.gz
cd crafter-0.3/
./configure --prefix=/opt/crafter
make
make install
Добавляем библиотеку в систему:
echo "/opt/crafter/lib/" > /etc/ld.so.conf.d/crafter.conf
ldconfig
А теперь идем изучать документацию! Штука очень занятная и аналогичная Scapy во многом. 

Monday, 22 December 2014

Демонизация процессов на CentOS и Debian

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

Для Debian есть пакет daemon.

Вот с таким набором параметров:
daemon
Invalid arguments: no command supplied
usage: daemon [options] [--] [cmd arg...]
options:

      -h, --help              - Print a help message then exit
      -V, --version           - Print a version message then exit
      -v, --verbose[=level]   - Set the verbosity level
      -d, --debug[=level]     - Set the debugging level

      -C, --config=path       - Specify the configuration file
      -N, --noconfig          - Bypass the system configuration file
      -n, --name=name         - Guarantee a single named instance
      -X, --command=cmd       - Specify the client command as an option
      -P, --pidfiles=/dir     - Override standard pidfile location
      -F, --pidfile=/path     - Override standard pidfile name and location

      -u, --user=user[:group] - Run the client as user[:group]
      -R, --chroot=path       - Run the client with path as root
      -D, --chdir=path        - Run the client in directory path
      -m, --umask=umask       - Run the client with the given umask
      -e, --env="var=val"     - Set a client environment variable
      -i, --inherit           - Inherit environment variables
      -U, --unsafe            - Allow execution of unsafe executable
      -S, --safe              - Deny execution of unsafe executable
      -c, --core              - Allow core file generation

      -r, --respawn           - Respawn the client when it terminates
      -a, --acceptable=#      - Minimum acceptable client duration (seconds)
      -A, --attempts=#        - Respawn # times on error before delay
      -L, --delay=#           - Delay between spawn attempt bursts (seconds)
      -M, --limit=#           - Maximum number of spawn attempt bursts
          --idiot             - Idiot mode (trust root with the above)

      -f, --foreground        - Run the client in the foreground
      -p, --pty[=noecho]      - Allocate a pseudo terminal for the client

      -l, --errlog=spec       - Send daemon's error output to syslog or file
      -b, --dbglog=spec       - Send daemon's debug output to syslog or file
      -o, --output=spec       - Send client's output to syslog or file
      -O, --stdout=spec       - Send client's stdout to syslog or file
      -E, --stderr=spec       - Send client's stderr to syslog or file

          --running           - Check if a named daemon is running
          --restart           - Restart a named daemon client
          --stop              - Terminate a named daemon process


Для  CentOS есть пакет daemonize.

Вот с таким набором параметров:
 daemonize
daemonize, version 1.7.3
Usage: daemonize [OPTIONS] path [arg] ...

OPTIONS

-a             Append to, instead of overwriting, output files. Ignored
               unless -e and/or -o are specified.
-c <dir>       Set daemon's working directory to <dir>.
-e <stderr>    Send daemon's stderr to file <stderr>, instead of /dev/null.
-E var=value   Pass environment setting to daemon. May appear multiple times.
-o <stdout>    Send daemon's stdout to file <stdout>, instead of /dev/null.
-p <pidfile>   Save PID to <pidfile>.
-u <user>      Run daemon as user <user>. Requires invocation as root.
-l <lockfile>  Single-instance checking using lockfile <lockfile>.
-v             Issue verbose messages to stdout while daemonizing.
Такое ощущение, что лучше демонизироваться самому.

Saturday, 20 December 2014

Сборка ZeroMQ на Debian 7 Wheezy

Довольно много приложений последнее время переходят к использованию ZeroMQ и не зря! Очень крутая библиотека :)

Итак, соберем же ее:
cd /usr/src
wget http://download.zeromq.org/zeromq-4.0.5.tar.gz
tar -xf zeromq-4.0.5.tar.gz
cd zeromq-4.0.5
./configure --prefix=/opt/zeromq_405
make install
ln -s /opt/zeromq_405/ /opt/zeromq

Добавляем библиотеку в систему:
echo "/opt/zeromq/lib" > /etc/ld.so.conf.d/zeromq.conf
ldconfig
Все, теперь можно собирать любые приложения с данный библиотекой:

g++ server.c -I /opt/zeromq/include -l/opt/zeromq/lib/libzmq.so -oserver