среда, 28 декабря 2011 г.

Таймер для электрозамка

На входной двери стоит электрозамок, который открывается при отключении питания и сейчас срабатывает при нажатии кнопки. Это не удобно, поскольку вынуждает удерживать кнопку, пока дверь не откроют. Иначе, при отпускании кнопки, замок вновь закроет дверь.

Решением этой проблемы может стать устройство, которое при нажатия кнопки будет отключать электрозамок и включать его обратно по истечении заданного интервала времени. Для двери вполне достаточна задержка в 10-15 секунд.

В закромах ничего подходящего под эту задачу не нашлось, потому я решил размять мозг и вспомнить университетский курс микроэлектроники. Самым простым решением для меня было поставить микроконтроллер и управлять через него реле. Задержку выставлять при программировании, либо подстроечным резистором, подключенным ко входу АЦП. В заначке лежали два ATMega8A-PU в DIP-28 корпусе, но жаба душила ставить полноценный микроконтроллер под такую задачу.

Отказавшись от идеи использовать микроконтроллер, попробовал повторить схему, приведенную на рис. 1, выкинув из нее все лишнее и заменив микросхему на К555ЛА3.

Рис. 1
Заработало, но из-за невысокого входного сопротивления 2ИЛИ-НЕ элемента конденсатор разряжался слишком быстро. Задержка составила где-то 3-4 секунды для конденсатора 470uF. Причем увеличение емкости сопровождала задержка при заряде конденсатора и результат "плавал".

Почитывая на досуге книжку по электронике, дошел до описания операционных усилителей. Если использовать операционный усилитель в качестве компаратора, то решение задачи сводилось к сравнению напряжения на разряжающемся конденсаторе и выставленным эталоном.

На выходных съездил на Ждановичи и прикупил необходимые компоненты. За вечер набросал простенькую схемку (рис. 2) и собрал на макетной плате.
Рис. 2

Заработало с первого раза. Только пришлось немного помучиться с выбором подстроечного резистора R3, чтобы найти с линейной зависимостью. При данных номиналах C1, R5 и R3 задержку можно выставить от 2 до 27 секунд. Для тестирования подключил кнопку вместо JP1.
Рис. 3 Таймер для электрозамка

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

пятница, 16 декабря 2011 г.

New midnight commander releases

New midnight commander versions released yesterday:
Binaries available in my repository. Repository setting can be found here.

понедельник, 12 декабря 2011 г.

Disable SSLv2 and weak ciphers

Comprehensive guide how to disable SSLv2 and weak ciphers. As a quick reference for Apache:

<IfModule mod_ssl.c>
    SSLProtocol -ALL +SSLv3 +TLSv1
    SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM
</IfModule>

To test new settings:
$ openssl s_client -ssl2 -connect servername:443
CONNECTED(00000003)
32386:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:428:

$ openssl s_client  -connect servername:443 -cipher LOW:EXP

CONNECTED(00000003)
32391:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:602:

пятница, 9 декабря 2011 г.

SFTP support in midnight commander

Этот пост доступен на русском. Перевод можно найти здесь


Continue watching SFTP support development in midnight commander. This week I had conversation with author and asked him for new features wich ready for packaging. He told me that SSH agent authentication ready for testing. I quickly made debian package and test it.

First disappointment - midnight can't authenticate via ssh-agent. I try to recheck auth schemes which worked in previous build:

  • password auth - works as expected;
  • public key auth - works, but only with keys, that didn't password protected (I think it's libssh2 limitation).
Trying different ssh-agent options I finally asked author how he use it. He told me that agent support works out of the box. Later I found ssh-agent example on libssh2 developers site and try to compile it

$ gcc -o agent_auth -Wall -I/usr/include -I. -lssh2 ssh2_agent.c
ssh2_agent.c: In function ‘main’:
ssh2_agent.c:99: warning: implicit declaration of function ‘libssh2_session_handshake’
/home/andrey/tmp/ccmczn2V.o: In function `main':
ssh2_agent.c:(.text+0x1a8): undefined reference to `libssh2_session_handshake'
collect2: ld returned 1 exit status
Error message points me that example written for newer libssh2 version than debian squeeze has. I try to build current available libssh2 version (1.3.0) and rebuild example against new library.

$ gcc -o agent_auth -Wall -I$PWD/libssh2/include -I. -L$PWD/libssh2/lib -lssh2 ssh2_agent.c
After that example builds without errors, but refused to work, complaining about connection problems.

