вторник, 31 декабря 2013 г.

Любую хорошую идею можно испаганить говеной реализацией

DISCLAIMER: Этот пост содержит эмоции и переживания по поводу бесцельно потраченных часов на борьбу с дохлым железом. Если вам не нравится сей жанр - не читайте дальше.

Долгой жизни людям, которые экономят пару баксов на реализации порта стандарта IEEE1394 (i.Link или FireWire их еще называют) и делают устройства, которые можно подключать только выключенными (желательно чтобы другое устройство было также выключенным). Это при том, что сам интерфейс IEEE1394 подразумевает поддержку hotplug на электрическом уровне.

Уже вторая miniDV камера, которая мне попадает в руки, с выжженным интерфейсом FireWire и компьютер ее либо не видит вообще, либо валятся ошибки и все равно ничего не работает. При том, что все остальные функции в камерах работает отлично (создается ложное впечатление, что камера полностью рабочая). Вот только сбросить отснятый материал для дальнейшей обработки в хорошем качестве больше возможности нет!

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

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

суббота, 28 декабря 2013 г.

Что-то новенькое в учете электроэнергии

Сегодня был на стройрынке в Ждановичах и в одном павильоне заметил интересный счетчик электроэнергии (прошу прощения за посредственные снимки - спешил да и камера в моем телефоне далека от совершенства)


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

Может кто-то знает что это такое и что будет, если карточку извлечь из счетчика?

Ошибка C:32:11 в камере Sony Handycam DCR-HC38

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


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

За неделю до утренника я решил проверить работу камеры и немного потренироваться в операторском искусстве. Уже несколькими минутами позже я радовался, что устроил тест-драйв заблаговременно - после второго открывания кассетной деки последняя напрочь отказалась закрываться. При этом на экранчике камеры маячит ошибка C:32:11. Чтение раздела troubleshooting в инструкции и поиск в интернете дал массу возможных причин этой проблемы и соответственно решений, но лично мне очень помог этот тред.

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

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

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

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

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

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

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


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

пятница, 27 декабря 2013 г.

Postfix - отбрасывание почты, адресованной любому домену, кроме явно разрешенных

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

Эта мера достаточно эффективна, но периодически приходят уведомления о недоставленных письмах. Когда их 1-2 в день с этим можно спокойно жить, но когда их становится 30-50 штук, то читать их нет смысла, а каждый раз удалять их из почтового ящика postmaster'а лениво.

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

Для реализации мне потребовалось создать файл карты /etc/postfix/transport, который выглядит примерно так:

example.local  :
example.com    :
example.org    :
*              discard: Not allowed destination - silently discarded

создать хешированый вариант карты

# postmap hash:/etc/postfix/transport

добавить в /etc/postfix/main.cf

transport_maps = hash:/etc/postfix/transport

и перечитать конфигурацию postfix

# service postfix reload

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

Dec 27 16:13:02 server postfix/discard[2717]: 55B574E300: to=, relay=none, delay=0.06, delays=0.05/0/0/0, dsn=2.0.0, status=sent (Not allowed destination - message silently discarded)

четверг, 26 декабря 2013 г.

Настройка сетевого принтера HP 1022n в Linux

В офис вернулся наш старенький принтер HP1022n, который помимо прочего является сетевым и работает через ethernet. Чтобы подключить его в Debian Wheezy нужно:
  • установить пакет printer-driver-foo2zjs;
  • зайти в интерфейс CUPS (под пользователем root)
  • добавить новый принтер (Администрирование / Принтеры / Добавить принтер)
  • в группе "Другие сетевые принтеры" выбрать тип "Протокол интернет-печати (ipp)"
  • в поле "Подключение" указать socket://192.168.1.100:9100/ (192.168.1.100 - IP адрес принтера в сети)
  • указать в поле "Название" я указал hp1022n, поля "Описание" и "Расположение" можно не указывать
  • в следующем диалоге нужно указать производителя "HP" и выбрать подходящий драйвер CUPS "HP LaserJet 1022n Foomatic/foo2zjs-z1 (recommended)"
  • в диалоге конфигурации параметров печати по-умолчанию можно ничего не менять
  • после завершения можно попробовать распечатать пробную страницу (Обслуживание / Печать пробной страницы) 
P.S. Если добавить своего пользователя в группу lpadmin, то в интерфейсе CUPS можно авторизоваться своим пользователем и паролем. Если вы используете что-то отличное от Debian, то возможно вам нужно добавить своего пользователя в другую группу. Чтобы узнать нужную группу выполните

grep SystemGroup /etc/cups/cupsd.conf

пятница, 6 декабря 2013 г.

Последнее пристанище старых игрушек

Зашел на http://ftp.by.debian.org/debian-cd/ чтобы скачать ISO для debian squeeze netinst i386, но не нашел ничего кроме актуального wheezy. Похоже почистили все зеркала, поэтому взять нужный файл можно на http://cdimage.debian.org/cdimage/archive/.

среда, 4 декабря 2013 г.

Особенности работы /usr/sbin/sendmail в разных MTA

Сегодня дебажили отправку почты в PHP приложении и наткнулись на интересную особенность эмуляции ключей /usr/sbin/sendmail в различных MTA.

Предыстория - рассматриваемое приложение отправляет письмо пользователю (user@example.net), делает Bcc: bcccopy@example.com (для внутренних нужд) и ставит Return-Path: sales@example.com. Если не лезть в дебри ООП и наслоения классов, то нужный код на PHP выглядит примерно так:

$email_to = 'user@example.net';
$email_subject = 'subject';
$email_body = 'email body';
$email_additional_headers = 'Bcc: bcccopy@example.com';
$email_additional_params = '-f sales@example.com';
mail($email_to, $email_subject, $email_body, $email_additional_headers, $email_additional_params);

Но при отправке письма из приложения приходило 3 одинаковых письма на user@example.net, на bcccopy@example.com и на sales@example.com, но при этом Return-Path: не выставлялся и выглядел примерно так: Return-Path: <www-data@www.example.com>

Нужное значание Return-Path может не выставляться, если почтовый сервер не считает пользователя доверенным, либо в вызове /usr/sbin/sendmail нет ключа -f. Проверить просто

# su - www-data
$ cat > /tmp/email.txt <_EOF_
Bcc: <bcccopy@example.com>
From: "Sales" <sales@example.com>
To: "User Full Name" <user@example.net>
Subject: subject

email body
_EOF_
$ cat /tmp/email.txt | /usr/sbin/sendmail -t -i -f sales@example.com

После выполнения пришли два письма - на user@example.net и на bcccopy@example.com, Return-Path: при этом выставлен корректно. Следовательно проблема лежит выше MTA и нужно дебажить PHP приложение.

Когда мне нужно проверить взаимодействие PHP скрипта и системы я пользуюсь sleep() и strace. Для этого в нужный PHP скрипт в самое начало вставляется sleep(60); после чего выполняется нужное действие. При этом у меня есть 60 секунд, чтобы посмотреть в http://www.example.com/server-status PID нужного мне запроса и подключиться к процессу через strace.

# strace -f -o /tmp/php-trace.log -s 8192 -p <PID>

По истечению 60 секунд приложение начнет выполнять вызовы системы, которые будут записаны в лог файле /tmp/php-trace.log. Поскольку я дебажу отправку почты через mail(), то меня интересует вызов execve()

$ grep execve /tmp/php-trace.log 
3253  execve("/bin/sh", ["sh", "-c", "/usr/sbin/sendmail -t -i  sales@example.com"], [/* 9 vars */] <unfinished ...>
3253  <... execve resumed> )            = 0
3254  execve("/usr/sbin/sendmail", ["/usr/sbin/sendmail", "-t", "-i", "sales@example.com"], [/* 9 vars */]) = 0
3255  execve("/usr/sbin/postdrop", ["/usr/sbin/postdrop", "-r"], [/* 2 vars */]) = 0

Вот теперь видно почему отправляется три письма вместо двух - где-то в приложении ошибка и перед sales@example.com не добавляется параметр -f. А раз sales@example.com указан без параметра, то он трактуется как еще один адрес назначения.

