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

Пакеты Wine под x86_64

Не первый раз меня спрашивают, почему я пакетирую Wine только под i386. Чтобы восполнить этот пробел я попробовал собрать последнюю версию для i386/amd64. Пока сборка только для squeeze.

Установить можно через APT

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

Или руками из http://www.tataranovich.com/debian/pool/squeeze/experimental/w/wine-unstable/

Оставить отзыв можно в комментариях или в ветке форума на linux.org.ru.

четверг, 27 декабря 2012 г.

could not configure /dev/net/tun: Operation not permitted

Давненько для виртуализации я пользовался KVM (в основном VirtualBox), но сегодня потребовался именно KVM. Если запускать без сети, то все работает как и полагается, а если создать host-only сеть, то выдает ошибку could not configure /dev/net/tun: Operation not permitted.

Host-only сеть создана через tunctl (входит в пакет uml-utilities). Соответсвующая секция /etc/network/interfaces:

auto tap0
iface tap0 inet static
    address 10.168.90.100
    netmask 255.255.255.0
    tunctl_user uml-net

Пользователь, под которым запускается kvm, входит в группу uml-net, но при запуске выдается ошибка

$ kvm -m 1024 -drive file=inet.it.img,if=virtio,boot=on,media=disk,aio=native -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no -vga std
could not configure /dev/net/tun: Operation not permitted

Проверяю права на /dev/net/tun

$ ls -l /dev/net/tun
crw-rw---- 1 root uml-net 10, 200 Дек 27 15:22 /dev/net/tun

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

...
timer_create(CLOCK_REALTIME, {(nil), SIGALRM, SIGEV_SIGNAL, {...}}, {(nil)}) = 0
open("/dev/net/tun", O_RDWR|O_LARGEFILE) = 7
ioctl(7, TUNGETFEATURES, 0xbfe1633c)    = 0
ioctl(7, TUNSETIFF, 0xbfe1631c)         = -1 EPERM (Operation not permitted)
write(2, "could not configure /dev/net/tun"..., 58could not configure /dev/net/tun: Operation not permitted
) = 58
close(7)                                = 0
exit_group(1)
...

Как подсказал google не хватает привилегии CAP_NET_ADMIN. Чтобы ее выдать нужно установить пакет libcap2-bin и выполнить команду

$ sudo setcap CAP_NET_ADMIN=ep /usr/bin/kvm

После этого KVM запускается и работает без ошибок.

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

Wine 1.5.20 для Debian Squeeze/Wheezy

Собрал пакеты для Debian Squeeze/Wheezy для новой версии Wine 1.5.20 (только i386). Список изменений для новой версии тут. Установить новую версию можно из моего репозитария.

воскресенье, 9 декабря 2012 г.

Wine 1.5.19 для Debian Squeeze/Wheezy

Собрал пакеты для Debian Squeeze/Wheezy для новой версии Wine 1.5.19 (только i386). Список изменений для новой версии тут. Установить новую версию можно из моего репозитария.

суббота, 8 декабря 2012 г.

Отчет о доставке сообщений в jabber (XEP-0184: Message Delivery Receipts)

Сегодня коллега пожаловался на проблему с потерей сообщений в jabber. Часть наших пользователей подключены к корпоративной сети через OpenVPN, работающий через интернет каналы разного качества. Если у клиента нарушилась нормальная работа OpenVPN подключения, то jabber сервер (мы используем ejabberd) порядка двух минут может отправлять сообщения в "пустоту". Мне непонятна логика потери сообщений, т.к. для передачи сообщений используется TCP. В этом случае сервер должен знать, что сообщение было недоставлено, но при этом оно не помещается в offline storage, а просто удаляется.

Когда я впервые столкнулся с этой проблемой, то первым порывом было крутить настройки OpenVPN и ejabberd, но после пары запросов гуглу нашелся более другой способ.

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

Wine 1.5.18 для Debian Squeeze/Wheezy

Лучше поздно, чем никогда - собрал и залил в свой репозитарий новую версию Wine 1.5.18 для Debian Squeeze и Wheezy (только i386). Анонс новой версии тут.

среда, 21 ноября 2012 г.

Создание дампа базы MySQL в котором используется отдельный INSERT на каждую строку данных

Вчера в процессе прикручивания автоматического создания зон в связке PowerDNS + PowerAdmin мне понадобилось узнать какие данные добавляет PowerAdmin при создании новой зоны. Сперва полез в код, но быстро бросил эту затею.

Следующей мыслью было сравнить дамп базы powerdns до и после создания зоны в poweradmin. Если вы когда-то просматривали дампы, которые по-умолчанию создает mysqldump, то наверняка видели, что там значения в таблицу вставляются через один вызов INSERT. Что-то вроде INSERT INTO `tablename` VALUES (a1, a2, a3, ..., aN), (b1, b2, b3, ..., bN), ...

В итоге таблица где много записей будет выглядеть не информативно при сравнении дампа до и после создания зоны в poweradmin. Чтобы решить эту проблему нужно либо применить "умный" diff, либо заставить mysqldump формировать вставку каждой строки данных через отдельный INSERT.

После пары экспериментов в опциями из man mysqldump нашлась искомая:

$ mysqldump --skip-extended-insert dbname > dbname.sql

При использовании этой опции дамп выглядит так:

INSERT INTO `tablename` VALUES (a1, a2, a3, ..., aN);
INSERT INTO `tablename` VALUES (b1, b2, b3, ..., bN);
...

После этого в выводе diff отлично видно какие данные были добавлены в БД после создания зоны.

понедельник, 19 ноября 2012 г.

Настройка MySQL master-slave репликации

Настраивать master-slave репликацию в MySQL приходится редко, но постоянно приходится подглядывать мануал. Чтобы свести эту операцию к "одному касанию" я добавил этот пост (подходит для Debian-based дистрибутивов, для остальных подойдет если копировать вдумчиво).

Установка MySQL сервера


Устанавливаем MySQL сервер и клиент

# aptitude install mysql-server mysql-client

Далее я убираю удаленный вход в базу под root, тестовую базу и тестового пользователя. Для автоматизации этих действий существует скрипт mysql_secure_installation, входящий в дистрибутив MySQL сервера.

# mysql_secure_installation

Чтобы каждый раз не вводить пароль при подключении к базе я создаю конфиг для консольного клиента

# touch /root/.my.cnf
# chown root:root /root/.my.cnf
# chmod 0600 /root/.my.cnf
# cat > /root/.my.cnf <<EOF
[client]
host=localhost
user=root
password=your-root-password
EOF

Настройка MySQL master ноды


В Debian-based дистрибутивах есть возможность создать локальный конфиг mysql не изменяя /etc/mysql/my.cnf (чтобы не было конфликта при обновлении пакета). Я пользуюсь этой возможностью

# cat > /etc/mysql/conf.d/master.cnf <<EOF
[mysqld]
server-id = 500
log-bin = mysql-bin
log-bin-index = mysql-bin.index
max_binlog_size = 512M
expire_logs_days = 30
bind-address = 0.0.0.0
EOF

# invoke-rc.d mysql restart

При настройке master ноды нужно уделить внимание выбору значения server-id (оно должно быть уникальным в пределах группы серверов, вовлеченных в репликацию). Опции max_binlog_size и expire_logs_days управляют ротацией бинарного лога.

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

mysql> CREATE USER 'slave-user'@'slave-host' IDENTIFIED BY 'slave-password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave-user'@'slave-host';
mysql> FLUSH PRIVILEGES;

Далее нужно подготовить слепок баз данных, которые мы будем реплицировать

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     3211 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Сейчас нужно записать имя файла бинарного лога (mysql-bin.000004) и позицию в этом логе (3211). Далее в этой же сессии выполнить

mysql> \!mysqldump --add-drop-database --all-databases > /tmp/all-db.sql
mysql> UNLOCK TABLES;

Файл /tmp/all-db.sql нужно передать на slave ноду.

Настройка MySQL slave ноды


Для работы MySQL сервера в качестве slave ноды нужно внести пару изменений в его дефолтный конфиг.

# cat > /etc/mysql/conf.d/slave.cnf <<EOF
[mysqld]
server-id = 510
relay-log = relay-bin
relay-log-index = relay-bin.index
EOF

# invoke-rc.d mysql restart

Далее нужно импортировать файл /tmp/all-db.sql, который был создан на master ноде

# mysql < /tmp/all-db.sql
# mysqladmin flush-privileges

Затем нужно подключить slave ноду к master серверу и запустить репликацию.

mysql> CHANGE MASTER TO master_host='master-host', master_user='slave-user', master_password='slave-password', master_log_file='mysql-bin.000004', master_log_pos=3211;
mysql> START SLAVE;

Посмотреть статус репликации можно командой SHOW SLAVE STATUS\G. Если все работает правильно, то в полях Slave_IO_Running и Slave_IO_Running должно быть значение Yes.

воскресенье, 11 ноября 2012 г.

четверг, 8 ноября 2012 г.

Per-user конфигурация php в WHM/cPanel

SUPHP


Если вы используете suphp в cPanel, то у вас может возникнуть проблема, когда для разных сайтов потребуется различная конфигурация. Из коробки в cPanel конфигурация PHP берется из /usr/local/lib/php.ini. Чтобы создать per-user конфиг нужно:

  • создать файл /home/username/php.ini и добавить в него нужные переопределения относительно общего конфига /usr/local/lib/php.ini. Я туда дописал

    max_execution_time = 7200
  • создать файл /home/username/public_html/.htaccess и добавить в него

    SetEnv PHPRC /home/username/php.ini

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

CGI/FastCGI


Если на сервере PHP работает в режиме CGI/FastCGI, то начиная с PHP 5.3.0 появилась поддержка INI-файлов в стиле .htaccess на уровне каталога. Для изменения параметров интерпретатора нужно:

  • создать файл .user.ini (имя файла зависит от значения параметра user_ini.filename) в docroot'e сайта.

    xdebug.remote_enable = On
    xdebug.remote_host = 192.168.1.115
    xdebug.remote_port = 9000
    xdebug.remote_mode = req
  • подождать пока истечет период обновления (зависит от значения user_ini.cache_ttl) или перезагрузить веб-сервер.