$ LD_LIBRARY_PATH=$PWD/libssh2/lib ./agent-auth localhost andrey
failed to connect!
zsh: segmentation fault  ./agent_auth localhost andrey
Running under strace shows that example try to connect to 255.255.255.0 instead of 127.0.0.1 and free resources without check if they allocated. This is the reason of segfault on exit.

munmap(0xb7813000, 4096)                = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("255.255.255.255")}, 16) = -1 ENETUNREACH (Network is unreachable)
write(2, "failed to connect!\n", 19failed to connect!
)    = 19
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
zsh: segmentation fault  strace -f ./agent_auth localhost username
I added check before resource freeing

--- ssh2_agent.c.orig   2011-12-08 23:53:41.000000000 +0300
+++ ssh2_agent.c    2011-12-09 00:02:10.000000000 +0300
@@ -231,10 +231,12 @@ int main(int argc, char *argv[])
      */

   shutdown:
-
-    libssh2_agent_disconnect(agent);

-    libssh2_agent_free(agent);
+   if (agent) {
+       libssh2_agent_disconnect(agent);
+
+       libssh2_agent_free(agent);
+   }


     if(session) {
After that I rebuild example and run it.

$ gcc -o agent_auth -Wall -I$PWD/libssh2/include -I. -L$PWD/libssh2/lib -lssh2 ssh2_agent.c
$ LD_LIBRARY_PATH=$PWD/libssh2/lib ./agent_auth localhost andrey
failed to connect!
Now better - segfault on exit dissapeared, but binary still complaining about connection error. Looking code again - hostname conversion made by inet_addr() function.

if (argc > 1) {
        hostaddr = inet_addr(argv[1]);
    } else {
        hostaddr = htonl(0x7F000001);
    }
Referring to man 3 inet_addr and see that function converts symbolic representation of ip address to it's binary form. Bingo! I do a mistake by supplying localhost as hostname. Replacing localhost with 127.0.0.1 do the thing and example works now.

$ LD_LIBRARY_PATH=$PWD/libssh2/lib ./agent_auth 127.0.0.1 andrey
Fingerprint: FA F3 92 9E C4 AE 14 B4 FC BE ED 2A E8 33 0C 1E 34 09 9F B3 
Authentication methods: publickey,password
 Authentication with username andrey and public key /home/andrey/.ssh/id_rsa failed!
 Authentication with username andrey and public key /home/andrey/.ssh/id_dsa succeeded!
all done!
Now the rest - create libssh2 (1.3.0) package for squeeze and rebuild midnight commander against new library version. Binary builds can be downloaded from there


Этот пост доступен на русском. Перевод можно найти здесь

среда, 7 декабря 2011 г.

Custom virtual host config in WHM/cPanel

Today one our customer asked to separate error logs for the different virtual hosts on the server which controlled with WHM/cPanel. Default setup stores domain logs in /usr/local/apache/domlogs/ and one common error log in /usr/local/apache/logs/error_log. This makes customer unhappy because he wants to see logs by FTP.

Direct edit of apache config prohibited because cPanel will rewrite it after any change in virtual host admin panel. I google around and find useful doc which describes how to add custom part to any level of apache config.

вторник, 6 декабря 2011 г.

Блокировка клавиатуры в linux/X11

Частенько дочка любит "поклацать" по клавиатуре домашнего компа, пока за ним сидят папа или мама. Оно то понятно - ребенок хочет принять участие в процессе.. Но часто эти "игры" попадают на моменты, когда нужно спокойно изучить парочку страничек, открытых в браузере, а отвлечь ребенка некому или некогда.

Чтобы решить эту проблему, я решил реализовать временную блокировку ввода с клавиатуры (до мышки она еще не дотягивается) по нажатию комбинации клавиш. Исходник получился несложным
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    Display *dpy;
    XEvent ev;
    KeySym *keysym;
    int i;

    dpy = XOpenDisplay(NULL);
    if (!dpy) {
        fprintf(stderr, "Unable to open display\n");
        return 1;
    }

    for (i = 0; i<5; i++) {
        if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), False, GrabModeAsync, GrabModeAsync, CurrentTime) != 0) {
            if (i == 4) {
                fprintf(stderr, "Failed to grab keyboard after 5 attepts\n");
                XCloseDisplay(dpy);
                return 1;
            }
            usleep(500000);
        } else {
            break;
        }
    }

    while (1) {
        XNextEvent(dpy, &ev);
        switch(ev.type) {
            case KeyRelease:
                keysym = XGetKeyboardMapping(dpy, ev.xkey.keycode, 1, &i);
                if ((KeySym) *keysym == XK_Scroll_Lock) {
                    XSync(dpy, True);
                    XUngrabKeyboard(dpy, CurrentTime);
                    XCloseDisplay(dpy);
                    return 0;
                }
        }
    }
}
Полный архив с исходником можно забрать тут