Но остается еще один вопрос - почему на некоторых серверах отправляется три письма, а на некоторых только два (правильный Return-Path не выставляется на любом сервере). Во всех случаях код приложения одинаковый и содержит ошибку.

На сервере, где пытались воспроизвести ошибку с отправкой трех писем вместо двух установлен WHM/cPanel и MTA там exim4. Поскольку код одинаковый, значит и функция mail() вызывается с одинаковыми параметрами, а значит и вызов /usr/sbin/sendmail должен быть одинаковый. На всякий случай сравниваю значение переменной sendmail_path в выводе phpinfo() на разных серверах - везде стоит одинаковое значение "/usr/sbin/sendmail -t -i". Но почему же тогда отличается поведение!

Смотрю дальше - на сервере, где отправляется только два письма стоит Exim4, а на остальных, где отправляется три письма, - Postfix. Сравниваю описание ключей -t и -i в man sendmail от этих MTA (взято из CentOS 6.5).

Exim4

-i        This option, which has the same effect as -oi, specifies that
          a dot on a line by itself should not terminate  an  incoming,
          non-SMTP message. I can find no documentation for this option
          in Solaris 2.4 Sendmail, but the mailx command in Solaris 2.4
          uses it. See also -ti.

-t        When  Exim is receiving a locally-generated, non-SMTP message
          on its standard input, the -t option causes the recipients of
          the message to be obtained from the To:, Cc:, and Bcc: header
          lines in the message instead of from the  command  arguments.
          The  addresses are extracted before any rewriting takes place
          and the Bcc: header line, if present, is then removed.

          If the command has any arguments, they specify  addresses  to
          which  the message is not to be delivered. That is, the argu-
          ment addresses are removed from the recipients list  obtained
          from  the  headers.  This  is  compatible with Smail 3 and in
          accordance with the documented behaviour of several  versions
          of Sendmail, as described in man pages on a number of operat-
          ing systems (e.g.  Solaris 8, IRIX 6.5, HP-UX  11).  However,
          some  versions  of  Sendmail  add argument addresses to those
          obtained from the headers, and  the  O'Reilly  Sendmail  book
          documents  it  that  way.  Exim  can  be made to add argument
          addresses instead of subtracting them by setting  the  option
          extract_addresses_remove_arguments false.

          If  there  are  any Resent- header lines in the message, Exim
          extracts recipients  from  all  Resent-To:,  Resent-Cc:,  and
          Resent-Bcc:  header lines instead of from To:, Cc:, and Bcc:.
          This is for  compatibility  with  Sendmail  and  other  MTAs.
          (Prior  to release 4.20, Exim gave an error if -t was used in
          conjunction with Resent- header lines.)

          RFC 2822 talks about different sets of Resent-  header  lines
          (for  when  a  message is resent several times). The RFC also
          specifies that they should be added at the front of the  mes-
          sage,  and  separated  by  Received:  lines. It is not at all
          clear how -t should operate in the present of multiple  sets,
          nor indeed exactly what constitutes a "set".  In practice, it
          seems that MUAs do not follow the RFC. The Resent- lines  are
          often  added  at  the  end of the header, and if a message is
          resent more than once, it is common for the original  set  of
          Resent-  headers to be renamed as X-Resent- when a new set is
          added. This removes any possible ambiguity.

Postfix

-i     When  reading  a message from standard input, don.t treat a line
       with only a . character as the end of input.

-t     Extract recipients from message headers. These are added to  any
       recipients specified on the command line.

       With Postfix versions prior to 2.1, this option requires that no
       recipient addresses are specified on the command line.

Sendmail

-i     Ignore  dots  alone on lines by themselves in incoming messages.
       This should be set if you are reading data from a file.

-t     Read message for recipients.  To:, Cc:, and Bcc: lines  will  be
       scanned  for recipient addresses.  The Bcc: line will be deleted
       before transmission.

Смысл опции -i примерно одинаков у всех MTA (хотя значение ignore у sendmail, еще нужно проверить - возможно он вовсе выкидывает строку, содержащую только символ точки). А вот после прочтения разделов про опцию -t все становится на свои места. На серверах где стоит exim4 используется отличное от sendmail и postfix поведение, когда получатели, указанные в командной строке, исключаются из итогового списка получателей письма.

среда, 13 ноября 2013 г.

Срочно выйти из сна - headshot.php

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

Этот скрипт, будучи запущенным из браузера на сервере должен сделать эту работу

$ cat headshot.php
<?php
system('PHP_PPID=`ps -p $$ -o ppid=`; PHP_NAME=`ps -p $PHP_PPID -o comm=`; pkill -u `id -un` $PHP_NAME');

Почему не просто pkill -u `id -un`? Потому что имени пользователя под которым работают скрипты на сервере, может быть запущено много чего другого, которое не стоит убивать.

Протестируйте свою WHM/cPanel после обновления до 11.40

На прошлой неделе вышло обновление WHM/cPanel до версии 11.40. С этим обновлением связаны две проблемы, которые мне пришлось решать в понедельник, возможно сей пост кому-то сэкономит время.

У нас есть самописный плагин для cPanel, который автоматизирует установку и конфигурирование сайтов на основе magento для отдела QA. И после обновления этот плагин прекратил нормально работать.

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

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

Попробовал пересобрать конфигурацию веб-сервера

# /scripts/rebuildhttpdconf

Но в ответ выдает ругань вида

[Mon Nov 11 10:31:36 2013] [crit] (EAI 9)Address family for hostname not supported: alloc_listener: failed to set up sockaddr for ::

Configuration problem detected on line 170 of file /usr/local/apache/conf/httpd.conf.work.PsABU7IkikfQtoi0:     Listen setup failed

        --- /usr/local/apache/conf/httpd.conf.work.PsABU7IkikfQtoi0 ---

Ругается на ipv6 опцию и конфиг сервера не перезагружается. В новом релизе появилась поддержка IPv6 и следовательно, где-то нужно дать пинка, чтобы заработало. Немного пробежавшись по форумам cpanel нашел, что нужно просто пересобрать текущую конфигурацию в EasyApache.

# /scripts/easyapache

После завершения сборки все начинает работать.

понедельник, 11 ноября 2013 г.

Уменьшение разряда батареи при использовании Suspend-to-RAM

Мне нравится использовать suspend to ram (STR или S3 в терминологии ACPI) на ноутбуке. Помимо быстрого выхода из режима сна это самый надежный способ заблокировать экран и клавиатуру ноутбука от детей. Есть лишь один недостаток - постоянный разряд батареи, связанный с поддержанием работы оперативной памяти. Если батарея разрядится, то все несохраненные данные будут потеряны.

Для защиты от потери данных в режиме STR в linux есть режим гибридного сна (suspend-hybrid) - в этом режиме состояние памяти сохраняется на диск, как при hibernate (suspend to disk или S4 в терминологии ACPI), но вместо отключения питания система переходит в состояние S3 или suspend to ram. В этом случае при достаточном заряде батареи система мгновенно просыпается как из suspend to ram, а если батарея разрядится, то как из suspend to disk. Все хорошо, но одно НО - батарея все равно разряжается, когда ноутбук находится в режиме такого сна. Это может быть критично в поездке или когда ноутбук длительное время не используется. Поскольку сохранность данных и постоянная готовность ноутбука к работе для меня важнее скорости загрузки, то я перешел на использование hibernate и пользовался им в течении нескольких лет.

Пару дней назад я натолкнулся на элегантное решение проблемы - переключение из режима S3 в S4 без участия пользователя. Кажется я такое уже наблюдал в Windows 7, но не придавал этому значения. Оказывается все очень просто. В процессе подготовки к suspend to ram менеждер питания выполняет установку системного таймера (будильника в BIOS), который включит систему через определенное время. Затем система выполняет обычную подготовку и переходит в режим S3. Далее два варианта:
  • если пользователь включит систему до срабатывания системного будильника, то система пробуждается из режима S3 и переходит в режим нормальной работы;
  • если будильник срабатывает в режиме сна, то система загружается, определяет что пробуждение не было инициировано пользователем (система включилась по событию таймера в BIOS) и сразу же выполняется переход в режим S4 (suspend to disk).