вторник, 6 ноября 2012 г.

[ipcheck] Problem with DNS setup on cpanel

Дошли руки разобраться с письмами "которые нельзя игнорировать", которыми спамит свежеустановленная WHM/cPanel. Письма выглядят так:

Subject: [ipcheck] Problem with DNS setup on cpanel

IMPORTANT: Do not ignore this email.

Your hostname (cpanel) could not be resolved to an IP address. This
means that /etc/hosts is not set up correctly, and/or there is no
dns entry for cpanel. Please be sure that the contents of
/etc/hosts are configured correctly, and also that there is a
correct 'A' entry for the domain in the zone file.
Some or all of these problems can be caused by /etc/resolv.conf
being setup incorrectly. Please check that file if you believe
everything else is correct.

You may be able to automatically correct this problem by using the
'Add an A entry for your hostname' option under 'Dns Functions' in
your Web Host Manager.

Суть письма сводится к тому, что скрипт /scripts/ipcheck не может выполнить преобразование hostname в ipaddress. Данный экземпляр cPanel крутится в CentOS 6.x контейнере под управлением OpenVZ.

Сначала появилась мысль, что слетел hostname. Проверил догадку:

# hostname
cpanel

# hostname --fqdn
cpanel.srv.example.com

# dnsdomainname.
srv.example.com

# hostname -i
1.2.3.4

На первый взгляд все правильно. Полез в сам скрипт, чтобы узнать как выполняется преобразование. Из кода видно, что скрипт пытается получить ip для $hostname = Cpanel::Sys::Hostname::gethostname() и судя по письму $hostname равен "cpanel", а не "cpanel.srv.example.com". Т.е. выполняется gethostbyname($hostname).

Чтобы исправить эту ситуацию достаточно подкрутить резолвер (правильно установить параметр search в /etc/resolv.conf). В случае с контейнером OpenVZ это выглядит так:

# vzctl set 300 --searchdomain srv.example.com

Осталось проверить правильность новых настроек, запустив /scripts/ipcheck, если все в порядке, то скрипт не вернет никакого вывода.

четверг, 1 ноября 2012 г.

Wacom Intuos GD-0608-R в Windows XP

Позавчера битый час пытался заставить работать старенький планшет Wacom Intuos GD-0608-R (подключается через последовательный порт). На новом компе нашего дизайнера не нашлось COM-порта, выведенного на заднюю панель, так что сначала пришлось откопать в завалах старого барахла подходящую планку с подключением к колодке на материнской плате.

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

Сегодня пришел пораньше и устроил забег по поисковику. В результате откопал пост в котором человек описывает запуск этого планшета под Windows Vista. Если вкратце то планшет заработал после этих действий:
  1. После подключения планшета откажитесь от установки драйверов в Windows;
  2. Скачайте драйвер с сайта Wacom (я пробовал самый свежий, но похоже новые драйвера  не поддерживают эту модель);
  3. Создайте ветку в реестре [HKEY_LOCAL_MACHINE\SOFTWARE\Tablet](если ее еще там нет) и добавить в нее строковый параметр "PnPTablets"=",COM1". Если у вас последовательный порт, к которому подключен планшет, имеет другое название, то замените COM1 на ваше значение;
  4. Установите драйвер. Планшет должен начать работать сразу после завершения установки драйвера.
Теперь планшет работает исправно.

Анимированный GIF для индикации выполнения запроса

Сегодня искал анимированный GIF, чтобы организовать индикацию выполнения действий. На глаза попался сайт, где есть неплохой выбор - www.loadinfo.net. Все иконки, сгенерированные этим сайтом, заявлены как бесплатные. Лично мне приглянулась самая первая из них.

воскресенье, 28 октября 2012 г.

Wine 1.5.16 для Debian Squeeze/Wheezy

Сегодня залил в репозиторий Wine 1.5.16. Список изменений можно увидеть тут. Собраны бинарные пакеты для Debian Squeeze и Wheezy (только i386).

Меньше часа без электричества в XXI веке - размышления

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

Любопытно, что отключение совпало с началом просмотра сериала Revolution/Революция в котором описывается мир после глобального отключения электричества. Если переложить сюжет на мой случай, то оказывается не все так плохо при краткосрочном отключении.

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

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

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