P.S. в процессе использования всплыли пара багов:
  • Если не разлочить клавиатуру перед блокировкой экрана в gnome-screensaver, то обратно зайти не удастся. Скринсейвер долго думает а потом просто запускает заставку обратно.
  • При залоченной клавиатуре перестают работать многие вещи, использующие XGrabKeyboard для своих нужд (в частности перемещение окон, меню во многих тулкитах, etc)
  • И нужно добавить индикацию "залоченности" клавиатуры на экран.

понедельник, 5 декабря 2011 г.

Перезагрузка алиасов в разных почтовых системах

Все время забываю, как в exim перезагрузить список алиасов. Обычно для этого предназначен newaliases, который отсутствует в сборке cPanel.

Аналоги newaliases для:
  • exim:
    exim -bi
  • postfix:
    postalias
  • sendmail:
    sendmail -bi

Синхронизация паролей в WHM/cPanel

  После массовой смены паролей (посредством passwd %username%) на сервере под управлением WHM/cPanel перестало пускать по FTP.

  Для решения этой проблемы нужно синхронизировать пароли пользователей с их ftp аккаунтами запустив /scripts/ftpupdate

пятница, 18 ноября 2011 г.

Midnight Commander с поддержкой SFTP

Дошли руки собрать и выложить midnight commander с поддержкой протокола SFTP. Реализация еще сырая, но пробовать можно уже сейчас. Скачать бинарный пакет для Debian Squeeze i386 можно тут. Для остальных есть вариант пересобрать пакет.

четверг, 10 ноября 2011 г.

Слава роботам!

Только сейчас оценил полезность встроенных команд в bash. Из-за выставленного ulimit -u (processes) не давало работать в shell'е на shared хостинге. Виной тому php-fcgi, который перетянул "одеяло" на себя и не давал форкнуться. Залив файлик ps.php, дергаю его через браузер и получаю список процессов, которые принадлежат %USER%. После в bash прибиваю часть через встроенный kill.
<pre>
<?php
system('ps w -u %USER%');
Содержимое ps.php

P.S. Уже позже вспомнился случай, описанный в старой книге на админскую тематику, где через встроенные функции чинили систему после rm -rf.

вторник, 1 ноября 2011 г.

Настройка режима DnD (Do Not Disturb) в pidgin

Возможно пригодится кому-нибудь.

Чтобы заставить pidgin не отвлекать внимание всплывающими сообщениями нужно:
  • выставить статус DND ("Do Not Disturb" или "Не беспокоить");
  • в "Средства / Настройки / Интерфейс" выставить значение "Скрывать новые беседы" равным "Во время отсутствия";
  •  в "Средства / Настройки / Звуки" значение "Включить звуки" установить в "Только во время присутствия".
Этого вполне достаточно, чтобы не отвлекаться от важных дел.

воскресенье, 30 октября 2011 г.

Поднакопилось

Поднакопилась пачка изменений, которые хочется упомянуть в своем блоге. Первое из них - я сделал бэкпорт pidgin для squeeze. Сейчас его версия 2.10.0-1~bpo60+1. Поставить его можно из моего репозитария для squeeze в секции backports.

deb http://www.tataranovich.com/debian squeeze backports

Из замеченных мною изменений:
  • более менее адекватно работает аудио/видео связь;
  • починили clientLogin и SSL в ICQ. 
В остальном вроде по-прежнему.

Сборочная среда понемногу развивается. Сейчас ночные сборки переведены на новую схему именования версий. Раньше очередная версия формировалась из внутренней версии апстрима с добавлением суффикса ~gitYYYYMMDD-1. Получалось что-то вроде 3:4.8.0-34-g0035a1d~git20111028-1 что не всегда давало версию старше, чем в предыдущем билде. Сейчас эта версия превратилась в 4:4.8.0~git20111028-1 (префикс 4: гарантирует переход с любой старой версии на новую схему). Плюс ко всему nightly builds допускает несколько сборок в пределах одного дня.

