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

dhcp и ddns

Речь идет о двух системах - клиент под Linux и сервер Windows. Достаточно стандартная ситуация: dhcp сервер раздает ip адреса и регистрирует имена компьютеров в dns (реализция ddns от Microsoft). При настройках dhcp по умолчанию, в dns регистрируются клиенты dhcp которые делают об этом специальный запрос dhcp. Суть проблемы - клиент под Linux, получая адрес от dhcp сервера, не регистрируется в dns.

Решение проблемы от Microsoft - в настройках dhcp сервера указать необходимость регистрации в dns клиентов dhcp не поддерживающих запросы обновления.

Решение проблемы от меня =) - я решил, а правильно это или нет, кто виноват и что делать оставим за кадром.

Пройдя путь решения по Misrosoft-овски я удивился, что продвинутый, в сетевом плане, Linux в достаточно тревиальном вопросе оказался, мягко говоря, не на высоте. Т.к. у меня Gentoo, то мой Gentoo-way был тернист =).

Первое, что было сделано, это освежение в памяти настроек dhcp. По дукументации, gentoo x86 handbook, предлагается использовать один из 3-х доступных dhcp клиентов: dhclient, dhcpcd или pump. Так же, в документации, есть простенькая табличка, в которой приведена краткая характеристика каждого из клиентов, из которой следует:

  • dhclient - создан ISC, теже люди, что и BIND делают. Очень гибкий, много настроек, но не умеет получать ntp и не отправляет имя хоста.
  • dhcpcd - основной клиент Gentoo, и активно развивается Gentoo, но имеет ряд багов (тормозит и падает).
  • pump - легкий, но не надежный и мало, что умеет

Естественно оказалось, что у меня используется именно dhcpcd. Когда выбирал, pump был отброшен из за нелестных отзывов, а dhclient из за того, что он входит в пакет dhcp, который еще и сервер, а лишнего на компьютер ставить не хотелось.

Из описания dhcpcd следует, что он не передает некий hostname. Как можно получать ip адрес и не передавать hostname я не понял, т.к. в dhcp регистрируется компьютер с именем. Т.к. для регистрации в dns необходимо слать специальный запрос, в man-е к dhcpcd нашел необходимую опцию "-F both" и внес ее в настроечный файл /etc/conf.d/net.

#/etc/conf.d/net
modules=( "dhcpcd" )
config_eth0=( "dhcp" )
dhcpcd_eth0="-F both"

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

При внимательном рассмотрении, было обнаружено, что при указании опций регистрации в dns на dhcp сервере мой компьютер регистрируется с каким то неверным именем - перед именем компьютера вставляется не печатный символ, отображаемый квадратиком. Вот тут я и вспомнил про "не передается hostname".

Ok, меня предупреждали про проблемы с hosname, ставлю dhclient и изменяю в /etc/conf.d/net используемый модуль modules=( "dhclient" ). Долго читаю man-ы =). Для настройки dhclienta используется файл /etc/dhcp/dhclient.conf в котором необходимо указать опции регистрации в полученного ip адреса в dns. Вот тут и становится ясна суть проблемы =). Привожу содержание правильного конфигурационного файла dhclient для регистрации Linux компьютера в dns через dhcp по Microsoft:

#/etc/dhcp/dhclient.conf
send fqdn.fqdn "host.domain";
send fqdn.server-update on;
send fqdn.encoded off;

В send fqdn.fqdn указывается польное fqdn имя вашего компьютера. Строка "send fqdn.server-update on;" говорит о необходимости отправки запроса на обновление имени компьютера в dns. Ну и наконец, самая главная опция, которая решает все мои проблемы - fqdn.encoded, устанваливается в off.

Оказывается, что существует два способа передачи fqdn имени компьюетра. Это регламентируется в rfc 4702 The Dynamic Host Configuration Protocol (DHCP) Client. В этом документе описано, что при передаче имени, необходимо неким образом модифицировать передаваемое строку fqdn и считать ранее используемый варинт, отправка ascii строки, устаревшим и не используемым в современных dhcp клиентах.

Клиент dhcpcd отправляет fqdn в кодироанном виде по умолчанию, а опции запрещающей кодирование нет. В клиенте dhclient можно указать как отправлять fqdn на сервер.