Интервал, после которого система переходит из одного состояния в другое настраивается. Этой схемой я пользуюсь уже несколько дней и проблем пока не замечал.

четверг, 31 октября 2013 г.

W: Ошибка GPG: http://www.tataranovich.com wheezy Release

Если при apt-get update у вас произошла подобная ошибка

W: Ошибка GPG: http://www.tataranovich.com wheezy Release: Следующие подписи неверные: KEYEXPIRED 1379680799

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

$ sudo apt-key adv --keyserver pgp.mit.edu --refresh-keys 2EE7EF82

После этого нужно снова запустить apt-get update

вторник, 29 октября 2013 г.

Как НЕ нужно делать logrotate

В одном из OpenVZ контейнеров постоянно дох munin-node, причем записи в логе говорили о том, что ему "помогли".

2013/10/26-04:02:02 Server closing!
2013/10/26-04:02:02 HUP'ing server
Can't exec "munin-node": Нет такого файла или каталога at /usr/share/perl5/Net/Server.pm line 1162.
shutdown() on closed socket GEN0 at /usr/lib/perl/5.10/IO/Socket.pm line 294.

В контейнере стоит Debian Squeeze и аналогичные контейнеры в сети еще есть, но постоянно дохнет только один. Судя по дате это что-то из набора cron.daily, который как правило стартует в 4:00, но в контейнере /etc/logrotate.d/munin-node, не шлет HUP после ротирования. Ради интереса стартанул весь logrotate

logrotate -f /etc/logrotate.conf

После завершения проверил munin-node - все в порядке. И тут меня осенило, ведь на сервере, который hardware node у OpenVZ тоже стоит munin-node. Разница лишь в том, что на hardware node установлен ALTLinux, а не Debian.

Иду смотреть /etc/logrotate.d/munin-node на ноде

/var/log/munin/munin-node.log {
        create 640 _munin root
        daily
        postrotate
                killall -q -HUP munin-node
        endscript
}

Редиски! Они шлют HUP всем процессам, а не только тому, который указан в PID-файле. Луч поноса QA команде ALTLinux и создателю этого костыля в частности.

Заменил вызов killall на /etc/init.d/munin-node reload - теперь и лог ротируется и в контейнере не дохнет.

среда, 25 сентября 2013 г.

Сломались отчёты sysstat: Invalid system activity file: /var/log/sysstat//sa24

Если вам на почту пришло письмо вроде этого

/etc/cron.daily/sysstat:
Invalid system activity file: /var/log/sysstat//sa24

то скорее всего у вас изменилась конфигурация железа (в моём случае проапгрейдили сервер и ядер процессора стало больше). Баг известный и исправить его можно так:

# rm /var/log/sysstat/sa`date +'%d'`
# service sysstat start

Для уверенности через минут 10 проверьте результат, выполнив

# sar -A

среда, 18 сентября 2013 г.

Три почивших диска за последних три месяца

Я не питаю иллюзий по поводу надёжности SATA дисков, но такое на моей памяти впервые. В течении трёх месяцев, один за другим умерло три диска Seagate NS серии (один 2TB и два 750GB).

Сейчас как раз переношу данные с последнего мертвеца. Прошлые ограничивались парой Offline Uncorrectable в S.M.A.R.T., но сегодняшний покойничек дал дуба эффектно

ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
ata1.00: BMDMA stat 0x64
ata1.00: cmd 25/00:08:c3:74:25/00:00:52:00:00/e0 tag 0 dma 4096 in
         res 51/40:00:ca:74:25/40:00:52:00:00/00 Emask 0x9 (media error)
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1.01: configured for UDMA/133
sd 0:0:0:0: Unhandled sense code
sd 0:0:0:0: SCSI error: return code = 0x08000002
Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE,SUGGEST_OK
sda: Current [descriptor]: sense key: Medium Error
    Add. Sense: Unrecovered read error - auto reallocate failed

Descriptor sense data with sense descriptors (in hex):
        72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
        52 25 74 ca
EXT3-fs error (device sda3): ext3_get_inode_loc: <6>ata1: EH complete
unable to read inode block - inode=171738553, block=171737135

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

The following warning/error was logged by the smartd daemon:

Device: /dev/sda, FAILED SMART self-check. BACK UP DATA NOW!

For details see host's SYSLOG.

Дальше по уже накатанной дорожке.

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

Dell OpenManage installation on CentOS

Complete guide can be found here. If you want to skip reading you can execute following commands:

# wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash
# yum install srvadmin-all

After packages installation you should start OMSA services and add them to autostart

# /opt/dell/srvadmin/sbin/srvadmin-services.sh start
# /opt/dell/srvadmin/sbin/srvadmin-services.sh enable

To enter OMSA you should navigate to https://your-server-ip:1311/ in your browser (login as user root and use related password). You may need to enable incoming connections to 1311/TCP port in your firewall.

# /sbin/iptables -A INPUT -p tcp --dport 1311 -j ACCEPT

пятница, 13 сентября 2013 г.

Привел в порядок репозиторий

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

Сейчас бинарные пакеты для Mignight Commander (release и nightly) собираются для Debian Squeeze/Wheezy/Jessie/Sid и Ubuntu Lucid/Precise/Quantal/Raring/Saucy (i386 и amd64).

Из репозитория окончательно удалены ветки для Debian Lenny и Ubuntu Natty/Maverick/Oneiric. Заодно удалены устаревшие версии wine-unstable и стабильного midnight commander.

среда, 14 августа 2013 г.

Расчет критических значений Load Average для системы мониторинга сервера

Сегодня подкручивал настройки Nagios и решил добавить статью по расчету значений лимитов load average для различных конфигураций серверов. Чтобы понимать суть load average я советую прочесть эту статью.

Поскольку лимиты load average зависят от количества доступных ядер процессора, то у различных серверов будут значения будут различаться. Наиболее распространенные варианты конфигурации процессоров:
  • 1 физическое ядро
  • 2 физических ядра
  • 2 физических ядра + hyperthreading (4 виртуальных ядра)
  • 4 физических ядра
  • 4 физических ядра + hyperthreading (8 виртуальных ядер)
Я не буду рассматривать варианты дальше, поскольку там все аналогично. Для себя я определил следующие лимиты, которые по моему мнению не приводят к заметному снижению производительности сервера относительно процессора.

State/Load Average1 min5 min15 min
WarningCPU cores * 2CPU cores * 1.5CPU cores * 1.25
CriticalCPU cores * 4CPU cores * 2CPU cores * 1.5

Поскольку ядро процессора, которое эмулируется hyperthreading, не является полноценным, то такие ядра я исключаю из расчета. Чтобы узнать свое количество физических ядер вы можете выполнить этот скрипт

#!/bin/bash
if [ `grep -c processor /proc/cpuinfo` != 1 ]; then
    grep 'core id' /proc/cpuinfo | sort | uniq | wc -l
else
    echo 1
fi

Готовые значения лимитов для плагина check_load из состава Nagios.

  • Single core: check_load -w 2,1.5,1.25 -c 4,2,1.5
  • Dual core: check_load -w 4,3,2.5 -c 8,4,3
  • Quad core: check_load -w 8,6,5 -c 16,8,6

четверг, 1 августа 2013 г.

Преобразование имен файлов при распаковке архива tar

Если вам попался архив tar вида

$ tar -tf /tmp/backup_2013-07-31.tar.gz
backups/servers/server.example.org/var/www/example.org/file1
backups/servers/server.example.org/var/www/example.org/file2
backups/servers/server.example.org/var/www/example.org/file3
...
backups/servers/server.example.org/var/www/example.org/fileN

и распаковать его нужно в /var/www/example.org желательно не применяя mv, то сделать это можно так:

$ tar --strip-components=6 --show-transformed -xvf /tmp/backup_2013-07-31.tar.gz -C /var/www/example.org
file1
file2
file3
...
fileN

У tar еще есть опция --transform, которая позволяет сделать произвольную замену имени в отличии от --strip-components, которая только отбрасывает нужное количество уровней вложенности.

$ tar --transform 's,backups/servers/server.example.org/var/www/example.org,example.com,g' --show-transformed -xvf /tmp/backup_2013-07-31.tar.gz -C /var/www
example.com/file1
example.com/file2
example.com/file3
...
example.com/fileN