Добавил поддержку новых дистрибутивов. Сейчас полный список выглядит так:
Debian
  • lenny
  • squeeze
  • wheezy
  • sid
Ubuntu:
  • hardy (пакет требует отдельных телодвижений для сборки)
  • lucid
  • maverick
  • natty
  • oneiric
Все с поддержкой i386 и amd64.

вторник, 11 октября 2011 г.

Продолжение первой статьи на хабрахабре

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

суббота, 8 октября 2011 г.

Синхронизация истории сообщений в pidgin

Довольно часто мне приходится пользоваться pidgin для общения с друзьями и коллегами на разных компьютерах. Поэтому мне важно, чтобы история переписки была всегда в актуальном состоянии и была доступна на любом из компьютеров.

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

Ранее я сталкивался с упоминаниями unison для синхронизации, но насколько я смог разобраться в его фичах, он не поддерживает прозрачную синхронизацию. На данный момент я выбрал dropbox. Посколько dropbox не поддерживает шифрование на стороне клиента, то дополнительно применена encfs (позволяет шифровать не только содержимое файла, но и его имя).

Dropbox настроен на синхронизацию каталога ~/Dropbox. Внутри папки ~/Dropbox создан каталог ~/Dropbox/Safe, который содержит зашифрованную часть EncFS. Расшифрованная часть монтируется в каталог ~/Safe.

После настройки логи pidgin были перенесены из ~/.purple/logs в ~/Safe/.purple-logs и создана символическая ссылка ~/.purple/logs -> ~/Safe/.purple-logs

Уже прошла неделя использования этой схемы. Из замеченного:
  • В один момент времени должен работать клиент только на одном из компьютеров, если работает на нескольких, то возможны дублирования в истории (плотно не тестировал, т.к. у меня таких случаев очень мало)
  • Dropbox плохо переваривает синхронизацию большого количества маленьких файлов (~35000 файлов, общим объемом на ~17MB)
Сейчас подумываю подключить к синхронизации часть общих конфигов и добавить инкрементальную архивацию.

Исходники сборочной среды теперь доступны на code.google.com

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

Когда я писал статью на хабре я обещался выложить код как только приведу его в божеский вид. Похоже причесать код окажется гораздо сложнее, чем мне казалось поначалу. Потому я решил следовать принципу Эрика Раймонда (Release early, release often) и выложил первый рабочий вариант на code.google.com. Проект называется mc-buildbot и доступен по адресу http://code.google.com/p/mc-buildbot/

В процессе освоения хостинга, интеграции mercurial с ним и написанием патча, появилась пара мелочей, которые достойны упоминания здесь.
  • Чтобы каждый раз не вводить свой логин/пароль от googlecode, его можно сохранить в настройках mercurial (вроде работает, начиная с версии 1.3). Для этого в ~/.hgrc добавляется секция [auth] содержащая настройки авторизации, например:
[auth]
googlecode.prefix = https://code.google.com/
googlecode.username = username
googlecode.password = password

  • Проверить ошибки в страницах man, можно выполнив команду:
LANG=en_US.UTF-8 MANWIDTH=80 man --warnings -E UTF-8 -l /path/to/man/page >/dev/null

  • Добавить патч под управлением quilt
$ export QUILT_PATCHES="debian/patches"
$ quilt import -P patchname /path/to/patch

Чтобы проверить, что патч правильно накладывается:
$ quilt push

Отменить все патчи
$ quilt pop

Позже постараюсь найти время, чтобы плотнее поизучать quilt. Неплохая заметка по началу работы есть в Debian New Maintainers' Guide

среда, 21 сентября 2011 г.

Сборка пакетов для Midnight Commander

На днях закончил настройку сборочной среды для пакетов Midnight Commander. Сборка релизов еще окончательно не автоматизирована, а ночные срезы из git уже собираются автоматически (при условии, что в репозитарии есть изменения). Последний собранный релиз - 4.7.5.4 (его changelog)
Сейчас поддерживаются следующие цели для сборки:
  • Debian Lenny (i386, amd64)
  • Debian Squeeze (i386, amd64)
  • Debian Wheezy (i386, amd64)
  • Debian Sid (i386, amd64)
  • Ubuntu Lucid (i386, amd64)
  • Ubuntu Maverick (i386, amd64)
  • Ubuntu Natty (i386, amd64)
  • Ubuntu Oneiric (i386, amd64)