В результате, Gento-way выглядит так: при необходимости регистрации имени компьютера с полученным по dhcp адресом в dns Microsoft, необходимо использовать клиента dhcp - dhclient, с указанными опции обязательной регистрации в dns и передачи fqdn без кодирования.

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

Xorg и hal (снова про руссификацию)

Затеялся я обновить драйвер intel для видео на ноутбуке. Меня донимали некоторые артефакты при отрисовке. Последние драйверы, доступные для установки в Gentoo, запросили обновление xorg-server до версии от 1.5 и выше.

Всё как обычно, поставил, перезагрузил и опаньки =). Нет ни мыши ни клавиатуры. Заход по ssh и чтение Xorg.0.log ни чего не дали, за исключением того, что xorg больше не читает настройки про устройства ввода.

Шаманское Gуgленье выдало простой до безобразия ответ. В новой версии xorg для работы с устройствами ввода использует hal и в следствии этого, по умолчанию, игнорирует настройки в xorg.conf касающиеся устройст ввода.

В результате имею свой личнфй ХовТу (howto =) ):
1. В make.conf установлен USE=hal
2. В make.conf установлен INPUT_DEVICES="evdev"
3. Xorg-server и xf86-input-evdev собран с поддержкой hal
4. Установлена политика в хал, которая настраивает действие xkb. Далее, для примера, мой файл политики, сделанный на основе примера из /usr/share/hal (правки отмеченны красным):

# /etc/hal/fdi/policy/10-russian-keymap.fdi
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
<device>
<match key="info.capabilities" contains="input.keymap">
<append key="info.callouts.add" type="strlist">hal-setup-keymap</append>
</match>

<match key="info.capabilities" contains="input.keys">
<merge key="input.xkb.rules" type="string">base</merge>

<!-- If we're using Linux, we use evdev by default (falling back to
keyboard otherwise). -->
<merge key="input.xkb.model" type="string">keyboard</merge>
<match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
string="Linux">
<merge key="input.xkb.model" type="string">evdev</merge>
</match>

<merge key="input.xkb.layout" type="string">us,ru(winkeys)</merge>
<merge key="input.xkb.options" type="string">grp:rctrl_toggle</merge>
<merge key="input.xkb.variant" type="string" />
</match>
</device>
</deviceinfo>

5. Для touchpad раньше я не ставил ни каких драйверов, но с hal драйвер evdev вел себя не не предсказуемо, по этому потребовалось установить xf86-input-synaptics и в скопировать соответствующую политику в /etc/hal/fdi/policy/11-x11-synaptics.fdi из примеров /usr/share/hal/fdi.

Не совсем мне ясен глубинный смысл необходимости работы с hal, точнее вынос настроек из xorg.conf во внешний файл. Меня обычно радовал linux простотой конфигурации, но в последнее время все чаще случаются приступы шизофрении у разработчиков (или у меня).

вторник, 17 марта 2009 г.

Отправка почты из командной строки

Не бывает без проблем =). Получается, что я очень мало знаю о Linux. Можно сказать, что ни чего не знаю. Когда я настраивал postfix мне потребовался консольный почтовый клиент. Ундекс посоветовал mutt. С тех пор я им и пользуюсь.

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

# echo "текст письма" | mutt user@domain -s "тема письма"

Для отправки письма нескольким адресатам, их e-mail можно перечислить через запятую.

При необходимости вложить в письмо файл, можно использовать опцию -a:

# echo "текст письма" | mutt user@domain -s "тема письма" -a file.jpg

В некоторых случаях удобно использовать отдельный конфигурационный файл muttrc, например мне необходимо указать обратный адрес, отличный от основного. Для этого есть опция -F:

# echo "текст письма" | mutt user@domain -s "тема письма" -F /path/muttrc

Есть еще одна опция которая мне понравилась -i, но практический смысл ее использования от меня ускольает. Эта опция позволяет вложить вложить текст в тело письма. Фактически в скрипте можно заранее подготовить текст письма или заранее его заготовить и используя -i вставить его в письмо, но это все равно не избавляет от необходимости подачи на stdin чего либо. В результате я вижу три идентичных варианта:

# echo | mutt user@domain -s "тема письма" -i Текст.txt
# cat Текст.txt | mutt user@domain -s "тема письма"
# mutt user@domain -s "тема письма" < Текст.txt

В процессе использования в различных скриптах подобных конструкций по автоматической отпрвке писем наткнулся на интересное поведение восклицательного знака "!" в теме письма. Если отправка из командной строки выполняется из скрипта, то все коректно отрабатывает. При попытке отправить руками из командной строки, при наличии восклицательного знака в теме письма, консоль переходит в режим ожидания ввода stdin. Очень похоже, что это происходит из за не верной трактовки bash самой строки, но в скрипте, использование восклицательного знака работает корректно.

среда, 11 марта 2009 г.

Печать фотографий

Моя ацкая эпопея с добавлением патача для принтера Canon Selphy CP520 увенчалась успехом. Принтер благополучно печатает. Но как всегда есть бочка дегтя =).

Мой принтер Selphy CP520 предназначен именно для печати фотографий. Т.е. он очень хорошо печатает, и делает это на спец бумаге. Печатает без полей. Фактически, полученные отпечатки, мало чем отличаются от полученных в классическом фотолабе.

Я использую Gwenview и DigiKam. Ни одна из них не дает нормального результата при печати. Основной недостаток - оставляются поля, хотя в настройках принтера поля выведены в ноль. Програамы автоматически не поворачивают изображение.

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

В общем, я несколько разочаровался, но в данном случае мне повезло =). Дело в том, что драйвера gutenprint являются продолжением проекта gimp-print! Фактически Gimp умеет печатать напрямую через gutenprint. В этом случае вывод на печать происходит почти сразу и возможно настроить печать в обрез, точно по размеру бумаги.

В общем выкрутился, но неприятный осадок остался =). Загружать в Gimp поштучно фотографии для печати не спортивно. Попробую найти более удобное решение.

вторник, 10 марта 2009 г.

Создание своего ebuild

В Gentoo меня обычно все устраивает. Но иногда случается необходимость поставить какой либо редкий софт, или более новый софт. До сих пор мне удавалось обойтись без создания собственных установочных пакетов, но наступил день "Ч" =).

У меня есть принтер Canon Selphy CP520. На нем я благополучно печатал фотографии с фотоаппарата по проводу и мобильного телефона через Bluetooth. При этом я частенько печатал неудачные снимки, которые на экране телефона или камеры выглядят вполне достойными. В общем, пришло время подключить принтер к компьютеру и печатать только избранные кадры, да еще и подретушированные.

Поиски драйверов для Canon Selphy CP520 завели меня на сайт http://www.openprinting.org, где написано, что данный принтер поддерживается gutenprint версии 5.2.3 с добавленным патчем. Gutenprint нашелся в Gentoo без проблем, а вот необходимый патч, естественно, в поставку не входит =). Не беда. Засучиваем рукава и приступаем.

Постановка задачи.

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

Дерево portage.

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

В файле /etc/make.conf добавил строчку:

PORTDIR_OVERLAY="/usr/local/portage $PORTDIR_OVERLAY"

Создал соответствующий каталог /usr/local/portage, в котором создал каталог для категории ebuild-а net-print. После этого, как образец, я скопировал папку gutenprint из официального дерева в мое свеже созданое дерево portage и все дальнейшие действия делал не затрагивая основное дерево.

Модификация ebuild.

В новом каталоге /usr/local/portage/net-print/gutenprint я убрал не нужные ebuild-ы, а ebuild необходимой версии переименовал с добалвением в имя файла r1. Таким образом я сделал заготовку для своей версии пакета gutenprint.

Внутри каталога /usr/local/portage/net-print/gutenprint есть папка files. В эту папку я положил необходимый мне для пакета патч. Далее отредактивровал сам файл ebuild-а, добавив строку наложения патчей, по аналогии с уже имеющимися:

epatch "${FILESDIR}"/${P}-r1-cp520.patch

Т.к. файлы были модифицированы, они перестали совпадать с информацией из файла Manifest. Для обновления этого файла, необходимо выполнить команду:

#ebuild путь/к/файлу-ebuild digest

Результат.

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

Установка прошла успешно, а вот печатает ли принтер, я пока не знаю, т.к. проверить это не успел. Основная цель - создание своего ebuild-а, выполнена =).