четверг, 18 июля 2013 г.

История спасения данных с "умирающего" жесткого диска

Очередное утро началось с чтения письма от smartd. Один из дисков сервера, который используется для резервного копирования всех остальных серверов, начал свой путь в лучший мир. В письме говорилось о появлении одного pending sector, но пока я ехал в офис от smartd пришло второе письмо, в котором говорилось, что этот сектор уже перешел в разряд offline uncorrectable. А вот это уже плохо, значит с большой долей вероятности считать данные из этого сектора уже не удастся.

среда, 17 июля 2013 г.

JMicron JM20337 USB combo bridge - несовместимость с дисками Advanced Format

Собрался стереть суперблоки старого raid массива перед добавлением дисков в сервер. Подключил 2TB WDC WD20 EARX диск через USB переходник ([152d:2338] JMicron JM20337 Hi-Speed USB to SATA & PATA Combo Bridge). Но при попытке выполнить

$ sudo mdadm --zero-superblock /dev/sdb{1,2}

получил ошибку (к сожалению саму ошибку я не сохранил, возможно добавлю в пост позже).

Полез в логи

[184450.592853] usb 1-3.1.3: new high speed USB device using ehci_hcd and address 8
[184450.685697] usb 1-3.1.3: New USB device found, idVendor=152d, idProduct=2338
[184450.685700] usb 1-3.1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=5
[184450.685703] usb 1-3.1.3: Product: USB to ATA/ATAPI bridge
[184450.685704] usb 1-3.1.3: Manufacturer: JMicron
[184450.685705] usb 1-3.1.3: SerialNumber: 000001D91CA8
[184450.685794] usb 1-3.1.3: configuration #1 chosen from 1 choice
[184450.686383] scsi10 : SCSI emulation for USB Mass Storage devices
[184450.686474] usb-storage: device found at 8
[184450.686475] usb-storage: waiting for device to settle before scanning
[184455.684536] usb-storage: device scan complete
[184455.685016] scsi 10:0:0:0: Direct-Access     WDC WD20 EARX-00PASB0          PQ: 0 ANSI: 2 CCS
[184455.685496] sd 10:0:0:0: Attached scsi generic sg1 type 0
[184455.687848] sd 10:0:0:0: [sdb] 488378646 4096-byte logical blocks: (2.00 TB/1.81 TiB)
[184455.690581] sd 10:0:0:0: [sdb] Write Protect is off
[184455.690585] sd 10:0:0:0: [sdb] Mode Sense: 28 00 00 00
[184455.690587] sd 10:0:0:0: [sdb] Assuming drive cache: write through
[184455.691505] sd 10:0:0:0: [sdb] 488378646 4096-byte logical blocks: (2.00 TB/1.81 TiB)
[184455.692239] sd 10:0:0:0: [sdb] Assuming drive cache: write through
[184455.692245]  sdb: sdb1 sdb2
[184456.128375] sdb: p2 size 30585128320 exceeds device capacity, enabling native capacity

Оказывается через USB мост информация о жестком диске искажена и вместо 512/4096 (размер логического/физического сектора) получилось 4096/4096. Тут и тут нашлись аналогичные жалобы на работу этого моста и дисков с advanced format.

вторник, 16 июля 2013 г.

Узнать свой текущий IP адрес

Чтобы узнать свой текущий IP адрес можно воспользоваться услугами DynDNS http://checkip.dyndns.com/. Вывод страницы простой и легко поддается разбору в скриптах.

среда, 3 июля 2013 г.

Ошибка при удалении снапшота LVM: Can't remove open logical volume

Выкроил пару часов времени чтобы переписать скрипты резервного копирования на работу с LVM снапшотами.

В процессе работы скрипт создает снапшоты для всех точек монтирования, которые нужно бэкапить и которые расположены на LVM. У меня это все, кроме /boot.

Снапшот создается как обычно

# lvcreate --snapshot --name rootfs-backup --size 500M /dev/VolGroup0/rootfs

Затем идет логика резервного копирования и по завершении снапшоты удаляются. Вот тут меня и поджидали грабли.

# lvremove -f /dev/VolGroup0/rootfs-backup
Can't remove open logical volume "rootfs-backup"

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

Как вариант, можно закомментировать строку KERNEL=="dm-*", OPTIONS+="watch" в файле /lib/udev/rules.d/80-udisks.rules, но вместо этого я добавил костыльworkaround в свой скрипт, который несколько раз повторяет действие, если была ошибка.

for i in rootfs usr var home
do
  for j in 1 2 3 4 5 6 7 8 9 10
    lvremove -f /dev/VolGroup0/${i}-backup && break
    sleep 3
  done
  if [ -e /dev/VolGroup0/${i}-backup ]; then
    echo "Failed to remove LVM snapshot VolGroup0/${i}-backup"
    exit 1
  fi
done

понедельник, 1 июля 2013 г.

Анонимные комментарии

Сегодня окончательно решил отключить анонимное комментирование. Причин для этого действия несколько:
  • мне лень разбираться в какофонии, которую порой генерируют анонимные комментаторы. Одно дело, когда оставленный комментарий не подразумевает диалога и другое дело, когда несколько человек одновременно что-то спрашивают и ждут ответа - поди разберись что и кому писать;
  • сегодня у большинства есть аккаунты, позволяющие комментировать не регистрируясь в моем блоге (google, facebook, openid, etc);
  • сетевые партизаны мне не интересны.

суббота, 8 июня 2013 г.

Привязка контейнера OpenVZ к определенным ядрам процессора в Debian Squeeze

Поскольку в debian squeeze утилита vzctl довольно лохматой версии и не поддерживает опцию --cpumask, то пришлось городить велосипед, чтобы прикрепить конкретный контейнер на выделенные ядра процессора.

У подопытного сервера 4 ядра с hyper-threading - итого система видит 8 ядер. Перемещаем все процессы системы, для которых еще не задан явно affinity на ядра 4,5

for _PID in `ps --no-headers -A -o pid`
do
    taskset -p -c $_PID 2>/dev/null | grep -q 0-7$ && taskset -p -c 4,5 $_PID
done

Контейнер с VEID 300 на ядра 0-3

ps --no-headers -A -o pid | xargs vzpid | tail -n+2 | awk '{if ($2 == 300) print $1}' | xargs -n 1 taskset -p -c 0-3

Посмотреть все привязки в системе можно так:

ps --no-headers -A -o pid | xargs -I {} taskset -p -c {} 2>/dev/null

пятница, 31 мая 2013 г.

Сломанный collation utf8_general_ci в MySQL 5.1.x

Наступил на забавные грабли при копировании базы с mysql 5.0.51 на mysql 5.1.49. Сделал дамп базы и скопировал на тестовый сервер, но при импорте произошла ошибка

ERROR 1062 (23000) at line 8615879: Duplicate entry 'Voß' for key 'ticketwords'

Пробую найти значение в уже добавленных строках, которое конфликтует со значением 'Voß'

mysql> select * from swticketwords where contents = 'Voß';
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|        20080 | Vos      |
+--------------+----------+
1 row in set (0.00 sec)

Ерунда какая-то. Получается, что база считает 'Vos' = 'Voß' и отказывается добавлять значение. Начинаю гуглить и сразу натыкаюсь на репорты в багтрекере MySQL [1] [2]. Если в кратце, то разрабы поломали collation utf8_general_ci (который работал в mysql 5.0.x) и отказываются его чинить в mysql 5.1.x, мотивируя это тем, что фикс сломает еще больше.

Чтобы хоть как-то решить проблему был создан отдельный collation utf8_general_mysql500_ci, который возвращает старое поведение. Я поправил дамп, указав явный collation для таблицы swticketwords, и база успешно импортировалась. Чтобы показать разницу между utf8_general_ci и utf8_general_mysql500_ci я сделал запросы со старым и новым collation.

mysql> select * from swticketwords where contents = 'Voß' collate utf8_general_ci;
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|        20080 | Vos      |
|       126378 | Voß      |
+--------------+----------+
2 rows in set (0.00 sec)