Настройки APT для релизов:
  • deb http://www.tataranovich.com/debian lenny main
  • deb http://www.tataranovich.com/debian squeeze main
  • deb http://www.tataranovich.com/debian wheezy main
  • deb http://www.tataranovich.com/debian sid main
  • deb http://www.tataranovich.com/debian lucid main
  • deb http://www.tataranovich.com/debian maverick main
  • deb http://www.tataranovich.com/debian natty main
  • deb http://www.tataranovich.com/debian oneiric main

Настройки APT для ночных срезов:
  • deb http://www.tataranovich.com/debian lenny nightly
  • deb http://www.tataranovich.com/debian squeeze nightly
  • deb http://www.tataranovich.com/debian wheezy nightly
  • deb http://www.tataranovich.com/debian sid nightly
  • deb http://www.tataranovich.com/debian lucid nightly
  • deb http://www.tataranovich.com/debian maverick nightly
  • deb http://www.tataranovich.com/debian natty nightly
  • deb http://www.tataranovich.com/debian oneiric nightly

Чтобы не произошла случайная замена пакета mc версией из nightly сборок, рекомендуется настроить APT pinning
Package: *
Pin: release c=nightly
Pin: origin www.tataranovich.com
Pin-Priority: -1

понедельник, 12 сентября 2011 г.

Метеорадар на рабочем столе.

Полезная штука метеорадар, и еще более полезная, когда его можно созерцать в виде виджета на рабочем столе. Чтобы реализовать подобное достаточно запустить feh в режиме периодического обновления и убрать декорацию окна.
Далее настройки для openbox.
Запуск feh
feh -R 900 -g 654x479+1000+10 --title 'Weather radar' http://meteoinfo.by/radar/UMMN/UMMN_latest.png &

Настройки декорации окна
<application title="Weather radar" class="feh">
<desktop>all</desktop>
<skip_pager>yes</skip_pager>
<skip_taskbar>yes</skip_taskbar>
<decor>no</decor>
<layer>below</layer>
<focus>no</focus>
</application>
А так оно выглядит:
Meteo-radar on desktop

понедельник, 15 августа 2011 г.

NVidia GeForce GT440 в Debian Squeeze.

На той неделе поддался слабости и позволил себе небольшой апгрейд - прикупил Palit GeForce GT440 на замену своему старичку Palit GeForce 7300GT.

Драйвера которые сейчас предоставляет Debian Squeeze (195.36.31-6) не подходят для новой видеокарты, ее поддержка появилась начиная с версии 270.4106, которая вышла в апреле этого года.

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

Дистрибутивные пакеты не стали, пришлось сделать бэкпорт для squeeze. Собранные пакеты лежат в моем репозитарии в секции backports. Подключить в APT можно добавив в /etc/apt/sources.list
deb http://www.tataranovich.com/debian squeeze backports

После этого мне пришлось добавить репозитарий тестинга, чтобы стянуть недостающие зависимости и немного поиграться с apt pinning - соответствующий кусок моего /etc/apt/preferences
Package: * 
Pin: release a=testing 
Pin-Priority: -1 

Package: nvidia-support 
Pin: release a=testing 
Pin-Priority: 500 

Package: nvidia-installer-cleanup 
Pin: release a=testing 
Pin-Priority: 500 

Package: glx-alternative-nvidia 
Pin: release a=testing 
Pin-Priority: 500 

Package: glx-alternative-mesa 
Pin: release a=testing 
Pin-Priority: 500 

Package: glx-diversions 
Pin: release a=testing 
Pin-Priority: 500

На выходных выдалось время наконец поставить карточку и сделать пару тестов. Первое, что я проверил - была поддержка проигрывания видео через VDPAU. На старой при проигрывании 1080p нагрузка на двухядерный проц была больше 80-90%. После апгрейда нагрузка упала до 3-6%.

Разочарованием стала поддержка аппаратного ускорения в flash player. При проигрывании на полном экране изображение дрожало и шло с рывками. В дополнение к этому черные учатки в интерфейсе стали просвечивать картинку из flash проигрывателя. Проблема решилась отключением поддержки аппаратного ускорения.

четверг, 11 августа 2011 г.

Опакетил midnight commander.