Из неприятного было замечена смерть аккумулятора в ИБП - комп и пискнуть не успел как ИБП отключил нагрузку. Вроде такие аккумуляторы можно исправить, если просто долить в них дистилированной воды, но нет желания вскрывать необслуживаемую батарею и мучиться с доливкой. Я уже заказал новую, но сборку свежей версии Wine придется перезапускать руками. Уже после включения электричества (спасибо электрику, который живет где-то рядом и быстро устранил проблему) я решил почистить /var/cache/pbuilder/build и вместо
$ sudo pbuilder --clean 
сковбойничал и выполнил
$ sudo rm -fr --one-filesystem /var/cache/pbuilder
(почему-то отвлекся и не добавил /build/*). Остаток вечера ушел на восстановление работоспособности midnight commander buildbot. А случилось это из-за того, что на сервере который хранит все бэкапы, нет бэкапа этого же сервера - позор мне!

Еще один вывод, который напросился после отключения - вся квартира подключена на одну фазу а значит у меня есть возможность попробовать Powerline если мне станет нехватать 300Mbit по wi-fi.

пятница, 26 октября 2012 г.

среда, 17 октября 2012 г.

Ошибка обновления vzctl на RHEL/CentOS 5.x - решение

После выхода vzctl-4.0 появилась проблема с обновлением vzctl на RHEL/CentOS 5.x. Ошибка выглядит примерно так

# yum upgrade vzctl
Loaded plugins: dellsysid, fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.fdcservers.net
 * centosplus: mirror.beyondhosting.net
 * extras: mirror.sanctuaryhost.com
 * openvz-kernel-rhel5: mirror.fdcservers.net
 * openvz-utils: mirror.fdcservers.net
 * updates: mirror.wiredtree.com
Setting up Upgrade Process
Resolving Dependencies
--> Running transaction check
---> Package vzctl.x86_64 0:4.0-1 set to be updated
--> Processing Dependency: vzctl-core = 4.0-1 for package: vzctl
--> Processing Dependency: vzquota >= 3.1 for package: vzctl
--> Processing Dependency: libcgroup.so.1()(64bit) for package: vzctl
--> Processing Dependency: libvzctl-4.0.so()(64bit) for package: vzctl
--> Running transaction check
---> Package libcgroup.x86_64 0:0.38-1 set to be updated
---> Package vzctl-core.x86_64 0:4.0-1 set to be updated
---> Package vzquota.x86_64 0:3.1-1 set to be updated
--> Processing Conflict: vzctl conflicts ploop-lib < 1.5-1
--> Restarting Dependency Resolution with new changes.
--> Running transaction check
--> Processing Dependency: ploop-lib = 1.4 for package: ploop
---> Package ploop-lib.x86_64 0:1.5-1 set to be updated
--> Running transaction check
---> Package ploop.x86_64 0:1.5-1 set to be updated
--> Processing Conflict: ploop-lib conflicts vzkernel < 2.6.32-042stab061.1
--> Finished Dependency Resolution
ploop-lib-1.5-1.x86_64 from openvz-utils has depsolving problems
  --> ploop-lib conflicts with ovzkernel
Error: ploop-lib conflicts with ovzkernel
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest

Вчера в блоге OpenVZ нашлось решение этой проблемы. Если кратко то решение выглядит так:

# yum shell
> remove ploop ploop-lib
> update vzctl
> run

Поскольку поддержка ploop есть только в ядрах для RHEL/CentOS 6.x, то ploop можно смело удалить в RHEL/CentOS 5.x.

понедельник, 15 октября 2012 г.

Собрал Wine 1.5.15 для Debian

Собрал свежий релиз Wine 1.5.15 для Debian Squeeze и Debian Wheezy (только i386). Список изменений для новой версии. Установить можно из моего репозитария.

Проблемы с ipv6

Сегодня не удалось обновить систему из-за ошибки

E: Не удалось получить http://ftp.debian.org/debian/pool/main/e/eglibc/libc-bin_2.11.3-4_i386.deb: Невозможно инициализировать соединение с ftp.debian.org:80 (2001:610:1908:b000::148:12). - connect (101: Сеть недоступна) [IP: 2001:610:1908:b000::148:12 80]
E: Не удалось скорректировать недоступность пакетов

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

Для того, чтобы резолвер предпочитал ipv4 нужно в /etc/gai.conf раскомментировать строку

precedence ::ffff:0:0/96  100

После этого все работает как положено.

воскресенье, 7 октября 2012 г.

Пара моментов с которыми мне пришлось столкнуться при апгрейде ноутбука на Debian Wheezy

В этом посте я хочу поделиться парой моментов, с которыми мне пришлось столкнуться в процессе апгрейда моего ноутбука на Debian Wheezy.

Для начала я перешел на использование LVM2. Я уже упоминал об этом в предыдущем посте, но вкратце повторюсь. После миграции на LVM2 раздел подкачки переехал на лочический том и прошлая схема работы suspend2disk перестала работать. Для починки достаточно прописать в /etc/initramfs-tools/conf.d/resume правильный путь к логическому тому. У меня это /dev/laptop/swap, а значит добавляем нужную запись и обновляем initramfs.

$ echo RESUME=/dev/mapper/laptop-swap | sudo tee /etc/initramfs-tools/conf.d/resume
$ sudo update-initramfs -u

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

$ sudo hdparm -B /dev/sda

/dev/sda:
 APM_level    = 127

Если полученное значение равно 127, то его желательно сменить на 254. Однако проблема не в том, что установлена неверная политика, а в том, то не применились мои настройки hdparm, которые замечательно работали в squeeze. В /etc/hdparm.conf у меня жесткий диск был описан секцией

/dev/disk/by-id/ata-ST9160310AS_5SV0J5PE {
        apm = 254
        spindown_time = 60
}

Немного покопавшись в потрохах hdparm была найдена новая опция apm_battery которую я также добавил в конфиг. Передернув зарядное я так и не увидел изменение в поведении. В качестве последней догадки я попробовал сменить /dev/disk/by-id/ata-ST9160310AS_5SV0J5PE на /dev/sda. Вот тогда и заработало применение параметров. Скорее всего причина кроется в обработке события от UDEV, который вызывает /etc/init.d/hdparm hotplug.

Следующим шагом была наладка ACPI. В squeeze я пользовался eeepc-acpi-scripts для работы ACPI кнопок (звук, яркость, переключение экранов, etc), но после апгрейда на wheezy работа этих скриптов стала не очень. Часть функций перестало работать, а часть теперь возложено на acpi-support.

Разбираться в причинах поломки было лениво и тем более я решил попробовать xfce4 в качестве замены своему самопальному десктопу на базе openbox, tint2 и прочих мелочей. Удалив acpi-support, eeepc-acpi-scripts и все, что притянулось вместе с ними, я поставил xfce4-power-manager и не пожалел об этом.

Следующим моментом, с которым я столкнулся, был неработающий тачпад. В качестве быстрого фикса я переименовал /etc/X11/xorg.conf и перезапустил иксы. Тачпад заработал, но не работали "левый", "средний" и "правый" клики. Чтобы настроить поведение тачпада был добавлен /etc/X11/xorg.conf.d/10-synaptics.conf

Section "InputClass"
       Identifier "touchpad catchall"
       Driver "synaptics"
       MatchIsTouchpad "on"
       MatchDevicePath "/dev/input/event*"
           Option "TapButton1" "1"
           Option "TapButton2" "2"
           Option "TapButton3" "3"
EndSection

Дальше больше, стало очевидным, что интерфейс многих программ до апгрейда был значительно отзывчивее. Немного покурив /var/log/Xorg.0.log  я заметил, что сейчас используется акселерация UXA (а раньше была EXA) и вернуть прежнее поведение уже не получится (новый драйвер не поддерживает старую архитектуру). В интернете нагуглилось, что на смену UXA идет архитектура акселерации SNA (но она сейчас еще считается экспериментальной). Терять мне особо нечего, поэтому добавил /etc/X11/xorg.conf.d/20-video.conf

Section "Device"
 Identifier "Video0"
 Driver "intel"
 Option "AccelMethod" "sna"
EndSection

и перезагрузил иксы. После этой модификации скорость работы интерфейса значительно возросла. Правда за неделю работы я пару раз видел артефакты. Чтобы попробовать решить  этой проблему я обновил xserver-xorg-video-intel до версии, которая была в experimental и пока глюков не замечал (хотя вполне возможно, что прошло мало времени).


Последней проблемой стала неверная отрисовка виджета QSpinButton в Qt4. Я спрашивал помощи в рассылке debian-russian, где меня натолкнули на мысль что отрисовка виджетов зависит от движка используемой темы. Поскольку у меня стоит среда XFCE, то Qt4 использует движок GTK+. Чтобы проверить эту догадку, я поставил gtk2-engines-oxygen, gtk3-engines-oxygen и kde-style-oxygen. После выбора нужной темы в настройках интерфейс пришел в норму. Для единообразия внешнего вида я доустановил libreoffice-style-oxygen и oxygencursors. Теперь внешний вид большинства приложений выглядит одинаково.

Пожалуй будет нелишним указать, где меняется настройка оформления приложений KDE, когда не стоит сам KDE. Для этого нужно запустить

$ kcmshell4 icons

Возможно еще нужно выполнить после этого

$ kbuildsycoca4 --noinremental

чтобы обновить конфигурацию KDE.

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

Навскидку было сделано:
  • включение энергосбережения в snd-hda-intel (пропало после удаления eeepc-acpi-scripts);
  • отключение WOL для сетевой карт (добавлен параметр "ethernet-wol d" в /etc/network/interfaces);
  • включение управления питанием шины PCI-E.

Включение автоматического управления питанием делается через правило UDEV
$ cat /etc/udev/rules.d/10-runtime-pm.rules 
SUBSYSTEM!="pci", GOTO="power_runtime_rules_end"
ACTION!="add", GOTO="power_runtime_rules_end"

KERNEL=="????:??:??.?"
PROGRAM="/bin/sleep 0.1"

ATTR{power/control}=="*", ATTR{power/control}="auto"

LABEL="power_runtime_rules_end"

Кажется на этом и заканчивается все, что пришлось сделать в процессе апгрейда.

пятница, 5 октября 2012 г.

Свежие версии Wine для Debian

Какое-то время я пользовался Visio, запуская его в стареньком Windows XP на виртуальной машине. Позже мне надоело заниматься этим мазохизмом ради одного приложения и я собрал свежий Wine.

Поскольку сейчас на большинстве своих компьютеров я использую Debian Squeeze, то последняя дистрибутивная версия wine, котороя доступна для этого выпуска - 1.0.1. По меркам развития Wine это очень старая версия.

Для Debian есть неофициальная сборка от Kai Wasserbäch, но версия все равно старовата (сейчас там 1.5.5). Чтобы не слишком морочиться с пакетированием, я взял за основу его сборку и пересобрал ее со свежими исходниками.

Сейчас в моем репозитарии доступна версия 1.5.14 для Debian Squeeze и Wheezy (только i386). Для Squeeze есть более старые версии, но я сомневаюсь что они пригодятся кому-нибудь.

четверг, 27 сентября 2012 г.

Рабочий hibernate при использовании LVM2 swap

Вчерашний вечер ушел на миграцию дисковой подсистемы ноутбука на LVM2. С разбиением на разлелы я решил не хитрить (для ноутбука оно себя редко оправдывает) и сделал минимальное разбиение диска

/dev/sda1           /boot  ext2
/dev/sda2                  LVM2 PV

/dev/laptop/rootfs  /      ext4
/dev/laptop/home    /home  ext4
/dev/laptop/swap           swap

При этом я оставил небольшой запас (порядка 10GB) неиспользованного пространства в группе томов laptop чтобы была возможность использовать снапшоты либо создать дополнительный том в будущем.

Хочу отметить, что я стараюсь не использовать название групп томов в виде VolGroup0, vg0 и прочие, т.к. существует вероятность того, что эту группу томов придется активировать на другом компе и там окажется группа томов с таким же названием.

Если вы мигрируете существующую систему и используете swap на LVM2, то для корректной работы засыпания на диск (hibernation) нужно проверить настройку initramfs-tools.

Логический том имеет название /dev/laptop/swap, но в настройку нужно внести generic путь из device-mapper - для моего случая это будет /dev/mapper/laptop-swap

Остается обновить конфигурацию initramfs-tools и перегенерировать initramfs

# echo 'RESUME=/dev/mapper/laptop-swap' > /etc/initramfs-tools/conf.d/resume
# update-initramfs -u

Теперь для работы hibernate не нужно писать параметр resume= в опциях ядра.

среда, 26 сентября 2012 г.

Новые версии vzctl и ploop

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

Обычно проверив список обовляемых пакетов я топаю на сервер и выполняю там

# yum upgrade

Но сегодня видимо особый день и привычный процесс отвалился с множеством ошибок и конфликтов зависимостей. В списке конфликтов были vzctl и ploop, которым не понравилась версия ядра vzkernel (установлено последнее доступное openvz-ядро для CentOS 5).

Ответ нашелся в списке новостей на сайте openvz. Оказалось, что вчера вышли новые версии vzctl и ploop и для работы последнего нужно работающее ядро vzkernel >= 2.6.32-042stab061.1. Причем нет возможности отдельно обновить vzctl поскольку ему нужен свежий ploop.

Чтобы попытки обновить vzctl и ploop не мешали установке других апдейтов, пришлось отключить секцию openvz-utils в yum (еще можно добавить их в exclude в /etc/yum.conf, но мне проще вырубить всю ветку).

Из приятных новостей - в vzctl добавили возможность работать на относительно свежих немодифицированных ядрах. При этом пока такая поддержка объявлена экспериментальной и похоже ничего кроме как запустить контейнер у вас не получится (сейчас даже штатное выключение контейнера не работает). Полный список фич: vzctl-4.0, ploop-1.5

В процессе прочтения новостей, наткнулся на видео, где показывают разницу между online и offline миграцией в openvz.

суббота, 15 сентября 2012 г.

New Midnight Commander bugfix releases

Only few days passed after previous Midnight Commander release. Yesterday I got email notification about Midnight Commander bugfix release.

ChangeLog
Debian/Ubuntu repositories was freezed because of the upcoming Wheezy release, so you can find the latest versions in my repository.

четверг, 13 сентября 2012 г.

Простой HTTP сервер на perl

Сегодня нужно было проверить скорость HTTP соединения на сервере без использования установленного там Apachе (были подозрения, что скорость HTTP соединений ограничивал либо сам Apache, либо внешний шейпер).

Немного погуглил и нашел простенький скрипт написанный на perl, который только отдает один файл на заранее определенный запрос.

#!/usr/bin/env perl

use HTTP::Daemon;
use HTTP::Status;

my $d = new HTTP::Daemon
            LocalAddr   => '0.0.0.0',
            LocalPort   => '8080';
print "Please contact me at: url, ">\n";
while (my $c = $d->accept) {
    while (my $r = $c->get_request) {
        if ($r->method eq 'GET' and $r->url->path eq "/speed-test") {
            $c->send_file_response("/tmp/test.bin");
        } else {
            $c->send_error(RC_FORBIDDEN)
        }
    }
    $c->close;
    undef($c);
}

В этом варианте скрипт начинает слушать порт 8080 на всех доступных интерфейсах и отдает файл /tmp/test.bin на запрос "GET /speed-test HTTP/1.0". Ну или можно открыть в браузере ссылку http://server-ip:8080/speed-test

среда, 12 сентября 2012 г.

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

Пробрасывание внешнего ip на виртуальный сервер

Редко, но метко в моей практике возникает задача, когда нужно быстро поднять сервер с "белым ip" для демонстрации результатов работы или просто для целей тестирования нового функционала перед выкатыванием его в продакшен. Каждый раз арендовать VDS для этого накладно, а связываться с облаками для подобных целей мне не хочется.

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

среда, 29 августа 2012 г.

Как получить доступ к серверу через SSH, имея только виртуальный FTP аккаунт

Сегодня попался довольно интересный случай в саппорте, где пришлось отлаживать работу приложения на PHP, имея только виртуальный FTP аккаунт. В качестве примера я буду называть сайт www.example.com и FTP аккаунт supportuser@example.com, ограниченный корневой директорией исходников сайта. Сервер, на котором расположен сайт, работает под управлением WHM/cPanel.

Моя цель - получить доступ к логам вебсервера (которые находятся вне корневой директории сайта), чтобы понять причину глюков в работе приложения. В корне сайта валяется файлик error_log, но его содерживое не содержит ничего полезного, его происходит ошибка уровнем выше, чем интерпретатор PHP.

пятница, 24 августа 2012 г.

Сборка недостающих модулей ядра для платформы Android

Давненько мне хотелось попробовать себя в сборке модулей ядра для моего телефона на базе Android. Вчера мне потребовался OpenVPN, но для его работы нужен модуль tun/tap, который отсутствует в моей прошивке. Поискав по маркету я нашел приложение TUN.ko Installer, которое позволяет установить модуль нужной вам версии, если такой есть в репозитории проекта. Но поскольку спать еще не хотелось, и простых решения я не искал, то было решено собрать модуль самостоятельно.

пятница, 27 июля 2012 г.

Workflow: SSL сертификаты

Одна из рутинных операций, с которыми приходится сталкиваться системному администратору - управление SSL сертификатами. Я постараюсь собрать на одной странице справочное руководство, которое поможет управлять жизненным циклом сертификата. Для наглядности процесса я буду описывать процедуру в контексте WEB сервера (в остальных случаях многое совпадает, хотя есть и различия).

Для себя я выделяю несколько этапов в жизненном цикле SSL сертификата:
  • создание SSL сертификата
  • установка SSL сертификата
  • мониторинг валидности и срока окончания SSL сертификата

пятница, 13 июля 2012 г.

Создание бинарного пакета с debug-символами в debian

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

В моем случае это был tinymount, который я когда-то пакетировал ради интереса и сейчас наткнулся на ошибку в его новой версии. В моем варианте пакета отладочные символы были исключены и я добавил пару изменений в debian/control, debian/rules (сделал на примере отсюда) чтобы их получить.

$ echo >> debian/control << EOF

Package: tinymount-dbg
Architecture: any
Section: debug
Priority: extra
Depends: tinymount (= ${binary:Version}), ${misc:Depends}
Description: debugging symbols for tinymount
 Tinymount is a simple UI tool to mount/unmount disks using UDisks.
 .
 This package contains the debugging symbols for tinymount.
EOF

$ echo >> debian/rules << EOF
DEB_DESTDIR := $(CURDIR)/debian/tinymount
EOF

После чего увеличил версию пакета:

dch -v '0.2.5~pre-2' 'Added debug symbols'

и собрал его

$ debuild -us -uc

В отчете lintian (его запускает debuild после окончании сборки) помимо отсутствующей страницы man для tinymount была ругань на "пустой пакет" tinymount-dbg. Он оказался почти пустым, т.к. отладочных символов в нем действительно не было.

Дальше было больше часа попыток нагулить причину. Но озарение пришло только после вдумчивого чтения логов сборки пакета (логи рулят!). При выполнении цели install в сгенеренном qmake'ом Makefile'е выполнялся strip для инсталируемого бинарника. Вот потому dh_strip и не находил никаких отладочных символов.

Немного порывшись в документации на qmake, я добавил в debian/rules к параметру DEB_QMAKE_ARGS значение CONFIG+=debug. После этого пересборка пакета и символы появились как и ожидалось.

четверг, 5 июля 2012 г.

Maintenance page для сайтов, которые обслуживаются Apache

Я уже писал про maintenance page для сайтов, которые обслуживаются Nginx, а сегодня добавлю пример такой страницы для Apache.

Содержимое страницы maintenance.html остается прежним:

<html>
<head>
<title>Server Maintenance</title>
</head>
<body>
<center>
<h1>Server maintenance</h1>
Our apologies for the temporary inconvenience. The page is temporarily unavailable as server is down for scheduled maintenance. We will be back soon.
</center>
</body>
</html>
/var/www/maintenance/maintenance.html

Чтобы Apache выдавал страницу с кодом 503, нужно немного доработать .htaccess:

ErrorDocument 503 /maintenance.html 

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/maintenance.html$
    RewriteCond %{REMOTE_ADDR} !1.2.3.4
    RewriteRule .* /maintenance.html [R=503,L]
</IfModule>
/var/www/maintenance/.htaccess

После этого maintenance страницу будет показывать всем кроме тех, кто заходит на сайт с ip 1.2.3.4.

суббота, 30 июня 2012 г.

DEADBEEF 0.5.5

Уже прошел почти месяц с тех пор, как был анонсирована новая версия плеера DEADBEEF 0.5.5. Список изменений у новой версии довольно впечатляющий, хотя по сути все это исправления существующих ошибок.

changelog since 0.5.4

  • fixed converter GUI plugin crash if the converter plugin not found
  • fixed compiling on FreeBSD
  • fixed race condition bug in streamer
  • fixed flac embedded cover loading bug
  • fixed multiline tag field editing
  • fixed vorbis streaming audio bug
  • fixed numlock handling in global hotkeys setup
  • fixed KP_Return not working
  • fixed filename being ignored in the search window
  • fixed session saving on reboot/logout using XSMP via eggsmclient
  • fixed few missing translation strings
  • fixed many instability issues caused by improper use of pl_find_meta[_raw] calls
  • fixed improper use of GtkStyle in playlist and tabs widgets
  • fixed prev/next handling when playback is stopped
  • fixed random playback bug caused by libsidplay2 calling srand(time(NULL))
  • fixed crash in adplug when playing ADL files
  • fixed crash in aac reload metadata
  • fixed Grandia - Parallel Trippers.gbs crash in GME plugin
  • fixed crash in GME plugin when a file doesn't exist
  • fixed integer overflow bug in float32->int32 conversion
  • fixed m3u parser string copy bug
  • fixed several dsp bugs in the converter
  • fixed up/down buttons in the converter's dsp preset editor
  • fixed selected row bugs in dsp preset editors in gtkui preferences and converter
  • fixed parent window of dsp plugin configure window
  • fixed all known issues in gtk3 plugin -- it should be fully working now
На этой неделе в блоге появился комментарий, где спрашивали буду ли я поддерживать обновление версий deadbeef в своем репозитарии. На тот момент я отписался, что буду это делать, если в этом будет смысл, поскольку проект собирает бинарные пакеты, пригодные для Debian/Ubuntu.

Уже позже, вечером, я начал ковырять пакет, который готовит апстрим, чтобы сравнить его с моей последней сборкой (у меня была только версия 0.5.2 в репозитарии). ИМХО недостатки официального пакета:
  • устанавливается в /opt/deadbeef, но не делает ссылку на бинарник в /usr/bin (нет возможности запустить из консоли не прописав полный путь);
  • не работает pause toggle при клике средней кнопкой на иконку deadbeef в трее (в принципе не критично, если настроены глобальные комбинации);
  • не работает регулировка громкости, если прокручивать колесо мыши над иконкой deadbeef в трее;
  • недостающие recommended зависимости приходится ставить руками (поскольку пакет ставится не через APT, то установка проходит нормально, но при запуске пакет ругается в консоли - у меня к примеру не стояли libcddb2 и libzip1).
В принципе ничего критичного нет, но похоже большинство привыкло получать обновления из APT. Потому я зарядил новую подсистему своего buildbot'а на сборку пакета 0.5.5 под Debian/Ubuntu.

В итоге сейчас пакет доступен для:
  • Debian: Squeeze, Wheezy, Sid (i386, amd64);
  • Ubuntu: Maverick, Lucid, Oneiric, Natty, Precise (i386, amd64).
Чтобы добавить себе мой репозитарий, смотрите инструкции тут.

пятница, 29 июня 2012 г.

Увеличение числа одновременно открытых файлов в MySQL сервере

Сегодня довелось решать проблему с превышением лимита одновременно открытых файлов у MySQL сервера. Ошибка, которая свидетельствует о такой проблеме выглядит так:

MySQL Error: Out of resources when opening file './db_name/table_name.MYD' (Errcode: 24)

Поскольку все коды ошибок я на память не помню, то первым делом заглянул в вывод perror:

$ perror 24
OS error code  24:  Too many open files

Смотрим сколько разрешено открывать файловых дескрипторов пользователю mysql (пользователь, с правами которого работает MySQL сервер).

$ sudo su - mysql -c 'ulimit -n'
1024

Далее смотрим, сколько дескрипторов разрешено в MySQL:

$ mysql -se "show variables like 'open_files_limit'"
Variable_name       Value
open_files_limit    1024

Увеличим лимит в 4 раза, до 4096:

$ echo 'mysql  -  nofile  4096' | sudo tee -a /etc/security/limits.d/mysql.conf
$ sudo su - mysql -c 'ulimit -n'
4096

Если лимит не изменился, то нужно посмотреть где подключен pam_limits.so в конфигурации PAM.

$ grep -r limits /etc/pam.*
/etc/pam.d/sshd:session    required     pam_limits.so
/etc/pam.d/atd:session    required   pam_limits.so
/etc/pam.d/login:session    required   pam_limits.so
/etc/pam.d/sudo:session required pam_limits.so
/etc/pam.d/cron:session    required   pam_limits.so
/etc/pam.d/su:# session    required   pam_limits.so

Для Debian нужно добавить строку session required pam_limits.so в /etc/pam.d/common-session

$ echo 'session required pam_limits.so' | sudo tee -a /etc/pam.d/common-session

Осталось поправить конфиг MySQL, чтобы сервер начал использовать новый лимит. Для этого в my.cnf в секцию [mysqld] добавляем строчку

open_files_limit = 4096

пятница, 22 июня 2012 г.

Ночные сборки Midnight Commander получили поддержку SFTP

Вчера в багтрекере проекта Midnight Commander был закрыт тикет 1535, который знаменует добавление начальной поддержки протокола SFTP в master ветку репозитария (именно из нее делаются пакеты для nightly ветки моего репозитария).

Для сборки теперь требуется libssh2 с минимальной версией 1.2.5. Однако для полноценной работы с ssh-agent нужна версия старше (в Debian Squeeze сейчас 1.2.6 и с ней авторизация по агенту не работает). Я проводил небольшие изыскания по этому вопросу и остановился на версии 1.3.0 (которая доступна в моем репозитарии).

В этой версии поддерживается работа с ~/.ssh/config. Т.е. теперь вместо указания username@hostname, можно указать соответствующий алиас из конфига. Например у меня есть учетка andrey@192.168.16.170, которая доступна по ssh ключу ~/.ssh/support. Соотвествующая запись в ~/.ssh/config будет

Host support
HostName 192.168.16.170
User andrey
IdentityFile ~/.ssh/support

И при входе по SFTP я укажу support вместо прописывания полной записи. Причем похоже ~/.ssh/config - единственный способ использовать public key авторизацию.

Редко новые фичи бывают без косяков. В этот раз похоже поломали работу с ssh алиасами из ~/.ssh/config при переносе из бранча в master ветку. Так если зайти через username@hostname, то все работает быстро и приятно, а если использовать алиас, то midnight циклически начинает открывать соединения и в итоге их на сервере становится больше 30 (по крайней мере у меня было запущено больше 30 копий sftp-server и тормозило это безбожно).

В дополнении обнаружилась проблема с копированием файлов - они не копируются вовсе (создается пустой файл). Не работает переключение на sftp подключение в списке активных VFS (Ctrl + X A). Там подключение выглядит как //sftp://, вместо sftp://username@hostname/.

Думаю, что в ближайшее время все баги будут исправлены и midnight получит новую фичу в свой арсенал.

понедельник, 18 июня 2012 г.

Сборка RPM пакетов без прав root

В дефолтной конфигурации CentOS в качестве корневой директории при сборке пакетов используется /usr/src/redhat. Такой подход требует прав root, поскольку владельцем и группой у /usr/src/redhat является root.

Чтобы избежать возможной порчи системы при сборке новой версии пакета (все вспомнили rm -fr /usr /lib/nvidia у bumblebee) полезно создать отдельного пользователя, например build.

# useradd -s /bin/bash build

Затем настроить локальный buildroot для сборки пакетов и собирать их уже от имени пользователя build.

# su - build
$ mkdir -p ~/RPM/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ cat > ~/.rpmmacros << EOF
%_topdir %(echo $HOME)/RPM
EOF
$ rpmbuild -ta courier-imap-4.9.3.tar.bz2

Собранный пакет будет находиться в ~/RPM/RPMS/x86_64/courier-imap-4.9.3-1.x86_64.rpm (если архитектура x86_64).

пятница, 15 июня 2012 г.

Zalman ZM-VE200 SE - выкидываем болванки в мусорку

Про Zalman ZM-VE200 - внешний бокс, способный эмулировать ISO образы, я впервые узнал на Хабрахабре более года назад. Тогда его обзор казался чем то вроде манны небесной для технаря, вынужденного пользоваться загрузочными дисками в своей повседневной работе.

На тот момент от покупки остановило его отсутствие в продаже в Минске и завышенная цена на eBay (тогда за него просили 70-90$ без учета доставки). Выгоднее было купить простой USB DVD-ROM и сотню болванок, а разницу потратить по обстоятельствам.

Спустя год новые обстоятельства заставили вернуться к рассмотрению старого вопроса. Нужно решение, которое позволит оперативно запустить компьютер с нужной болванкой. Чаще всего это либо Finnix (минималистичный дистрибутив) либо CloneZilla (решение для клонирования эталонных конфигураций, вполне подойдет для создания и восстановления резервных копий). Есть еще набор дисков, вроде различных инсталяков, live антивирусов и т.д., но ими пользуемся гораздо реже.

У меня есть свободный IDE DVD-RW привод, но во-первых нужно каждый раз разбирать системный блок, чтобы подключить его, а во-вторых у новых материнских плат может не быть IDE порта.

Варианты решения проблемы, которые родились после небольшого мозгового штурма:
  1. Подготовить эталонный образ для usb flash, который будет включать в себя все необходимое (был отброшен после попытки скрестить finnix, clonezilla и live антивирусы). Дополнительно появляется проблема с обновлениями, если выходит новая версия инструмента с нужными фичами.
  2. Приобрести USB DVD привод и стопку болванок (для последующих обновлений). Я тестировал Lite-On eSAU108 и остался им доволен.
  3. Купить usb бокс от Zalman, способный эмулировать ISO образы (а тажке ряд других), как виртуальный USB-DVD/BlueRay привод.
На мой взгляд последнее решение самое оптимальное, т.к. при прочих равных исключается необходимость хранить пачку болванок (которые за год-два придут в негодность) и носить их с собой, поскольку заранее неизвестно, что потребуется в конкретном случае.

Просмотрев предложения минских фирм, был заказан Zalman ZM-VE200 SE серебристого цвета (на форумах жалуются, что черный вариант очень маркий). ZM-VE200 SE похоже отличается от ZM-VE200 только отстутствием eSATA кабеля в коробке (у меня уже есть такой от бокса D-Sparrow).

После приобретения установил в него свой старенький WD Scorpio Blue 250 BEVS. Коробка завелась с родным кабелем (подключается к одному USB порту), но после начала активной работы с диском "отвалилась" в системе. Я уже был в курсе про проблему с нехваткой питания от одного порта (один только жесткий диск требует 5V 0.55A для нормальной работы - уже больше, чем может отдать один USB 2.0 порт, а ведь сюда нужно добавить потребление самого бокса).

В общем родной кабель отправился в тумбочку, а бокс был подключен через Y-USB кабель, который использует два порта для более надежного питания. После этого бокс прошел небольшое стресс-тестирование. В процессе теста бокс здорово разогрелся (~43°C), но к ошибкам это не привело.

Из полезных фич - мониторинг температуры и состояния диска. Также полезным оказалась возможность остановить шпиндель диска, отклонив на пару секунд "jog dial" вниз - здорово помогает в Windows 7, которая не выключает питаение USB порта при безопасном извлечение устройства.

И напоследок самая желанная фича - возможность выставить read-only режим физическим переключателем! Да, я знаю, что и сейчас есть подобные флешки (те же Qumo Yin & Yan), но все боксы, что я видел, не имели этой фичи.

Подводя итог - я доволен своим приобретением.

воскресенье, 3 июня 2012 г.

Установка OpenWrt на TP-LINK TL-WA901ND (hw rev 2.2)

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


Пару месяцев назад я приобрел точку доступа TP-LINK TL-WA901ND на замену своему старенькому роутеру D-Link DIR-320. Последний прослужил мне верой и правдой несколько лет, сначала работая на родной прошивке (было много глюков и каждый апдейт прошивки от производителя что-то чинил, а что-то ломал), потом была DD-WRT, а закончил роутер свой путь с OpenWRT на борту.

Последняя прошивка доставила массу положительных эмоций. Работа роутера стала надежной и предсказуемой, а настройки по-умолчанию устроили меня почти полностью (пришлось немного допилить, чтобы перенести свои наработки с dd-wrt, но это мелочи).

Первое знакомство с прошивкой от TP-Link порадовало своей простотой и продуманностью настроек. После подключения я сделал пару замеров скорости - выходили стабильные 80-110Mb/s при работе как со стационарного компа, так и нетбука.

А вот вчерашний вечер стал темным пятном на репутации tp-link'а - внезапно начал заикаться XBMC при проигрывании фильмов с домашнего сервера к которому он подключен через WI-FI. Тогда было лень разбираться в причинах и я просто пошел спать оставив проблему на следующий день.

Сегодня сев за комп, я вспомнил про вчерашние проблемы у проигрывателя и решил посмотреть в чем причина его "заиканий". Попытка скопировать фильм на комп показала скорость около 600-800kb/s - блин! и это на оборудовании стандарта N. Первым делом перезагрузил точку доступа - не помогло. Потом при помощи смартфона просканил диапазон - мало-ли кто-то еще сел на мой канал и мешает работе точки - такого злодея не нашлось.

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

Пока я искал прошивку - наткнулся на упоминание, что модель TL-WA901ND поддерживается в DD-WRT (правда только ревизия v1.x). Дальнейшее изучение форумов дало наводку на OpenWRT, где уже имеется поддержка моей ревизии.

ВАЖНО! Для завершения установки новой прошивки вам необходимо обеспечить доступ устройства в интернет через LAN порт. Если вы не знаете как это сделать не пытайтесь обновить прошивку устройства!

Важно правильно определить аппаратную ревизию вашего устройства: V1.x или V2.x. Если вы не знаете как это сделать смотрите тут. Для прошивки через web-админку TP-Link нужна прошивка с суффиксом -factory, прошивки с суффиксом -sysupgrade подходят ТОЛЬКО для обновления уже установленной OpenWRT.

Следуя инструкции, скачал  прошивку, собранную из trunk. Залил ее через "Firmware upgrade" в web-интерфейсе прошивки TP-Link. После завершения роутер перезагрузился и в сети появился адрес 192.168.1.1.

Дальше нужно зайти через telnet на устройство и провести первоначальную настройку. У меня Linux, но для Windows вам подойдет putty. Настройте параметры "Host Name (or IP address)", "Port" и "Connection type" как показано на скриншоте и жмите кнопку "Open".


Затем задал пароль root и после этого смог зайти по SSH. После настроил резолвер, дефолтный гейтвей и поставил luci.

# passwd root
# echo 'nameserver 8.8.8.8' > /etc/resolv.conf
# route add default gw ip-адрес-вашего-шлюза-в-интернет
# opkg update
# opkg install luci
# /etc/init.d/uhttpd enable
# /etc/init.d/uhttpd start

После этого можно было зайти в web интерфейс Luci (http://192.168.1.1/) и настроить точку доступа окончательно. После всех настроек скорость копирования через NFS/SCP/SMB поднялась до 7-9MB/s что вполне хорошо и соответствует моим ожиданиям.


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

воскресенье, 20 мая 2012 г.

Защищаем паролем редактирование меню в загрузчике grub2

При использовании загзузчика grub/grub2 существует простой способ получить права суперпользователя в системе. Для этого в меню загрузчика нужно нажать "E" и добавить в строку с параметрами ядра опцию init=/bin/bash. После загрузить систему и сменить пароль на нужный.
Чтобы исключить возможность менять конфигурацию загрузчика вне загруженной системы нужно установить пароль на загрузчик. В этом случае загрузить систему можно будет любому, а вот поменять конфигурацию только тем, кто знает логин/пароль.
Создание пароля - процесс простой:
# grub-mkpasswd-pbkdf2 
Enter password: 
Reenter password: 
Your PBKDF2 is grub.pbkdf2.sha512.10000.2D4EE33EEE342503888D967084246F3CB9328B9A5C731439FD1AD70E3AB7637FA294942A049546CECBFBCFE8582D1F833B92B18C0F124C1003F766259DFB9BD2.86F1A8963F23E588FF3D04F104E9245858CD12BB8F0A9A8B849B61735E8300D33CD399F28A58AB696E2F7F482ABB93C65B8B79342B94C9C2A7A59DA3AF03B8D8
Полученную строку нужно добавить в скрипт из которого генерируется конфигурация grub2. Чтобы не было проблем с конфигом при обновлении пакета, я создал отдельный файл /etc/grub.d/05_password.
#!/bin/sh

set -e

cat << EOF
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.2D4EE33EEE342503888D967084246F3CB9328B9A5C731439FD1AD70E3AB7637FA294942A049546CECBFBCFE8582D1F833B92B18C0F124C1003F766259DFB9BD2.86F1A8963F23E588FF3D04F104E9245858CD12BB8F0A9A8B849B61735E8300D33CD399F28A58AB696E2F7F482ABB93C65B8B79342B94C9C2A7A59DA3AF03B8D8
EOF
Последний штрих - поправить права на новый файл и сгенерировать новый конфиг:
# chown root:root /etc/grub.d/05_password
# chmod 600 /etc/grub.d/05_password
# update-grub

суббота, 19 мая 2012 г.

Лучшее враг хорошему или работает - не трогай

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

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

Вот наконец разобрался. Началось с того, что потребовался VPN клиент для IPSec. Я быстренько сделал бэкпорт пакета ike (VPN клиент от Shrew Soft Inc.) версии 2.1.7 для squeeze, закинул его в структуру репозитария и запустил скрипт обновления.

По окончании работы скрипта я начал ставить пакет и очень удивился, когда в доступных версиях оказалась только 2.1.5, которая доступна для squeeze из его родного репозитария. Далее я посмотрел список доступных версий для пакета ike - была доступна только одна версия.

Полез проверять, туда ли я закинул пакет (уже пару раз ошибался в спешке и в итоге пакет не добавляло в списки). В этот раз все было в порядке.

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

Быстренько поправил скрипт, синхронизировал изменения на сервере (чтобы повторно не заливать все изменения, которые нагенерил buildbot за это время) и запустил обновление еще раз.

В этот раз все прошло как и ожидалось и aptitude предложил поставить нужную версию.

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

среда, 16 мая 2012 г.

Делаем бэкап перед обновлением системы средствами LVM

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

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

Чтобы не было неприятных сюрпризов перед обновлением, мне нужно сделать бэкап, причем желательно таким образом, чтобы была возможность возиться с "последствиями" обновления и иметь возможность быстро переключиться на стабильный Squeeze. Если делать это по-старинке, то мне придется делать зеркало системных файлов на домашний комп, причем в двух вариантах (стабильный squeeze и обновление на wheezy). Понятное дело, что восстановиться из такого бэкапа в полевых условиях не получится (если вдруг всплывет косяк, связанный с обновлением). Нужна возможность держать всю информацию на самом нетбуке, но проблема в том, что там просто нету столько свободного места, чтобы держать две полные копии системы. Потому я начал искать новое решение...

В общих чертах меня могла бы спасти BTRFS у которой есть поддержка снапшотов на уровне файловой системы (т.е. в снапшотах хранится только разница относительно базы, с которой они были созданы). Но btrfs еще в стадии разработки и спотыкаться об ее недоработки нет желания.

Далее вспомнилось, что в самом начале освоения LVM я пробовал делать снапшоты перед обновлением системы. Если обновление нужно было отменить, то приходилось монтировать снапшот и затем rsync'ом приводить систему в чувство. Но хочется чего-то проще. Что-то вроде сделал снапшот и если результат обновления не нравится - просто возвращаем исходное состояние нужному LVM тому, используя для этого соответствующий снапшот.

Пока искал выход нагуглил новость о том, что начиная с ядра 2.6.33 появилась возможность объединять LVM том и его снапшот - BINGO! - как раз то, что нужно мне и без лишних телодвижений.

Разбивка диска на нетбуке у меня не слишком мудреная:

/dev/sda1  /boot  ext2
/dev/sda2  LVM PV
/dev/sda3  SWAP

/dev/laptop/rootfs  /  ext4
/dev/laptop/home  /home

Посколько /boot находится вне LVM, то я сделал его копию:

# rsync -a /boot/ /boot~lvm/

Смотрим, сколько у меня места в группе томов (VG), еще не размеченного под логические тома (LV):

# vgs
  VG        #PV #LV #SN Attr   VSize   VFree
  laptop      1   2   0 wz--n- 156,2g  15,44g

Далее делаем снапшоты всех разделов:

# sync
# lvcreate -s -n rootfs-before -L 5G laptop/rootfs
# lvcreate -s -n home-before -L 1G laptop/home

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

# lvcreate -s -n rootfs-after -L 7G laptop/rootfs
# lvcreate -s -n home-after -L 1G laptop/home
# lvconvert --merge laptop/rootfs-before
# lvconvert --merge laptop/home-before

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

Если в процессе обновления поменялось содержимое /boot, то после перезагрузки или при помощи LiveCD/LiveUSB его можно восстановить так:

# rsync -a --delete /boot~lvm/ /boot/
# rm -fr /boot~lvm
# update-grub

После завершения слияния, пространство, занятое под laptop/rootfs-before и laptop/home-before освободится. Аналочично поступаем, если нужно вернуться в играм с обновлением.

понедельник, 14 мая 2012 г.

Windows XP: замена материнской платы

Как правило замена материнской платы в компьютере под управлением Windows влечет набор неудобств начиная от необходимости повторной активации до BSOD "Stop 0x0000007B". В последнем случае windows не находит загрузочное устройство, поскольку отсутствуют драйвера для дискового контроллера.

Есть небольшая хитрость, позволяющая избежать BSOD и поставить драйвера на уже новую материнскую плату. Для этого перед заменой платы нужно обновить драйвер дискового контроллера на "Standard Dual Channel PCI IDE Controller". После этого загрузка на новой плате должна пройти без проблем.

Остается только удалить драйвера для устройств, которые использовались на старой плате. Для этого нужно выполнить две команды в сеансе интерпретатора:

\> set devmgr_show_nonpresent_devices=1
\> devmgmt.msc

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

четверг, 10 мая 2012 г.

Вышел английский перевод книги "The Debian Administrator's Handbook"

Как и обещали авторы книги "The Debian Administrator's Handbook" ее английский перевод доступен для всех желающих под свободной лицензией. Книга доступна для скачивания в нескольких форматах: pdf, epub и mobipocket.

Для владельцев электронных читалок будут особенно интересны два последних. На моем киндле книжка смотрится просто замечательно. Верстка приятная, а текст легко читается (главы не перегружены излишней информацией).

Примечательно то, что эта книга написана разработчиками Debian и содержит актуальную информацию.

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

Deadbeef 0.5.4 (bugfix release)

Today available deadbeef 0.5.4 with some minor (at least for me) fixes. For those who curious about changelog I placed it below

changelog since 0.5.3

  • fixed starting the player using "deadbeef" command without path
  • fixed missing ; in deadbeef.desktop
  • fixed big-endian support in sndfile plugin
Ubuntu/Debian packages available at project download page.

среда, 9 мая 2012 г.

Deadbeef 0.5.3 released

New deadbeef music player was released recently. For this release author prepared binary builds for Debian/Ubuntu (available at there). For other platforms available static binary build which distributed as tar.gz archive.

Changelog very impressive. Added many features and also many bugs fixed.

changelog since 0.5.2

  • m3u: fixed few parser bugs; added audio/x-scpls mime-type support; fixed m3uext support
  • adplug: upgraded to 2.2.1, added fake-surround support and emu selection
  • added ShellExec GUI configuration support (thanks to Azeem Arshad)
  • fixed id3v2 parser whitespace trimming bug
  • "Stop after current" can be reconfigured to be auto-reset each time
  • auto-save EQ state on every change
  • gcc 4.7 compile fix in SID plugin
  • added new Sort->Random feature, to randomize the playlist (thanks to Defusix)
  • converter: fixed writing wav files sized over 2 gigs
  • converter: added support for reconstructing of the folder structrure based on longest common root folder
  • converter: added support for writing files to the source track folders
  • fixed possible hang caused by race condition in the alsa/streamer interaction
  • wildmidi: fixed possible linking errors
  • fixed ignoring cuesheet and log fields in search
  • added support for TXX DATE field as written by FB2K
  • bogus "plugin.so file not found" errors are no longer printed
  • fixed bug in search window causing all tracks to become selected on some actions
  • fixed possible crash when loading corrupted playlist files
  • EQ window will reflect changes in the DSP chain configuration
  • fixed excessive CPU load while streamer is waiting for the last track to finish
  • alsa: fixed sleep time bug, which should improve CPU load (thanks to Martin Panter)
  • alsa: fixed buffer underrun handling problem which was causing sound jittering on slow media like sshfs, cd, etc (thanks to Martin Panter)
  • mp3: added option to disable gapless playback, but improve speed (thanks to Martin Panter)
  • aac: fix to potential reading past the end of array (thanks to Martin Panter)
  • new default cover-art image by TheSame
  • fixed loading m3u/pls over http when the file size is unknown
  • added m3u and pls url mime types (audio/x-mpegurl;audio/x-scpls) to deadbeef.desktop
The most notable thing in Debian/Ubuntu package - deadbeef binary placed in /opt/deadbeef/bin. So if you want to run binary from command line you should add /opt/deadbeef/bin to your PATH variable. Example for bash:

$ cat >> ~/.bashrc << EOF
if [ -d /opt/deadbeef/bin ]; then
     export PATH=/opt/deadbeef/bin:$PATH
fi
EOF

Enjoy new release.

суббота, 5 мая 2012 г.

Новый провайдер

Старый провайдер замучил своим криво работающим шейпером для безлимитных тарифов. Я пользовался услугами BelInfoNet (adsl.by) и в принципе был доволен, пока сидел на тарифе с предоплаченным траффиком. Был доволен почти, т.к. для доступа в интернет они используют PPTP и мой старенький D-Link DIR-320 с OpenWRT на борту не справлялся с 10Mb/s потоком. Максимум, что могло удержать железо - 4-5 Mb/s. Конечно можно было бы поиграться с accel-pptp, но мне было лениво.

После появления у меня дома выделенного сервера я перешел на безлимитный тариф и тогда начались проблемы. Переодически соединение начинало терять пакеты или просто рвать сессию, при этом в лог pppd постоянно сыпались ошибки вида:

pptp[17208]: anon log[decaps_gre:pptp_gre.c:414]: buffering packet 61512626 (expecting 61512621, lost or reordered)

Это наводило на мысль о проблемах с шейпером провайдера (т.к. до перехода на безлимит проблемы не было). Реализация PPTP клиента в Linux не самая идеальная, в добавок потери пакетов... короче надоело. С мая решил переключиться на ByFLY, т.к. с ними таких проблем не будет.

Подключался к BelInfoNet я через заявку на сайте (т.е. в офис ехать не пришлось), а вот чтобы отключиться пришлось. Мало того, что настоятельно попросили пояснить причины отключения, так еще это оказалось платной услугой! Недорогой к слову (примерно 2.5$), но я первый раз сталкиваюсь с ситуацией, когда хотят денег за отключение.

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

пятница, 4 мая 2012 г.

Пароль админа в MySQL сервере если стоит панель Plesk

Если на сервере стоит панель управления Parallels Plesk, то зачастую владелец сервера понятия не имеет о пароле root в MySQL. Чтобы узнать его самостоятельно логинимся в SSH под root. Затем находим пароль в /etc/psa/.psa.shadow

# cat /etc/psa/.psa.shadow
therootpassword

Имя пользователя будет не root, а admin. Чтобы не вводить его каждый раз руками я рекомендую сохранить его в ~/.my.cnf (доступный на чтение только root)

# touch ~/.my.cnf
# chown root:root ~/.my.cnf
# chmod 600 ~/.my.cnf
# cat > ~/.my.cnf << EOF
[client]
user=admin
password=therootpassword
EOF

После этого mysql и mysqladmin просить пароль перестанут.

UPDATE: На одном из серверов столкнулся с тем, что в /etc/psa/.psa.shadow пароль не в plain text, а в виде хеша. Рядом лежит файлик /etc/psa/README.psa.shadow в котором говорится следующее
Starting from version 10.2, Panel encrypts the Administrator's password before
saving it to /etc/psa/.psa.shadow. For security reasons, only users with root
permissions are able to get the plain password. To obtain the password, such
users should run the following command:

/usr/local/psa/bin/admin --show-password
Выполнив эту команду вы получите пароль для пользователя "root" (в старых версиях был "admin").

Пытаюсь разобраться с работой setxkbmap в неактивной сессии

Есть потребность выставить запускать setxkbmap для залогиненых пользователей у которых сессия в данный момент неактивна (не multi-seat и потому только одна сессия может быть одновременно активной либо все неативны).

Так вот setxkbmap замечательно работает в активной сессии. Например

$ setxkbmap us; sleep 1m; setxkbmap $(cat ~/.Xkbmap)

дает желаемый результат и раскладка сначала выставляется на US, а через минуту восстанавливаются мои настройки, заданные в ~/.Xkbmap. Если же сначала выставить US, а затем с другого компа зайти по SSH и выставить правильные DISPLAY и XAUTHORITY, то setxkbmap не дает результата. При этом другие приложения нормально запускаются в неактивной сессии (их видно, если переключиться в нее)

Возможно я чего-то не знаю о setxkbmap и XKB extension вообще... пока попросил помощи в рассылке debian-russian. Возможно кто-то и поможет.

среда, 2 мая 2012 г.

XobotOS: проект по портированию Android на C#

Заинтересовала новость от проекта XobotOS о достижениях в портировании Android на платформу Mono/C#. Вместо переписывания исходников Android 4.0 (ICS) с Java на C# был применен инструментарий sharpen, который выполнил трансляцию кода.

Интересны результаты сравнения производительности аналогичного кода:

Из него следует, что Mono/C# в несколько раз превосходит по скорости Dalvik/Java. Хотя разработчики и не собираются создавать отдельную операционную систему, результаты их работы могут оказать влияние как на Mono, так и на Android.

вторник, 1 мая 2012 г.

Использование autotools для сборки grabinput

Сегодня дописал grabinput - утилиту, которая может быть полезна для блокировки клавиатуры/мыши от посягательств маленьких детей (а возможно и любого другого, кто не знаком со способом снятия блокировки).

Grabinput поддерживает три режима работы:
  • перехват событий клавиатуры (действие по-умолчанию);
  • перехват событий клавиатуры и мыши (при использовании ключа -l);
  • блокирование дисплея посредством запуска заставки (при использовании ключа -s).
Для себя я подключил комбинацию Ctrl+Win+Scroll Lock для блокировки клавиатуры и Alt+Win+Scroll Lock для блокировки клавиатуры и мыши. Чтобы отменить блокировку нужно последовательно нажать Scroll Lock, Print Screen и Pause (последовательность задается в заголовочном файле src/grab.h).

Исходники состоят из двух файлов:
  • src/grab.c
  • src/grab.h
 И первоначально для сборки использовался простой Makefile:

grabinput: src/grab.c src/grab.h
    gcc -o grabinput -Wall -lX11 src/grab.c

clean:
    rm -f grabinput

И этого было достаточно, чтобы собрать бинарник. Позже пришла идея попробовать использовать для сборки autotools.

Для начала почитал пару примеров и заглянул в исходники пары opensource проектов. Основная сложноть была в том, что часть мануалов была ориентирована на устаревшие версии autoconf/automake, но с горем пополам родилась более-менее рабочая последовательность внедрения autotools:
  • в директории, где лежит src/ запускаем autoscan. При этом создается файл configure.scan, который нужно переименовать в configure.ac.
  • в configure.ac правим параметры макроса AC_INIT, чтобы соответствовать названию и версии исходников. В итоге у меня получилось так:
    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.67])
    AC_INIT([grabinput], [0.3], [tataranovich@gmail.com])
    AM_INIT_AUTOMAKE(grabinput, 0.3)
    AC_CONFIG_SRCDIR([src])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    AC_PROG_CC
    AC_CHECK_PROG([PKGCONFIG], [pkg-config], [yes], [no])
            if test "x$PKGCONFIG" == "xno"; then
                    AC_MSG_ERROR([pkg-config not found])
            fi
    
    # Checks for libraries.
    PKG_CHECK_MODULES([X11], [x11], [], AC_MSG_ERROR([X11 libraries not found]))
    
    # Checks for header files.
    AC_CHECK_HEADERS([stdio.h stdlib.h unistd.h string.h signal.h errno.h])
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_OUTPUT(Makefile src/Makefile)

    В моем случае инициализируется autoconf/automake и проверяется наличие pkg-config (нужен для поиска libx11-dev), libx11-dev, а также наличие заголовочных файлов: stdio.h stdlib.h unistd.h string.h signal.h errno.h
  • конфигурация automake находится в Makefile.am и src/Makefile.am
    AUTOMAKE_OPTIONS = foreign
    SUBDIRS = src
    EXTRA_DIST = maint
    AUTOMAKE_OPTIONS = foreign выключает жалобы, что исходники разложены не по феншую (не GNU-style), SUBDIRS = src задает директорию с исходниками, а EXTRA_DIST = maint включает в дистрибутив информацию, необходимую для сборки пакета для Debian.
    AM_CFLAGS = -Wall @X11_CFLAGS@
    AM_LDFLAGS = @X11_LIBS@
    
    bin_PROGRAMS = grabinput
    grabinput_SOURCES = grab.c grab.h
    AM_CFLAGS и AM_LDFLAGS задают начальные значения переменных компилятора и линковщика. Обратите внимание на префикс X11_{CFLAGS,LIBS} - эти переменные устанавливаются autoconf при запуске ./configure. bin_PROGRAMS задает расположение бинарника grabinput в $PREFIX/bin, а grabinput_SOURCES - определяет исходники, необходимые для компиляции grabinput
  • чтобы не запускать каждый раз последовательность aclocal, autoheader, automake и autoconf я добавил скрипт autogen.sh, который был содран у какого-то opensource проекта.
    #!/bin/sh
    echo aclocal && aclocal || exit 1
    echo autoheader && autoheader || exit 1
    echo automake && automake --add-missing --copy --force --foreign || exit 1
    echo autoconf && autoconf || exit 1
    
    if test "x$NOCONFIGURE" = "x"; then
      echo configure
      ./configure $*
    fi
Теперь чтобы собрать дистрибутив исходников, я делаю чекаут из репозитория, затем запускаю ./autogen.sh (по-умолчанию скрипт выполняет ./configure). Далее выполняю make dist и в директории появляется архив grabinput-x.x.tar.gz.

Сборка исходников из этого архива знакома многим:

./configure
make
make install

Для Debian-based дистрибутивов в архиве есть директория maint/debian которую нужно скопировать на уровень выше и выполнить

dpkg-buildpackage -rfakeroot -us -uc

В результате будет собран пакет, пригодный для установки.

Ранее я много читал про autotools - мол это говно мамонта, autocrap и т.д. В качестве альтернативы предлагался простой и понятный scons/cmake/qmake/ant/etc - у меня в планах попробовать адаптировать scons для сборки grabinput, чтобы было с чем сравнивать затраты на освоение.

пятница, 27 апреля 2012 г.

Блокировка клавиатуры и мыши

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

Например:
  1. блокировка клавиатуры не помогает, если ребенок добрался до мыши. Частенько приходилось приводить рабочий стол в порядок после набегов дочки.
  2. нет индикации того, что блокировка активна. Иногда это приводит к попыткам заблокировать экран через штатный screensaver, которые терпят неудачу из-за захваченной клавиатуры в grabkeyboard.
Для решения первой проблемы я просто добавил опциональный захват ввода с мыши (это полезно, когда идет просмотр фильма в XBMC, запуженном на отдельном экране). Чтобы воспользоваться им достаточно вызвать grabinput с опцией -l.

$ grabinput -l

Вторая часть проблемы решается сменой курсора при захвате мыши. Сейчас он меняется на пиратский череп с костями (XC_pirate). Для лучшей визуализации блокировки добавлена возможность запускать скринсейвер (из комплекта xscreensaver) при блокировке.

Попутно при написании следующей версии я переименовал утилиту в grabinput и завел исходники под контроль версий. Последняя версия grabinput доступна тут.

четверг, 26 апреля 2012 г.

FreeRDP 1.0.1 release

From time to time I need to connect to the windows-powered terminal server to do some tasks. Some years ago I didn't know any alternative to rdesktop. But this RDP implementation have several troubles with keyboard-related stuff.

Everything changed when I discovered freerdp - the fork of rdesktop. I liked it from the first time. At that time FreeRDP missed some features compared to rdesktop, but it's keyboard handling works very well. The one feature I really missed - seamless RDP mode. I used this feature to run MS software on my linux box.

After 1.0 release I wish to do some tests, but haven't any free time for this. Today I backported new freerdp release to Debian Squeeze and tryed it.

Firstly I check "Remote Application" - this feature works, but sometimes application windows looks crappy and present refresh lag. Also I get error when I try to use "Remote application" for the first time. Error looks like:

$ xfreerdp -u username --app --plugin rail --data "calc.exe" -- serveraddress
...
RAIL exec error: execResult=RAIL_EXEC_E_NOT_IN_ALLOWLIST NtError=0x15

After googling around I found solution for this problem:
  • On windows machine, run regedit and under HKLM\SOFTWARE\Policies\Microsoft\Windows NT add a key named "Terminal Services"
  • Under that, add a DWORD32 value named "fAllowUnlistedRemotePrograms" and set the value to 1
The next thing I tried was "Multimedia redirection".

$ xfreerdp -u username --plugin drdynvc --data tsmf:audio:alsa -- serveraddress

In windows terminal session I run Media Player and try to listen music and to watch videos. Everything works perfectly and smoothly. This feature not really valuable for me since I started to use XBMC at home. As I understand from freerdp wiki - "TSMF" supported only in Windows 7/2008 R2 and only by Windows Media Player.

The last thing I tested was "Device redirection".

$ xfreerdp -u username --plugin cliprdr --plugin rdpdr --data disk:andrey:/home/andrey -- serveraddress

I try to use home directory as a drive attached to terminal session. Everything works as expected.

If you want to try new freerdp release you can grab Debian Squeeze packages from my repository.

Links from the Web: Debian sources list generator

Debian sources list generator - I found interesting link while googling around. It can be very useful for those who migrating to Debian, or simply needed third-party software which not shipped with official distribution.

HOW-TO: Highly anonymous proxy with multiple ip support

Today I completed proxy-related task which looks unique for me. So I decide to write a small how-to to memorize steps and have ability to use it in future as reference.

The main difficulty in this task was a deprecated CentOS installation on server. If you try simply try to run

yum search squid

then yum will complain about absent repodata.xml - centos 4 repos already removed from CentOS mirrors and I need to configure vault.centos.org repo in YUM. So I backup /etc/yum.repos.d/CentOS-Base.repo and edit it:

[base]
name=CentOS-4.8 - Base
baseurl=http://vault.centos.org/4.8/os/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#released updates
[update]
name=CentOS-4.8 - Updates
baseurl=http://vault.centos.org/4.8/updates/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#packages used/produced in the build but not released
[addons]
name=CentOS-4.8 - Addons
baseurl=http://vault.centos.org/4.8/addons/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#additional packages that may be useful
[extras]
name=CentOS-4.8 - Extras
baseurl=http://vault.centos.org/4.8/extras/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-4.8 - Plus
baseurl=http://vault.centos.org/4.8/centosplus/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=2
protect=1

#contrib - packages by Centos Users
[contrib]
name=CentOS-4.8 - Contrib
baseurl=http://vault.centos.org/4.8/contrib/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=2
protect=1

Then I cleanup yum cache info and run search again

# yum clean all
# yum search squid

Now squid available for install, so installing it

# yum install squid

Next step is to setup authentication. I use only BASIC auth, so I uncomment related lines in /etc/squid/squid.conf

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/proxy.auth
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

Then I create file with password info:

# htpasswd -c /etc/squid/proxy.auth squid

Next step is to hide proxy info. After this step web sites lost ability to detect if you use proxy or not.

For this I added following lines in squid.conf

# Disable client ip forwarding
forwarded_for off

# Header control
header_access Allow allow all
header_access Authorization allow all
header_access Cache-Control allow all
header_access Content-Encoding allow all
header_access Content-Length allow all
header_access Content-Type allow all
header_access Date allow all
header_access Expires allow all
header_access Host allow all
header_access If-Modified-Since allow all
header_access Last-Modified allow all
header_access Location allow all
header_access Pragma allow all
header_access Accept allow all
header_access Accept-Encoding allow all
header_access Accept-Language allow all
header_access Accept-Charset allow all
header_access Content-Language allow all
header_access Mime-Version allow all
header_access Cookie allow all
header_access Set_Cookie allow all
header_access Retry-After allow all
header_access Title allow all
header_access Connection allow all
header_access Proxy-Connection allow all
header_access Proxy-Authorization allow all
header_access Proxy-Authenticate allow all
header_access WWW-Authenticate allow all
header_access User-Agent allow all
header_access All deny all

If you want to hide or spoof User-Agent, than replace last but one line to

header_replace User-Agent Nutscrape/1.0 (CP/M; 8-bit)

The last step is to add ability to use multiple ip source address depending on proxy address currently used. For example if you use 192.168.17.43:3128 as proxy address then sites detect your ip address as 192.168.17.43.

For this I use file with ip list: one ip per line. Than I run script to generate config:

# i=0; for ip in `cat /tmp/squid-ips.txt`; do i+=1; echo "acl ip${i} myip ${ip}"; echo "tcp_outgoing_address ${ip} ip${i}"; done | tee -a /etc/squid/squid.conf

The last step is to reload squid conf and enable squid startup during system boot

# service squid reload
# chkconfig squid on

To check proxy info you can visit this link.

среда, 25 апреля 2012 г.

Midnight Commander packages now available for Ubuntu Precise Pangolin

Today I added additional buildbot branch to support upcoming Ubuntu LTS release - Precise Pangolin (12.04).

You can already grab latest midnight commander release for Ubuntu Precise Pangolin from my repository (currently only version 4.8.3 available). Nightly builds will be available within the next few hours.

Enjoy the power of the best console file manager.

понедельник, 23 апреля 2012 г.

Midnight Commander 4.8.3 release

Yesterday midnight commander team released a brand new 4.8.3 version. More info about release you can get at changelog page. This release doesn't bring any new features, but contains a bunch of bugfixes.

As always you can grab Debian/Ubuntu packages from my repository.

среда, 11 апреля 2012 г.

Debian/Ubuntu packages for deadbeef audio player

Recently was released a new version of my favourite DEADBEEF audio player. DeaDBeeF (as in 0xDEADBEEF) is an audio player for GNU/Linux, BSD, OpenSolaris and probably other UNIX-like systems. This player very minimalistic but have all functionality needed to me.

As for now upstream didn't release binary packages for version 0.5.2 for Debian Squeeze, so I decided to build myself packages for Debian (Squeeze, Wheezy, Sid) and Ubuntu (Maverick, Lucid, Natty, Oneiric) both i386 and amd64 versions. You can grab this packages in my repository in section "main" or just simply download from pool directory (ex. for Squeeze)

Deadbeef 0.5.2

Much more about deadbeef you can learn on it's SourceForge page.

вторник, 10 апреля 2012 г.

Критическая уязвимость в SAMBA 3.0.x - 3.6.3 (включительно)

Наткнулся в новостях на анонс CVE-2012-1182 - наверное самой критической уязвимости в SAMBA, найденной за всю историю существования проекта. Эта уязвимость связана с неверной обработкой запросов RPC и позволяет любому не авторизованному злоумышленнику удаленно выполнить код с привилегиями "root".

В качестве частичного решения проблемы предлагается настроить опцию "hosts allow", но это не поможет в случае подмены ip адреса. Для всех версий SAMBA уже выпущены патчи, но многие дистрибутивы еще не подготовили обновления.

На данный момент обновления готовы только у RHEL (судя по закрытому репорту в багзилле). Надеюсь, что обновления от CentOS и Debian не заставят себя ждать.

Stay tuned так сказать!

UPDATE : Выпущены обновления для RHEL/CentOS (в этот раз centos радует своей оперативностью)

воскресенье, 8 апреля 2012 г.

Решение проблем с настройками клавиатуры при использовании suspend2disk

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

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

$ dbus-monitor --system | tee ~/tmp/dbus-system.log

В процессе изучения полученного лога нашлись записи от UPower (подсистема управления питанием).

$ grep UPower ~/tmp/dbus-monitor.log
signal sender=:1.15 -> dest=(null destination) serial=80 path=/org/freedesktop/UPower; interface=org.freedesktop.UPower; member=Sleeping
signal sender=:1.15 -> dest=(null destination) serial=81 path=/org/freedesktop/UPower; interface=org.freedesktop.UPower; member=Resuming

Чтобы восстановить настройки клавиатуры, достаточно отловить событие 'Resuming' от UPower и выполнить команду setxkbmap $(cat ~/.Xkbmap). Готовый скрипт можно взять тут.

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

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