На поле contents создан уникальный ключ ticketwords, и двух значений быть не должно.
mysql> select * from swticketwords where contents = 'Voß' collate utf8_general_mysql500_ci;
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|       126378 | Voß      |
+--------------+----------+
1 row in set (0.00 sec)

Ссылки:
1) http://bugs.mysql.com/bug.php?id=27877
2) http://bugs.mysql.com/bug.php?id=43593
3) http://dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html

пятница, 3 мая 2013 г.

Восстановление TP-Link TL-WA901ND после неудачной прошивки

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


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

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

Если же вы все еще не передумали, то начать нужно с загрузки в fail safe режиме. Если кратко, то железку нужно выключить, затем включить и когда индикатор "SYS" начнет мигать - нажать кнопку "RESET". После этого индикатор "SYS" должен начать мигать чаще и вы сможете зайти в консоль через telnet по адресу 192.168.1.1. Перед тем, как куда-то заходить, вы должны настроить адрес своего компьютера для сети 192.168.1.0/24.

В том конкретном случае мне повезло и у человека железка была включена в коммутатор (ethernet switch), в котором водится интернет и адрес его сети как раз 192.168.1.0/24. Если у вас не так, то придется пошевелить мозгами, чтобы заполнить пробелы, не описанные в этом посте.

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



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

Сначала нужно перейти в /tmp и проверить, что хватает свободного места.

root@(none):/# df -h /tmp
Filesystem                Size      Used Available Use% Mounted on
tmpfs                    14.3M     56.0K     14.2M   0% /tmp

В моём случае свободно 14M, далее нужно настроить сеть

root@(none):/# echo 'nameserver 8.8.8.8' > /etc/resolv.conf
root@(none):/# route add default gw 192.168.1.15
root@(none):/# ping ya.ru

Если после этих действий у вас начал пинговаться ya.ru, то можно переходить к следующему этапу - загрузке новой прошивки. Тут есть список всех прошивок из trunk проекта openwrt. Поскольку ревизия устройства 1.x, то я выбираю вариант openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin. Теперь нужно скачать прошивку в устройство и на всякий случай проверить контрольную сумму.

root@(none):/# cd /tmp
root@(none):/tmp# wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin
root@(none):/tmp# wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/md5sums
root@(none):/tmp# md5sum -c md5sums 2>/dev/null | grep -v FAILED$
openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin: OK

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

root@(none):/tmp# mtd -r write openwrt-ar71xx-generic-tl-wa901nd-v1-squashfs-sysupgrade.bin firmware

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


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

вторник, 30 апреля 2013 г.

Включение maintenance режима в Nginx без помощи системного администратора

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

Имеем два ip адреса, с которых нужно пускать клиентов независимо от текущего режима сайта (для примера 67.81.43.124 и 67.23.44.5). Чтобы для включения maintenance режима не нужно было дергать администратора, будем считать наличие файла maintenance.flag в корне сайта, признаком включения maintenance режима.

Я использую nginx из Debian Squeeze и примеры будут ориентированы на него.

Для поддержки нового режима я добавил несколько секций в /etc/nginx/sites-enabled/www.example.com

geo $show_maintenance_page {
    default yes;
    67.81.43.124 no;
    67.23.44.5 no;
}

server {
    listen 80;
    server_name www.example.com example.com;

    if ( -f /var/www/www.example.com/maintenance.flag ) {
        set $maintenance y;
    }

    if ( $show_maintenance_page = yes ) {
        set $maintenance y$maintenance;
    }

    if ( $maintenance = yy ) {
        return 503;
    }

    error_page 503 @maintenance;

    location @maintenance {
        root /var/www/maintenance;
        rewrite ^(.*)$ /maintenance.html break;
    }

    # All other config

}

Содержимое /var/www/maintenance у меня существует еще с прежнего варианта, который я описывал ранее. Теперь чтобы перевести сайт в режим maintenance нужно создать файл maintenance.flag в корне сайта (/var/www/www.example.com). После этого всем посетителям будет выдавать maintenance страницу, а для тех, кто заходит с адресов 67.81.43.124 или 67.23.44.5 будет доступен сайт. Чтобы выключить maintenance достаточно удалить файл maintenance.flag.

понедельник, 22 апреля 2013 г.

WHM/cPanel: There are no databases associated with your account

Столкнулся с тем, что для некоторых пользователей в cPanel в разделе "MySQL Databases" стало долго думать, а затем выдавать ошибку "There are no databases associated with your account.".

Гугл выдает аналогичные проблемы и много вариантов решений, но мне ни одно не помогло. Базы видны в phpMyAdmin, но в cPanel с ними работать не удается.

Пока дебажил, заметил в процессах такую связку

cpsrvd (SSL) - waiting for c --llu=1366639891 --listen=3,4,5,6,7,8
 \_ cpaneld - serving 117.65.29 --llu=1366639891 --listen=3,4,5,6,7,8
    \_ /usr/local/cpanel/cpanel ./frontend/x3/sql/index.html
       \_ /usr/local/cpanel/bin/cpmysqlwrap
          \_ /usr/local/cpanel/3rdparty/bin/perl /usr/local/cpanel/bin/cpmysqladmin

Если подключиться к последнему процессу через strace, то видно что он ожидает на вызове read. Поскольку название скрипта намекает на связь с mysql, то смотрю список активных запросов

...
select TABLE_SCHEMA as DB,SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) AS SPACEUSED from information_schema.ta
...

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

Если несколько раз обновить страницу, то становится заметно, что ошибка появляется примерно через 2 минуты. Начинаю смотреть код скрипта и в первых строках нахожу причину

29 
30 $SIG{'ALRM'} = sub { die "Timeout: Alarm"; };
31 
32 alarm 120;
33 

Получается, что скрипт взводит "будильник" на 2 минуты и именно он мешает скрипту выполниться до конца. Меняю в 30 строке alarm 120 на alarm 300.

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

вторник, 16 апреля 2013 г.

Wine 1.5.28 for Debian Squeeze/Wheezy

Done with packaging Wine 1.5.28 for Debian Squeeze (i386, amd64) and Debian Wheezy (i386 only). Changelog for the new release. Binary packages can be installed via my repository.

Multi-arch support for Wheezy still not fixed.

суббота, 6 апреля 2013 г.

Переключение SATA в режим AHCI на ASUS EeePC 1000H


Чтобы получить максимум производительности от использования SSD диска в своем нетбуке ASUS EeePC 1000H мне пришлось поискать модифицированный BIOS, где есть поддержка этого режима. AHCI нужен для использования команды TRIM (по-умолчанию в 1000H sata порт работает в режиме эмуляции IDE и изменить это нельзя).

Поиски в гугле привели меня в ветку форума сайта bios-mods.com, где добрые люди выложили модифицированный BIOS для EeePC 1000H. На форуме можно скачать несколько модификаций этого BIOS, самая базовая из них только меняет OEM лого и включает опции настройки режима порта SATA. Я брал вариант ASUS 1000H ACPI BIOS Revision 2204GT (AHCI).

Для обновления BIOS нужна флешка, отформатированная в FAT32 (я использовал свою старую на 512MB). В архиве есть файл1000H-ASUS-2204GT-01.ROM, его нужно скопировать в корень вашей флешки и переименовать в 1000H.ROM. После этого перезагрузить нетбук и нажать Alt+F2 в момент прохождение POST - начнется процесс обновления BIOS (каждый раз, когда меняю прошивку в железе на мгновение замирает сердце, пока бежит прогрессбар).

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

Зайдя во вкладку "Advanced" в категории "IDE Configuration", задаю значение параметра "ATA/IDE Configuration" равным "Enhaced".

После этого активируется параметр "Configure SATA as" - его значение нужно выставить в "AHCI".

После сохранения параметров и перезагрузки SATA работал уже в режиме AHCI.

UPDATE: После установки старого жесткого диска появилась пауза при перезагрузке (примерно 30 секунд). При выключении такой паузы нет. Если SATA в режиме AHCI и установлен SSD диск, то паузы нет, а если установлен жесткий диск - пауза есть. Решается переключением SATA порта в режим эмуляции IDE.

среда, 3 апреля 2013 г.

