четверг, 20 мая 2010 г.

И как отловить такой баг?

Пару рабочих дней убил на отлов элементарной ошибки.

Выглядело все следующим образом:
 * имелся некий TCP сервер с уже кучей кода и модулей, но в принципе рабочий;
 * еще один тот же TCP сервер, но на другой машине (плате);
 * первый TCP сервер подключался к другому, как клиент с целью обмена данными.


Ошибка была в том, что соединение по какой-то причине отрабатывалось неверно и повисало в состоянии CLOSE_WAIT. Первый сервер распознавал это как неактивный сервер и дисконнектил его по таймауту, второй - не видел соединения вообще.

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

Далее, начали проверять отработку процесса подключения ко второму серверу. Подключение детектировалось по наличию данных в сокете путем проверки select()-ом. Сервер был однопоточный и проверки запускались периодически + выполнялась служебная работа. Select() измучили как только можно, перепроверяя отдаваемые ему параметры по десять раз и все равно CLOSE_WAIT оставлись. Что сразу смущало - они были _не всегда_.

Когда уже наступила фаза отчаяния, случайно добавленная отладка в планировщик вызовов select() выявила, что планировщик тупо переставал запускаться. Оказывается дело было в том, что планировщик запускался по таймауту, который вычислялся последовательными вызовами gettimeofday(). А на той плате была особенность - она корректировала свое системное время. На несколько месяцев. А проверки на такие таймауты не было. Занавес.

Как можно силой мысли доползти от диагностики в виде CLOSE_WAIT на сокете до неверной отработки таймаутов планировщика я не знаю. :(

вторник, 23 марта 2010 г.

генерация случайного MAC адреса

Имеем серию (ну пару тысяч экземпляров) сетевых устройств. Чтобы сетевое устройство могло корректно существовать, ему необходим уникальный MAC адрес. Предположим, что наши устройства существуют в своем мирке, встречаясь только друг с другом, а не с внешним большим и злым миром. Значит нам необязательно назначать им адекватные, зарегестрированные в общемировых реестрах MAC адреса. Собственно назначение каких-либо адекватных MAC-ов сопряжено с кучей неприятностей на практике, не будем их касаться, попробуем для каждого устройства динамически (т.е. устройство само это делает) генерировать адекватный, с достаточной степенью уникальный MAC-адрес.

Что есть такого уникального в серии из кучи одинаковых железяк? А шут его знает. :) Но тем не менее, sshd умудряется генерировать для каждой из этих плат уникальные RSA и DSA ключи. Вот! Вот она уникальность! Как ей воспользоваться? Легко:

md5sum /etc/ssh_rsa_host_key | cut -f1 -d" " | tail -c 11 | sed -e :a -e 's/\([0-z]\{2\}\)\([0-z]\{2\}\)/\1:\2/;ta'

Ну принцип понятен (тут еще кое-что надо добавить, чтобы заработало). :)

Попроще, на awk:

md5sum /etc/ssh_rsa_host_key | cut -f1 -d" " | tail -c 10 | awk '{ split($1,M,""); printf("address 00:"); for (j=1; j<=7; j+=2) printf("%s%s:",M[j],M[j+1]); printf("%s%s",M[8],M[9]); }' > /etc/net/ifaces/eth0/iplink

Вместо /etc/ssh_rsa_host_key можно использовать что угодно другое, уникальное.

На мысль натолкнул один патентик, где осуществлялась генерация уникальных MAC адресов для wi-fi устройств.

среда, 5 августа 2009 г.

резервная корневая файловая система

В связи с необходимостью для производимых нами embedded устройств, соорудил небесполезный и в обыденной жизни патчик для ядра. Суть в том, что ядру добавляется новый параметр: root_backup. В качестве значения - тоже, что и для оригинального root=, это устройство с корневой файловой системой. Если ядро при старте не сможет подмонтировать устройство указанное в "root=", то попытается указанное в "root_backup=".

Ограничения: должна быть тажа файловая система (легко исправляется), патч работает на 2.6.22.1 ядре (на других пока не проверял, но идея понятна).

патч.

воскресенье, 8 марта 2009 г.

Twitter

сообщение beolnix@ стало последней каплей.

завел акк на twitter. :)

воскресенье, 1 февраля 2009 г.

Надо же..

Этот пост сделан с терминала бесплатного интернета в аэропорту Домодедово. ))

Жить - это хорошо... но не везде ))

ПС: клава уродская тут (

понедельник, 26 января 2009 г.

Отсыпте и мне пару телевизоров..



Вот, надо же, не замечал раньше.. :-)

воскресенье, 25 января 2009 г.

Welcome to N.H.K.!

У каждого из нас есть своя собcтвенная N.H.K... Но пока рядом есть кто-то, готовый поддержать нас в трудную минуту, никакой заговор "злобной секретной организации" нам не страшен.
(с) Welcome to N.H.K.!

А у вас, есть кто-то, готовый поддержать в трудную минуту? Думаю, это одно из слагаемых счастья. ^_^