среда, 29 апреля 2009 г.

FreeNX - авторизация

FreeNX работает через ssh и первоначальное соединение клиента с сервером выполняется от фиксированного имени пользователя - nx. Авторизация пользователя nx в ssh происходит по ключу. Далее, выполняется вход по ssh, уже от имени клиента идет соединение с localhost. Таким образом, для обеспечения работы FreeNX, в ssh достаточно иметь настройки разрешающие подключение к внешним ip адресам сервера пользователю nx с авторизацией по ключу, а пользователям необходима возможность интерактивного входа с localhost.

Если FreeNX настраивается способом, пердлагаемым после утановки (ключ --setup-nomachine-key), то в каталоге пользователя nx устанавливаются заранее сгенерированные ключи от NoMachine. При этом, на стороне клиента, тоже устанавливается, тот же самый ключ и при создании соединения он прописывается в конфигурационный файл клиента.

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

Изменение ключей ssh для FreeNX делается в два этап:
  1. На сервере запускается nskeygen, который создает новые ключи в домашнем каталоге пользователя nx (/var/lib/nxserver/home/.ssh/). Для клиента нужен файл client.id_dsa.key
  2. На клиенте необходимо заменить ключ в файлах конфигурации соединения (файлы с расшерением nxs). Так же, для последующего создания соединений с новым ключом, необходимо заменить содержимое клиентского файла server.id_dsa.key на новое с серверного файла client.id_dsa.key.

вторник, 28 апреля 2009 г.

FreeNX - общая информация

Зацепила меня самооценка. Разборки с FreeNX продолжаются =), а точнее они закончились и есть о чем написать.

Начнем с простого. NX - это протокол, реализующий работу XDMCP со сжатием. Если я правильно понимаю, то NX разработан в компании NoMachine. NoMachine продает свой продукт использующий технологии NX, но при этом, исходные коды ядра NX открыты на условиях GPL.

FreeNX - это GPL реализация NX сервера, клиента и различных NX компонентов. Так же, существует бесплатная версия NX сервера от NoMachine - NX Free Edition. Соответственно FreeNX и NX Free Edition - абсолютно разные вещи.

Я все настраиваю и использую под Windows и Gentoo. На Gentoo установлена серверная часть net-misc/nxserver-freenx, а под Windows использую бесплатного клиента NoMachine. Дополнительно, под Gentoo, в качестве клиента использую net-misc/qtnx.

Как в деталях работает NX, вопрос отдельный и достаточно мутный. В общем случае, клиент по ssh соединяется с сервером, где запускается новая сессия X-сервера, аналогичным со startx методом.

День развлечений (freenx, synaptics)

freenx

Ну удачный день сегодня. Наткнулся в новостях на freenx - некая разновидность терминального сервера. Утверждается, что это тот же xdm только с функциями сжатия и т.п., т.е. как основное преимущество - работа по тонким и плохим линиям связи. Памятуя о том, что дома меня иногда напрягает работа xdmcp через wifi, а уж для применения через интернет, этот протокол вообще не подходит, решил его поставить.

Установка классическая:

#emerge net-misc/nxserver-freenx

Для проверки, с минимальными ограничениями по безопасности, необходимо одна команда:

#nxsetup --install --setup-nomachine-key --clean --purge

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

Дальше скачал клиента под windows c http://www.nomachine.com, подключился и вроде все в порядке. И вот разочарование, на первый взгляд мелочь, а заставила меня полностью отказаться от использования freenx - переключение языка ввода! Я так понимаю, что проблема русского языка не излечима.

Общая суть граблей - настройки сделанные в xorg не транслируются в freenx, соответственно, то что у меня настроено для переключения языка не работает. Локальный язык ввода (из windows) не передается удаленной машине. С танцами и бубнами удалось заставить работать встроенный в KDE переключатель раскладок, но это отличается от моего текущего профиля, при работе на локальном компьютере.

Поступил как последний ламер - снес freenx. Сижу думаю, кто не прав? Я - сдался и не разобрался до конца или все таки опять кривость технологий на стыке windows/linux? Вопросы конечно риторические, но по ходу пора покупать mac =).

synaptics

Для работы тачпада (touchpad) в новом xorg нужно установить драйвер xf86-input-synaptics и установить политику в /etc/hal/fdi/policy/11-x11-synaptics.fdi. Это проблем не вызывает, но как выяснилось, а я сразу не заметил, что при этом не работает щелчок по тачпаду.

Решение оказалось простое, надо добавить в файл политики одну строчку, которая привязывает щелчок по тачпаду к нажатию клавиши:

<merge key="input.x11_options.TapButton1" type="string">1</merge>

Пока копался с этим тапом, нашел еще полезняшку - скрол двумя пальцами. Внимательно читайте файлы с примерами =), там много интересного!

вторник, 14 апреля 2009 г.

sort

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

Пока я остановился на комбинации sort и awk:

#cat file.txt | awk 'NR==1 ; NR > 1 {print $0 | "sort -k 2"}'

Считывается файл и перенаправляется в awk.

Первой командой NR==1 выводится первая строка файла, а дальше, для все строк больше 1, идет печать на стандартный вывод и перенапряляется в sort.

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

Надо искать стандартную утилиту =(. Не нравится мне самодеятельность, не верю, что эта функция не включена ни в одну базовую утилиту.

пятница, 10 апреля 2009 г.

Время загрузки компьютера

Периодически я читаю новости =) о том, как быстро загружается компьютер и соответственно смотрю на собственный ноутбук. Я уже не помню какое ПО и в каком объеме у меня стояло пол года назад, остались результаты измерения от bootchart.

По замерам в ноябре прошлого года у меня получалось время загрузки 43 секунды. Сегодня я произвел новый замер и был приятно удивлен 36 секундами =).

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

Разобрал меня интерес, что делает ядро целых 7 секунд? Его размер копеечный, по сравнению со скоростью передачи данных, процессор достаточно мощный =). Железо заранее известно. В итоге включил я в ядре опцию фиксации времени событий:

Kernel hacking --->
[*] Show timing information on printks


Перезагрузился и анализируя вывод dmesg увидел очень странную вещь:

[ 2.764571] Synaptics Touchpad, model: 1, fw: 6.2, id: 0x1a0b1, caps: 0xa04793/0x302000
[ 2.764699] serio: Synaptics pass-through port at isa0060/serio4/input0
[ 2.802530] input: SynPS/2 Synaptics TouchPad as /class/input/input5
[ 6.910911] input: PS/2 Generic Mouse as /class/input/input6

Получается, что определение моего touchpad-а занимает у ядра практически 4 с лишним секунды!

За работу touchpad-а на ноутбуке в ядре отвечает CONFIG_MOUSE_PS2. Лишаться touchpad-а я не захотел =), по этому попробовал пересобрать поддержку ps2 мышей модулем. И наступило чудо! Скорость загрузки ядра сократилась до 3 секунд, а общее время загрузки с 36 до 31 секунды.

Я в шоке! Всегда считал, что наиболее предпочтительным все устройства собирать в ядре и не заморачиваться модулями. В общем я был беспрецедентно посрамлен =).

Дальнейший анализ результатов bootchart дал еще несколько идей по сокращению времени загрузки. Основной тормоз - fsck.reiserfs. Для проверки, я отключил fsck.reiserfs (создал файл /fastboot) и получил время загрузки 27 секунд! Достаточно.

Главное, что я понял из этих экспериментов - идеала не достичь ни когда.

З.Ы. Для справки - hwclock при старте системы занимает 2 секунды =))).

понедельник, 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 без кодирования.