Наглядное пособие по работе garbage collector в SSD дисках

Хорошая картинка для понимания работы SSD диска. Наглядно показано что такое page и erase block и как работает garbage collector.
Взято отсюда.

вторник, 2 апреля 2013 г.

Оптимизация дисковой подсистемы

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

Сперва добавил битмап к raid - это даст возможность быстрее восстановить raid массив после сбоя, поскольку будут синхронизироваться только занятые блоки, которые помечены в битмапе как используемые.

# mdadm -C /dev/md3 -b internal -c 64 -l 5 -n 4 /dev/sd[e-h]2

Размер чанка (chunk) нового массива равен 64k, теперь нужно создать группу томов на новом массиве используя выравнивание по размеру чанка.

# pvcreate -M2 --dataalignment 64k /dev/md3

Осталось переместить данные со старого raid массива на новый

# vgextend vg00 /dev/md3
# pvmove /dev/md1
# vgreduce vg00 /dev/md1

Ссылки
1 http://wiki.tldp.org/LVM-on-RAID
2 https://raid.wiki.kernel.org/index.php/RAID_setup

суббота, 30 марта 2013 г.

Wine 1.5.27 для Debian Squeeze/Wheezy

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

пятница, 29 марта 2013 г.

session.save_handler = eaccelerator в PHP

Если у вас в свежем eaccelerator (проверял на 0.9.6) не регистрируется хендлер в PHP сессиях, то поможет откат на версию 0.9.5.x.

$ wget --no-check-certificate https://github.com/eaccelerator/eaccelerator/archive/0.9.5.zip -O eaccelerator-0.9.5.zip
$ unzip eaccelerator-0.9.5.zip
$ cd eaccelerator-0.9.5
$ phpize
$ ./configure --enable-eaccelerator=shared --without-eaccelerator-encoder --without-eaccelerator-loader --with-eaccelerator-shared-memory --with-eaccelerator-content-caching --with-eaccelerator-sessions
$ make
$ make install

Я не в курсе почему нет сессий в новой версии - в ChangeLog ничего не видно на этот счет.

UPDATE: В процессе тестирования на простом примере сессия работала

<?php
ini_set('session.save_handler', 'eaccelerator');
session_start();
if (isset($_SESSION['test'])) {
        echo "Stored value: " . $_SESSION['test'];
} else {
        echo "Storing session information";
        $_SESSION['test'] = 'Eaccelerator';
}

Но при тестировании на маджентовском сайте перестает работать сессия - похоже поддержку убрали не просто так.

четверг, 28 марта 2013 г.

Сравнение значения переменной с regex в bash старше 3.1.x

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

#!/bin/bash
int_value=-123

if [[ ! "$int_value" =~ "^-?[0-9]+$" ]]; then
    echo "You specified not integer value: $int_value"
else
    echo "Integer value: $int_value"
fi

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

$ bash ./test.sh
You specified not integer value: -123

А если запустить его через zsh, то все работало верно:

$ zsh ./test.sh
Integer value: -123

В принципе можно было заменить код на

#!/bin/bash
int_value=-123

if echo "$int_value" | grep -qE '^-?[0-9]+$'; then
    echo "Integer value: $int_value"
else
    echo "You specified not integer value: $int_value"
fi

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

Все стало на свои места после прочтения топика на stackoverflow. Оказывается в bash 3.2 поменяли поведение квотинга при сравнении с regex выражениями и теперь квотить не нужно (более того, старый вариант теперь работает неверно). Чтобы вернуть совместимость с кодом на bash 3.1, нужно либо выставить флаг совместимости compat31, либо исправить код, убрав квотирование

#!/bin/bash
int_value=-123

if [[ ! $int_value =~ ^-?[0-9]+$ ]]; then
    echo "You specified not integer value: $int_value"
else
    echo "Integer value: $int_value"
fi

Если переписывать много кода лень, то можно просто выставить опцию совместимости

#!/bin/bash

setopt compat31
int_value=-123

if [[ ! "$int_value" =~ "^-?[0-9]+$" ]]; then
    echo "You specified not integer value: $int_value"
else
    echo "Integer value: $int_value"
fi

вторник, 26 марта 2013 г.

Обновление прошивки THL W3+

На выходных набрался смелости и обновил прошивку своего THL W3+. Мой прошлый смартфон Huawei U8500 прошивался через заливку файла update.zip и нажимании комбинации клафиш при включении телефона. А вот с THL W3+ пришлось долгое время читать 4pda.ru и forum.china-iphone.ru.

Значительных проблем со старой прошивкой не было, но пара моментов изрядно раздражали в повседневном использовани:
  • нет прав root (это может показаться излишним, но я предпочитаю иметь полный контроль над устройством);
  • проблема с масштабированием щипком (продолжает масштабировать при касании одним пальцем);
  • периодически переставал работать G-Sensor (переставало работать переключение ориентации из портретного в ландшафтный режим).
Поскольку весь инструментарий только для Windows, то пришлось найти бэкап и восстановить образ винды для своего нетбука.

Сперва сделал полный бэкап через MTK Droid Root & Tools. Затем во SP Flash Tool попробовал установить mod recovery от rua1. Несколько раз пришлось доставать батарею и заново подключать телефон, чтобы поймать момент подключения прошивальщика. Кстати установить драйвера на этот прошивальщик оказалось проще, чем потом его использовать.

После загрузки нового recovery, экран покрылся полосами - это известный баг, поэтому тут пригодился бэкап. Секцию recovery восстановил через SP Flash Tool и перезагрузился. В этот раз все в порядке. Уверенности прибавилось...

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

Я не буду повторно описывать весь процесс - все необходимое вы найдете по ссылке выше.

После всех действий у меня появилась последняя официальная прошивка от 13.11.2012, права root, одна флешка (та которая sdcard, а не кусок internal storage) и надеюсь исчезли глюки.

пятница, 22 марта 2013 г.

Плата для arduino за два вечера

Вчера закончил первый вариант платы микроконтроллера, которая после небольших доработок поддерживается средой Arduino. Сердцем платы является ATmega1284p - это самый навороченный кристал на ядре AVR в корпусе DIP.

МК имеет 128kb Flash, 16kb SRAM и 4kb EEPROM. Кроме того довольно богатый набор периферии на борту: 2 UART, 3 SPI и один I2C (TWI).

Последним штрихом в создании стало именование платы - после недолгого перебора созвучий с uino решил назвать ее "Tatuino". Хотя к ардуино-совместимым эта плата не относится, но менять название не стал - какая-то ассоциация со зведными войнами и Татуином.

Чтобы плата начала поддерживаться в среде Arduino, нужен файл с описанием платы. Содержимое нужно распаковать в ваш ProjectDir/hardware и перезапустить среду. Для правильной работы нужна версия 1.0.x+.

В процессе прикручивания платы я сделал бэкпорт пакетов arduino 1.0.4 (вроде самый свежий релиз на сегодня) для Debian Squeeze и залил в свой репозитарий. Чтобы установить нужно подключить секцию backports

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

При установке должно стянуть пакеты arduino, arduino-core и librxtx-java.

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

понедельник, 18 марта 2013 г.

Моделирование Arduino скетчей во Fritzing

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

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

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

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

Мой вариант
Попробовал запустить версию friting, которую скачал с сайта, но не получилось - бинарник в архиве собран под более новый libc6.so, чем тот, что есть в squeeze.

Чтобы все же оценить возможности приложения в Debian Squeeze я сделал бэкпорт версии 0.7.10b - его можно взять в моем репозитарии в секции backports.

воскресенье, 17 марта 2013 г.

Wine 1.5.26 для Debian Squeeze/Wheezy

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

воскресенье, 10 марта 2013 г.

Редирект через mod_rewrite превращает POST запрос в GET

Если использовать редирект POST запроса через mod_rewrite, то в результате POST превратится в GET

<IfModule mod_rewrite.c>
  RewriteCond %{REQUEST_URI} ^auth.php$
  RewriteRule (.*) http://auth.example.com/login.php [R=301,L]
</IfModule>

Несмотря на всю костыльность самой идеи есть способ, который позволит избежать этой проблемы. Вместо 301 редиректа нужно использовать 307.