Несмотря на то, что новая версия Midnight Commander'а (ChangeLog для версии 4.7.5.3) вышла больше двух недель назад, сопровождающий пакета в debian похоже потерял интерес или не имеет свободного времени. Сегодня я выкроил немного свободного времени и подготовил пакет для последней стабильной версии.

Стянуть пакеты для Lenny и Squeeze i386 можно в моем репозитарии.

Еще я решил накидать небольшую доку, как пересобрать пакет из моего репозитария под свой дистрибутив/архитектуру (актуально для debian-based дистрибутивов):

Добавляем мой ключ (необязательно, но будет ругаться на неизветную подпись)
$ wget -q -O- http://www.tataranovich.com/tataranovich.asc | sudo apt-key add -

Добавляем источник
$ echo 'deb-src http://www.tataranovich.com/debian squeeze main' | sudo tee -a /etc/apt/sources.list

Скачиваем исходники для версии 3:4.7.5.3-1 и зависимости для сборки
$ sudo apt-get update
$ sudo apt-get install build-essential fakeroot
$ apt-get source mc=3:4.7.5.3-1
$ sudo apt-get build-dep mc=3:4.7.5.3-1
$ cd mc-4.7.5.3/
$ dpkg-buildpackage -rfakeroot

Собранный пакет будет лежать уровнем выше.

пятница, 5 августа 2011 г.

Обновил пакеты для openbox

Собрал пакеты для openbox в вариантах Lenny (i386) и Squeeze (i386). Забрать можно в моем репозитарии.
Настройки APT можно посмотреть тут

среда, 3 августа 2011 г.

Вышел новый openbox.

Недавно вышла новая версия openbox Сегодня дошли руки собрать пакет для Debian Squeeze. Заодно сделал реорганизацию своего репозитария.

Настройки репозитария:

Debian Squeeze
deb http://www.tataranovich.com/debian squeeze main
deb-src http://www.tataranovich.com/debian squeeze main

Debian Lenny
deb http://www.tataranovich.com/debian lenny main
deb-src http://www.tataranovich.com/debian lenny main

Чтение лога FTP - xferlog

Расшифровка FTP лога в формате xferlog

Сегодня пригодилось, чтобы быстро глянуть расшифровку.

среда, 18 мая 2011 г.

Новые проблемы с hibernate на моем eeepc.

Я уже упоминал о проблемах в работе hibernate (он же suspend to disk) в одном из своих предыдущих постов. Тогда я откатил ядро и отправил баг, на большее времени не хватило.

Теперь я решил вернуться к проблеме, так как она получила новый виток. Началось с того, что после выхода из hibernate перестали запускаться приложения. В dmesg видно, что падения вызывает segfault. Причем падает не все подряд, а только часть.

May 13 07:16:25 dragoncore kernel: [ 4374.516022] egrep[10517]: segfault at 9eef73d ip 080510fa sp bfcd5a8c error 6 in egrep[8048000+18000]
May 18 07:22:56 dragoncore kernel: [10412.759167] urxvt[22902]: segfault at 42a648c8 ip b70e7020 sp bf95d2a0 error 6 in libperl.so.5.10.1[b70a9000+14a000]
По причине того, что проблема не всегда воспроизводится а также хронической нехватки времени я просто перезагружал нетбук и продолжал работу. Сегодня мое терпение лопнуло и я решил разобраться в проблеме. Т.к. у меня стоит debsums, то я первым делом запустил проверку целостности пакетов

sudo debsums | grep -v OK$
Таким образом ищутся файлы, контрольная сумма которых не совпадает с эталоном. Нашло несколько несовпадений
/usr/bin/dbus-daemon                      FAILED
/lib/libdbus-1.so.3.4.0                        FAILED
/usr/lib/libgobject-2.0.so.0.2400.2            FAILED
/bin/zsh4                                      FAILED
После перезарузки проверка была уже без ошибок.

Для чистоты эксперимента система была обновлена до актуального squeeze + ядро до 2.6.32-31. После как и полагается нетбук был перезагружен. Далее для выяснения причины попробовал запустить бесконечный цикл из связки hibernate и debsums. Чтобы не приходилось каждый раз включать ноутбук, я заменил в /etc/uswsusp.conf

shutdown method = platform
на
shutdown method = reboot
Теперь после засыпания на диск происходит перезагрузка, а не отключение питания. Для большей автоматизации был написан скрипт
#!/bin/bash

PREFIX=/var/log
COUNT=0