<IfModule mod_rewrite.c>
  RewriteCond %{REQUEST_URI} ^auth.php$
  RewriteRule (.*) http://auth.example.com/login.php [R=307,L]
</IfModule>

Решение было найдено моим коллегой в википедии.

Wine 1.5.25 для Debian Squeeze/Wheezy

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

Чтобы установить новую версию Wine в Debian Wheezy (amd64) вы можете воспользоваться инструкцией.

четверг, 28 февраля 2013 г.

Отключение ядер процессора в Linux

Отключить ядро или несколько ядер процессора можно так:

$ echo 0 | sudo tee  /sys/devices/system/cpu/cpu1/online
$ dmesg
....
[ 2026.821631] CPU0 attaching NULL sched-domain.
[ 2026.821641] CPU1 attaching NULL sched-domain.
[ 2026.869148] CPU0 attaching NULL sched-domain. [ 2026.875937] CPU 1 is now offline
[ 2026.875945] SMP alternatives: switching to UP code

Чтобы включить ядро обратно, нужно:

$ echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
$ dmesg
....
[ 2097.441078] SMP alternatives: switching to SMP code
[ 2097.642192] Booting processor 1 APIC 0x1 ip 0x6000
[ 2027.140078] Initializing CPU#1
[ 2027.140078] CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
[ 2027.140078] CPU: L2 Cache: 512K (64 bytes/line)
[ 2027.140078] CPU 1/0x1 -> Node 0
[ 2097.656021] CPU1: [ 2027.140078] kvm-clock: cpu 1, msr 0:1915701, secondary cpu clock [ 2097.656021] AMD QEMU Virtual CPU version 1.1.2 stepping 03 [ 2097.656021] CPU0 attaching NULL sched-domain. [ 2197.128013] CPU0 attaching sched-domain: [ 2197.128013] domain 0: span 0-1 level CPU [ 2197.128013] groups: group ffff88000180fd00 cpus 0 group ffff88000190fd00 cpus 1 [ 2197.128013] CPU1 attaching sched-domain: [ 2197.128013] domain 0: span 0-1 level CPU [ 2197.128013] groups: group ffff88000190fd00 cpus 1 group ffff88000180fd00 cpus 0

Эти изменения будут действовать, пока систему не перезагрузят. Чтобы уменьшить количество ядер перманентно нужно передать ядру параметр maxcpus=N, где N - количество ядер, которые нужно подключить в системе при загрузке.

понедельник, 25 февраля 2013 г.

Сохранение всех core файлов в одном месте

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

Создаю отдельный том (чтобы избежать переполнения файловой системы)

$ sudo lvcreate -n cores -L 2G VolGroup00
$ sudo mkfs -t ext3 /dev/VolGroup00/cores
$ sudo mkdir -p /var/local/cores
$ echo '/dev/VolGroup0/cores  /var/local/cores  ext3  defaults,nosuid,nodev   0   2' | sudo tee -a /etc/fstab
$ sudo mount /var/local/cores

Теперь нужно указать ядру сохранять core файлы в новую директорию

$ echo 'kernel.core_pattern=/var/local/cores/core.%e.%p.%t' | sudo tee /etc/sysctl.d/core.conf
$ sudo sysctl -p /etc/sysctl.d/core.conf

Полный список шаблонов есть в man 5 core:
%%  a single % character
%p  PID of dumped process
%u  (numeric) real UID of dumped process
%g  (numeric) real GID of dumped process
%s  number of signal causing dump
%t  time of dump, expressed as seconds since the Epoch,  1970-01-01 00:00:00 +0000 (UTC)
%h  hostname (same as nodename returned by uname(2))
%e  executable filename (without path prefix)
%c  core  file  size soft resource limit of crashing process (since Linux 2.6.24)
Теперь проверяем, будут ли сохраняться файлы в нужном месте. Открываем новый терминал и выполняем команды:

$ ulimit -c unlimited
$ kill -SIGSEGV $$

Терминал должен закрыться, а в /var/local/cores появиться новый файл

$ ls -l /var/local/cores/core.*
-rw------- 1 andrey andrey 1482752 Фев 25 13:47 /var/local/cores/core.zsh.7388.1361789269

суббота, 23 февраля 2013 г.

Восстановление Zalman ZM-VE200 SE после сбоя файловой системы

Дело было вечером, делать было нечего - решил попробовать эмуляцию других типов образов, кроме ISO. На диске у меня два раздела: один сравнительно небольшой, отформатированный в NTFS (для образов и обмена файлами с Windows) и второй раздел, занимающий остальное пространство, отформатированный в Ext3 (для себя любимого).

Вот на NTFS я и решил создать образ жесткого диска image.dsk. Чтобы не дожидаться, пока копируются нули, я создал разреженный файл (sparse file) благо NTFS их поддерживает. Забегая вперед скажу, что это и стало роковым шагом в тот вечер.

пятница, 22 февраля 2013 г.

Впечатляющие достижения HTML5 и WebGL


В дополнение к портированию Sauerbraten: Cube 2 на HTML5 и WebGL (демо) Mozilla и разработчики 3D движка Unigine выпустили еще одну демку. Смотрится замечательно, хотя немного и притормаживает на моей Nvidia GeForce GT440.

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

При создании этой демки используется Emscripten, позволяющий компилировать C++ код в JavaScript.

четверг, 21 февраля 2013 г.

Предоставление доступа по известному ip адресу или через HTTP авторизацию

Если стоит задача разрешить доступ для некоторых клиентов (с известными ip адресами), а у остальных запрашивать HTTP авторизацию, то для Apache это можно сделать так:

Order Allow,Deny
Allow from x.x.x.x
Allow from y.y.y.y

AuthType basic
AuthName "Limited access. Login first!"
AuthUserFile /path/to/valid/.htpasswd
Require valid-user
Satisfy any

В этом случае если посетитель имеет ip адрес x.x.x.x или y.y.y.y, то ему будет предоставлен доступ без запроса пароля, в ином случае будет использована HTTP авторизация.

mod_fcgid: read data timeout in 40 seconds

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

[Thu Feb 21 13:43:48 2013] [warn] [client 192.168.1.117] mod_fcgid: read data timeout in 40 seconds
[Thu Feb 21 13:43:48 2013] [error] [client 192.168.1.117] Premature end of script headers: install.php

Поскольку на сервере стоит cPanel, то проблема решается так:
  • увеличить лимит ожидания ответа (я выставил 3600 секунд), для этого нужно добавить в
    /usr/local/apache/conf/includes/pre_virtualhost_global.conf
    <IfModule mod_fcgid.c>
        FcgidIOTimeout 3600
    </IfModule>

  • обновить конфигурацию apache
    /scripts/rebuildhttpdconf

  • перезапустить apache
    service httpd restart

воскресенье, 17 февраля 2013 г.

Wine 1.5.24 для Debian Squeeze/Wheezy

Вышла новая версия Wine 1.5.24. Пакеты для Debian Squeeze (i386 и amd64) и Debian Wheezy уже заливаются в мой репозитарий, в скором времени будут доступны для установки.

Чтобы установить новую версию Wine в Debian Wheezy (amd64) вы можете воспользоваться инструкцией.

пятница, 15 февраля 2013 г.

Перенос системы на диск 3TB

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

Прошлый апгрейд сервера прошел по схеме:
  • Подключаю к серверу новый диск;
  • Создаю таблицу разделов - два primary раздела (один для корня или /boot и второй для LVM2 PV);
  • Мигрирую LVM на новый диск: pvcreate, vgextend, pvmove, vgreduce, pvremove;
  • Переношу данные, которые были вне LVM (/ или /boot);
  • Устанавливаю загрузчик на новый диск (grub-install).
Но в этот раз технологии шагнули дальше и этот способ больше не годился...

пятница, 8 февраля 2013 г.

Опубликованы подробности уязвимости UPnP в устройствах различных производителей

В прошлом месяце было опубликовано предупреждение о скором раскрытии подробностей о критической уязвимости в беспроводных маршрутизаторах Cisco Linksys. Как и было обещано, на этой неделе опубликовали подробности этой уязвимости.

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

Согласно информации от Rapid7 из приблизительно 80 млн. устройств, найденных в сети, около 15 млн. - уязвимы.

Подобная уязвимость найдена и уже исправлена в libupnp - свободной реализации протокола UPnP.

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

понедельник, 4 февраля 2013 г.

Wine 1.5.23 для Debian Squeeze/Wheezy

Выложил пакеты для Wine 1.5.23 в свой репозитарий для Debian Squeeze/Wheezy. Анонс новой версии.

На этих выходных выдался свободный час и я решил немного улучшить пакеты Wine (wine-unstable), которые я собираю для себя. На linux.org.ru мне порекомендовали обратить внимание на несколько моментов, которые не учтены в моих пакетах:
  • нет поддержки amd64;
  • нет поддержки OpenCL.

Поддержку OpenCL я добавил только вчера и только для версии под Wheezy (пришлось разделить пакет на два, поскольку я не в курсе как добавить "мягкую" зависимость в Build-Depends).

Пакет для Debian Squeeze под архитектуру amd64 я собрал довольно давно, но для Debian Wheezy у меня пока не получается из-за перехода на multi-arch. Это требует адаптации пакета, которая в свою очередь потребует свободного времени. Но как говорил один товарищ в известном фильме Гайдая - "тот кто нам мешает, тот нам и поможет" (C) Кавказская пленница.

Я это к тому, что при помощи multi-arch появилась возможность установить пакеты для архитектуры i386 в amd64 и использовать их без проблем (большинство пакетов Wine под amd64 являются простыми врапперами, которые предлагают установить 32-битную версию). Для этого нужно проделать несколько несложных манипуляций.

Сначала добавим стороннюю архитектуру (у вас ведь нативная amd64?):

root@wheezy ~# dpkg --add-architecture i386

Проверяем, что архитектура присутствует в списке доступных:

root@wheezy ~# dpkg --print-foreign-architectures
i386

Теперь подключите мой репозитарий в APT и обновите список пакетов:

root@wheezy ~# wget -q -O- http://www.tataranovich.com/tataranovich.asc | apt-key add -
root@wheezy ~# apt-get update

Теперь можно установить wine:

root@wheezy ~# apt-get install wine-unstable:i386

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

среда, 30 января 2013 г.

Не загружался сервер с программным RAID1 на MD

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

Недостаток этого способа в том, что не всегда удается надолго вернуть в строй диск подобным способом. Более надежным будет отключить питание от диска и затем подключить его обратно. Поскольку у того сервера нет hot-swap корзины и была возможность отключить сервер, то я выключил и включил сервер (просто перезагрузить или нажать reset может быть недостаточно).

Однако после меню grub'а не последовала загрузка системы, а вместо этого меню ждала ошибка вида VolGroup00/swap not found. Через несколько секунд вывалилось приглашение initramfs и появилась возможность посмотреть причину сбоя.

Поскольку VolGroup00/swap - логический том поверх RAID1В /proc/mdstat не было ни одного массива (на сервере их два: md0 и md1). Смотрю в /etc/mdadm/mdadm.conf - нужные массивы на месте. Пробую запустить их вручную:

initramfs> mdadm -A /dev/md0
initramfs> mdadm -A /dev/md1

После этого нужные массивы появились в /proc/mdstat. Последним штрихом была активация томов LVM2

initramfs> vgchange -ay

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

После перепроверки всех настроек, пересборки initramfs я решил сравнить вывод mdadm --detail --scan и соответствующих секций в /etc/mdadm/mdadm.conf. И вот тут нашлось различие:

# mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=finnix:0 UUID=d5824c5a:ecf39d9a:89c3b877:ec43e0c0
ARRAY /dev/md1 metadata=1.2 name=finnix:1 UUID=4c287c75:edef1139:07ca6e74:b0fcb0e6

# grep ^ARRAY /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=0 UUID=d5824c5a:ecf39d9a:89c3b877:ec43e0c0
ARRAY /dev/md1 metadata=1.2 name=1 UUID=4c287c75:edef1139:07ca6e74:b0fcb0e6

Различие в значении параметров name=. Заменяю описание актуальным и пересобираю initramfs.

# sed -i -e '/^ARRAY/d' /etc/mdadm/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# update-initramfs -u

После всех манипуляция перезагрузка прошла без проблем.

вторник, 22 января 2013 г.

Wine 1.5.22 для Debian Squeeze/Wheezy

Собрал пакеты для свежей версии Wine 1.5.22. Анонс новой версии тут. Пакеты собраны для Debian Squeeze (i386, amd64) и Debian Wheezy (пока только i386). Взять можно в моем репозитарии.

В планах попробовать собрать multiarch для Wheezy, мне уже подкинули пару полезных ссылок, но пока не хватает свободного времени для этого.

пятница, 18 января 2013 г.

Настройка планировщика ввода/вывода для дисков с поддержкой NCQ

Появление NCQ в SATA II дисках дало возможность перенести упорядочивание очереди запросов к жесткому диску на плечи самого диска. Сегодня мне довелось тестировать работу базы данных на программном RAID-0 и я решил попробовать NCQ для этой задачи. Чтобы исключить влияние планировщика Linux (сейчас по-умолчанию им является CFQ) я включаю планировщик noop (на самом деле noop не занимается переупорядочиванием запросов и служит для того, чтобы выключить планирование ввода/вывода для конкретного блочного устройства) для всех дисков, которые поддерживают управление очередью запросов.

Руками это можно сделать записав noop в /sys/block/sda/queue/scheduler, но проблема в том, что в тестовый сервер собран на базе простого десктопного железа но с дополнительными SATA контроллерами на шине PCI-E x1. Системный диск и вовсе IDE.

Один из способов решить проблему - задать elevator=noop в параметрах ядра, но тогда придется руками найти системный жесткий диск и вернуть ему cfq в качестве планировщика. Но мне больше нравится идея оставить cfq по-умолчанию, а для жестких дисков с NCQ включить noop в из скрипта при загрузке системы.

$ cat /root/bin/noop4ncq.sh
#!/bin/bash

for _blkdev in `ls -1d /sys/block/*`
do
 # Check if block device has support for NOOP IO scheduler
 if [ -e "$_blkdev/queue/scheduler" ]; then
  if `grep -q noop "$_blkdev/queue/scheduler"`; then
   if [ ! -e "$_blkdev/device/queue_depth" ]; then
    continue
   fi
   if [ `cat "$_blkdev/device/queue_depth"` -gt 1 ]; then
    echo -n "Selecting NOOP I/O scheduler for $_blkdev: "
    echo noop >"$_blkdev/queue/scheduler" 2>/dev/null && echo OK || echo FAIL
   else
    continue
   fi
  else
   continue
  fi
 fi
done

Из скрипта видно, что noop включается не для всех блочных устройств, а только для тех, у которых queue depth > 1. Это связано с тем, что для правильной планирования очереди запросов на аппаратном уровне недостаточно иметь только SATA II жесткий диск. Еще нужна поддержка NCQ в SATA контроллере и операционной системе хоста.

Осталось прописать вызов /root/bin/noop4ncq.sh в /etc/rc.local и все.

UPDATE: Альтернативное решение с использованием UDEV описано тут.

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

Wine 1.5.21 для Debian Squeeze/Wheezy

С горем пополам залил свежий билд Wine 1.5.21 в свой репозитарий. Для squeeze есть сборка для i386/amd64. Для wheezy только i386 (из-за перехода на multiarch и отсутствия свободного времени мне пока не удалось осилить amd64). Анонс версии 1.5.21.

вторник, 8 января 2013 г.

Debian preseed

Пост из разряда смотрю в книгу, а вижу фигу.

Пол-часа перечитываю документацию к debian unattended install, но не могу понять почему она не стартует. После N-го прочтения доки таки рассмотрел строку "When the graphical installer menu appears, press ESC", а я пытался жать Tab и редактировать параметры.

Чтобы не забыть
  • Нажать Esc (должно пропасть графическое меню и появиться приглашение boot:);
  • Вбить auto url=http://1.2.3.4/path/to/preseed.cfg;
  • Давить Enter и идти пить чай.