while true
do
dmesg -c > /dev/null
sync
pm-hibernate
let COUNT=${COUNT}+1
echo -e "DMESG\n\n*****\n\n" | tee ${PREFIX}/hibernate.${COUNT}.log
dmesg | tee -a ${PREFIX}/hibernate.${COUNT}.log
echo -e "\n\nDEBSUMS\n\n*****\n\n" | tee -a ${PREFIX}/hibernate.${COUNT}.log
debsums | tee -a ${PREFIX}/hibernate.${COUNT}.log | grep -v OK$
if [ $? == 0 ]; then
echo -e "\n\nDetected corruption!\n\n" | tee -a ${PREFIX}/hibernate.${COUNT}.log
dmesg | tee -a ${PREFIX}/hibernate.${COUNT}.log
sync
exit 1
fi
done
Скрипт выполнялся до тех пор, пока debsums не находил "поврежденные" файлы. Из двух прогонов за сегодня первая ошибка была на 14-й итерации, а второй раз нашло на 2-ой.
Пока я выкрутился через suspend-hybrid (благо новая батарея это позволяет). Завтра попробую тоже самое, но без использования KMS.

пятница, 21 января 2011 г.

Отключение сбойного жесткого диска без остановки сервера

Придя сегодня на работу, обнаружил, что девелоперский сервер в глубокой "задумчивости". При попытке пинговать его выявилась значительная потеря пакетов. Через минуту смог залогиниться через SSH - сказывались потери пакетов. Первый делом на проблемной машинке глянул
# dmesg | tail
SCSI device sdb: 490350672 512-byte hdwr sectors (251060 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 3a 00 00
SCSI device sdb: drive cache: write back
ata3.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
ata3.00: cmd b0/da:00:00:4f:c2/00:00:00:00:00/00 tag 0
         res 40/00:00:5f:00:00/00:00:00:00:00/e0 Emask 0x4 (timeout)
ata3.00: status: { DRDY }
ata3: soft resetting link
ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
ata3.00: configured for UDMA/33
ata3: EH complete
SCSI device sdb: 490350672 512-byte hdwr sectors (251060 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 3a 00 00
SCSI device sdb: drive cache: write back
ata3.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
ata3.00: cmd b0/da:00:00:4f:c2/00:00:00:00:00/00 tag 0
         res 40/00:00:5f:00:00/00:00:00:00:00/e0 Emask 0x4 (timeout)
ata3.00: status: { DRDY }
ata3: soft resetting link
ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
ata3.00: configured for UDMA/33
ata3: EH complete
Видимо один из 4-х дисков приказал долго жить и его срочно нужно отключить от RAID. Самое интересное, что за полтора часа, пока сервер загибался, сбойный винт не пометило как сбойный.
Чтобы извлечь нужный диск и потом отключить его физически нужно знать его S/N (у нас стоят 4 одинаковых WDC WD2502ABYS - поэтому просто по производителю глянуть не получится).
Пробую найти сбойный диск перебирая все винты на сервере
for hdd in sda sdb sdc sdd; do smartctl -d ata -a /dev/$hdd | grep ^194; done
Скрипт залипает на /dev/sdb, исключаю его из перебора и пробую вновь. На этот раз отрабатывает без ошибок.
Теперь остается выяснить его серийный номер (S/N):
# ls -l /dev/disk/by-id/scsi-SATA_WDC_WD2502ABYS-_WD-WCAT1E8* |grep sdb$
lrwxrwxrwx 1 root root  9 Окт 25 10:39 /dev/disk/by-id/scsi-SATA_WDC_WD2502ABYS-_WD-WCAT1E882772 -> ../../sdb
Получается что его S/N WCAT1E882772. Теперь извлекаем его из raid:
mdadm --manage /dev/md0 --fail /dev/sdb1 --remove /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2 --remove /dev/sdb2
Остается остановить диск, чтобы система не пыталась его переинициализировать:
# ls -ld /sys/class/scsi_device/*/device/block:sdb
lrwxrwxrwx 1 root root 0 Янв 21 10:03 /sys/class/scsi_device/2:0:0:0/device/block:sdb -> ../../../../../../block/sdb

# echo 1 > /sys/class/scsi_device/2:0:0:0/device/delete
Проверяем, остановлен ли диск
# dmesg |tail

SCSI device sdb: 490350672 512-byte hdwr sectors (251060 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 3a 00 00
SCSI device sdb: drive cache: write back
ata3.00: disabled
Осталось вытащить его из сервера и сдать по гарантии =)

среда, 19 января 2011 г.

Синхронизация времени в Windows

Сетаплю винду на компе для нового сотрудника, решил разобраться в синхронизации времени в винде. Раньше обходился NetTime и отключал встроенную службу "Windows Time".
Поискал в инете - получилось что-то вроде:
\> net time /setsntp:172.16.0.1
\> net time /querysntp
The current SNTP value is: 172.16.0.1

\> net stop w32time
\> net start w32time
Теперь время синхронизируется через службу "Windows Time"

Сломался hibernate на моей eeepc'шке

Началось все со странной перезагрузки при попытке разбудить ноутбук из hibernation. Вроде процесс восстановления прошел, но вместо скринсейвера я увидел логотип асуса и последующую загрузку и проверку разделов на винте. Время было позднее и я не придал этому никакого значения - рещил, что был аппаратный сбой.
На следующий день история повторилась на работе. Времени разбираться не было и оставил как есть. Ближе к вечеру появилось свободное время - решил разобраться, что сломалось. Прикинул что дня три назад все еще работало, а значит нужно искать проблему в изменениях за последние двое суток. Вспомнилось, что делал обновления до текущего Debian Squeeze и обновилось что-то в районе ядра и прошивки для беспроводной карточки. Дома, где впервые заметил проблему, ноут засыпает с включенным wi-fi - и сразу напрашивалось, что сбоит включенная карточка в момент выхода ноута из спячки.
Попробовал сделать hibernate и снова включить ноут, но уже с отключенным wi-fi - результатом была та же перезагрузка. Начал искать причину среди недавних апдейтов ядра и системы засыпания. На тот момент стояло linux-image-2.6.32-5-686, uswsusp и pm-utils (работает поверх uswsusp). Поискал последние изменения в пакетной базе
$ grep 'status installed' /var/log/dpkg.log

2011-01-17 16:30:35 status installed linux-base 2.6.32-30
2011-01-17 16:31:09 status installed linux-image-2.6.32-5-686 2.6.32-30
2011-01-17 16:31:11 status installed firmware-linux-free 2.6.32-30
2011-01-17 16:31:11 status installed linux-libc-dev 2.6.32-30
Ядро обновилось с версии 2.6.32-29 на 2.6.32-30 - пошел читать changelog. Вроде ничего подозрительного не видно, решил глянуть upstream changelog, вот в нем и нашлось изменение в районе подсистемы PM / Hibernate
commit 012f9fdfd2965f573171f848d1aa46531cab7062
Author: Takashi Iwai 
Date:   Fri Dec 10 00:16:39 2010 +0100

    PM / Hibernate: Fix PM_POST_* notification with user-space suspend
    
    commit 1497dd1d29c6a53fcd3c80f7ac8d0e0239e7389e upstream.
    
    The user-space hibernation sends a wrong notification after the image
    restoration because of thinko for the file flag check.  RDONLY
    corresponds to hibernation and WRONLY to restoration, confusingly.
    
    Signed-off-by: Takashi Iwai 
    Signed-off-by: Rafael J. Wysocki 
    Signed-off-by: Greg Kroah-Hartman 

Полное описание комита
Решил откатиться на версию 2.6.32-29 и зафиксировать версию ядра, пока проблема не будет решена. Старую версию взял со snapshot.debian.org
Установка
$ wget http://snapshot.debian.org/archive/debian/20101211T031516Z/pool/main/l/linux-2.6/linux-image-2.6.32-5-686_2.6.32-29_i386.deb \
http://snapshot.debian.org/archive/debian/20101211T031516Z/pool/main/l/linux-2.6/linux-libc-dev_2.6.32-29_i386.deb \
http://snapshot.debian.org/archive/debian/20101210T205106Z/pool/main/l/linux-2.6/linux-base_2.6.32-29_all.deb \
http://snapshot.debian.org/archive/debian/20101210T205106Z/pool/main/l/linux-2.6/firmware-linux-free_2.6.32-29_all.deb
$ sudo dpkg -i *2.6.32*.deb
Фиксация версии в пакетной базе
$ sudo aptitude hold linux-image-2.6.32-5-686 firmware-linux-free linux-base linux-libc-dev
Перезагрузка и пробую засыпать на диск:
pm-hibernate
- все в порядке, включение прошло без проблем, осталось отписаться о проблеме разработчикам.