Показаны сообщения с ярлыком how-to. Показать все сообщения
Показаны сообщения с ярлыком how-to. Показать все сообщения

18 янв. 2009 г.

Об окнах и оконных менеджерах: тонкости организации и управления

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

Предисловие.
По первому фактору лично я для себя выбрал второе - мне удобнее группировать окна по некому признаку и выделять группе окон свое рабочее пространство. Так легче ориентироваться, приходится меньше заниматься "увлекательной" операцией point-and-click, когда нужное окно сначала необходимо найти на панели/доке, а потом активировать мышью. Меня, как правило, сильно напрягает, когда на одном десктопе открыто больше 2-3 окон.

В случае использования таких оконных менеджеров, как fluxbox, dwm, awesome и т.п. в распоряжении пользователя сразу находится необходимый функционал. В общем случае достаточно прописать в файле настроек куда каким окнам рисоваться. Однако, при использовании xfwm, metacity и т.п. мы в выборе весьма ограничены. Да, есть виртуальные десктопы, но средств по управлению окнами предлагается крайне ограниченный набор. В xfwm, скажем, нельзя указать, чтобы окно браузера рисовалось на первом десктопе, без декораций, посередине и с указанными размерами. В таких случаях, пользователю очень сильно поможет программа devil's pie.

Немного об архитектуре WM.
Вывод окон приложений на экран осуществляется в общем случае с помощью двух технических средств - графического сервера (X Server) и оконного менеджера (Window Manager). Технически это представляет собой взаимодействие этих двух процессов. При запросе приложения показать окно верхнего уровня, х-сервер генерирует событие, которое перехватывается оконным менеджером, который в свою очередь создает так называемое frame window. Окно, содержащее в качестве своих составляющих такие компоненты, как главное окно приложения и декорации (название окна, кнопки управления). А также в некоторых случаях позволяет выполнить над окном ряд операций - манипуляции с прозрачностью, прорисовка на определенном десктопе, изменение размеров и т.п. Если менеджер окон не предоставляет функционала для расширенного управления окнами (xfwm, metacity), приходится прибегать к утилитам еще более высокого уровня. Так, devil's pie, представляет из себя демона, который взаимодействует с оконным менеджером - после того, как окно создалось, этот демон может выполнить с ним какие-либо заранее заданные действия. Таким образом, архитектурно это более излишне усложненное решение и лишний уровень абстракции. Однако, во многих случаях выбирать не приходится.
WM architecture

К практике!
Итак, в первую очередь программу нужно установить. Она довольно популярна и входит в состав репозиториев множества популярных дистрибутивов:

apt-get install devilspie
pacman -S devilspie

Для работы программа использует набор правил для ряда приложений, создаваемых пользователем. Правила должны располагаться в ~/.devilspie и представлять из себя простые текстовые файлы с расширением *.ds. Как пример приведу мое правило ~/.devilspie/Firefox.ds для браузера Firefox:
( if
( and
( is ( application_name ) "Firefox" )
)
( begin
( set_workspace 1 )
( println "match" )
)
)

Как можно легко понять, первые три строчки здесь представляют из себя условие, необходимое для срабатывания правила. В данном случае это появление окна с именем приложения "Firefox". Далее идет секция действий, которые следует предпринять с данным окном. В моем примере - переместить его на первый десктоп. Команда println "match" служит для отладочных целей настройки - она выводит в терминал с запущенным devil's pie "match", при срабатывании правила.
В качестве условий может выступать множество значений: window_class, window_role, window_name; также, как и в качестве действий: maximize, fullscreen, stick, center, geometry. Все эти значения можно посмотреть в руководстве man devilspie.
Приведу более сложный пример:
( if
( and
( is ( window_role ) "mainWindow" )
( contains ( window_class ) "Sonata" )
)
( begin
( wintype "utility" )
( set_workspace 5 )
( geometry "912x898+142+23" )
( println "match" )
)
)

Данное правило будет ждать появления окна с ролью "mainWindow" и класс которого содержит слово "Sonata". А затем присвоит окну тип "utility" (это позволит не становиться ему прозрачным, к примеру), перенесет на пятый десктоп и установит размеры и положение "912x898+142+23" (ширина, длина, позиция по оси X, позиция по оси Y).

Замечание: в xfce оконный менеджер по умолчанию перебрасывает окно, требующее фокус, на текущий десктоп. В частности, это приводит к тому, что не все ваши правила в devil's pie будут работать корректно и что при нажатии на ссылку, скажем, в почтовом клиенте на втором десктопе, браузер переброситься с первого десктопа на второй с почтовым агентом. Это не баг, а просто нет единого мнения у разработчиков по этому поводу. Однако, такое поведение можно отключить, добавив в файл ~/.config/xfce4/mcs_settings/wmtweaks.xml следующую строчку:
< option name="Xfwm/ActivateAction" type="string" value="none"/ >


Расширенный контроль сложных окон на примере GIMP.
Графический редактор GIMP сам по себе довольно нетривиально работает со своими окнами. Нельзя просто сказать всем окнам класса "Gimp" появляться на заданном десктопе - это не сработает. Однако, я провел небольшое изучение этого вопроса и просто приведу правила для Гимпа, а любой желающий сможет их прочесть и разобраться.
Итак, я создал три правила: два для стандартных боковых фреймов с инструментами и одно для, собственно, окна редактирования изображений.

Окно Toolbox с кистями, инструментами и т.п.:
( if
( and
( is ( window_role ) "gimp-toolbox" )
( contains ( window_class ) "Gimp" )
)
( begin
( undecorate )
( set_workspace 5 )
( geometry "136x925+0+25" )
( println "match" )
)
)

Окно со слоями и т.п.:
( if
( and
( is ( window_role ) "gimp-dock" )
( contains ( window_class ) "Gimp" )
)
( begin
( undecorate )
( set_workspace 5 )
( geometry "217x925+1062+25" )
( println "match" )
)
)

Окно редактирования изображений:
( if
( and
( is ( window_role ) "gimp-image-window" )
( contains ( window_class ) "Gimp" )
)
( begin
( wintype "utility" )
( set_workspace 5 )
( geometry "912x898+142+23" )
( println "match" )
)
)

Как видно из правил, все окна Гимпа перебрасываются на пятый десктоп и изменяют каждое свои размеры (меня очень раздражало, что Гимп автоматически позиционирует каждое окно с изображением). Окна-доки с инструментами и слоями также лишаются декораций (мне они ни к чему и только занимают место и визуальное пространство). А окно редактирования меняет тип на "utility", что не позволяет ему становится прозрачным (у меня включен композитинг и прозрачность активных/неактивных окон разная, т.о. вы можете себе представить в какое "удовольствие" превращается работа с изображением, когда приходится переключаться между окном редактирования и окнами инструментов).
Результат, как говориться, налицо:
GIMP with devil's pie
Дополнительные средства.
Не всегда удобно вручную возиться с правилами и помнить все десятки условий и возможных действий, которые поддерживает devil's pie. В этом случае я рекомендую воспользоваться утилитой gdevilspie - графический настройщик на pyGTK. Он позволяет очень просто парой кликов задавать правила и получать список параметров текущих окон.
По поводу определения параметров окон стоит сказать отдельно. Существует много средств для получения названий, классов, положения и ролей окон. Во-первых, это вывод самого devil's pie - достаточно запустить его из терминала, как мы увидим список присутствующих сейчас окон. Во-вторых, это программа xprop, которая позволяет указать нужное окно мышью и выведет большой массив данных. Отфильтровать их можно например так:
xprop | grep -i role

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

Заключение.
На этом, пожалуй, и закончу. Как видите, не все оконные менеджеры сразу предоставляют широкий функционал и, как правило, реагируют на одни и те же действия весьма по-разному. Однако, средства есть, хоть и сторонние. При всех недостатках метода контроля окон уровнем выше wm, это работает и весьма надежно. Так что ничто не мешает вам наслаждаться прелестями разграниченного рабочего пространства в таких окружениях, как Gnome, KDE и XFCE. Хотя для пользователей, которые хотят всё и сразу из коробки, я бы посоветовал взглянуть на Fluxbox, Openbox и другие. Как правило, при своих малых размерах, они уже прекрасно умеют всё то, что я здесь рассказывал без всяких дополнительных средств.

Ссылки:.
1. Window Managers for X: Introduction
2. Wikipedia: Re-parenting window manager
3. Devil's Pie: Syntax & Examples


Полный текст очерка

16 нояб. 2008 г.

Перенос системы на другой раздел

Когда возникает необходимость перенести рабочую систему на новый раздел или жесткий диск, многие, наверняка, выберут просто инсталляцию с нуля и копирование конфигов. Однако, такой подход не слишком практичен. Во-первых, это время. Нужно прожигать инсталляционный образ, тысячу раз перезагружаться и т.д. Да и образ не всегда бывает под рукой. Во-вторых, все-таки придется доустановить нужные пакеты и вообще привести систему в порядок. Гораздо быстрее и практичнее просто перенести уже рабочую систему на новое место со всеми пакетами/настройками и т.п. Это только звучит страшно, но на самом деле с помощью обычных gnu-утилит делается очень легко, быстро и просто.

1. Приготовления
Во-первых, советую весь процесс выполнять с Live CD, а не непосредственно с рабочей системы (хотя я делал и так без проблем). Это исключит вероятность несоответствия исходных и конечных данных.
Во-вторых, следует создать все нужные разделы для нового расположения системы.
И, в-третьих, примонтировать те разделы, информацию с которых предстоит переносить и те, на которые будет произведен перенос. Предположим, что исходный раздел - /media/old_root, а конечный - /media/new_root.

2. Процесс
В нижеследующих командах подразумевается, что у вас есть полный доступ к разделам или вы знаете, что такое sudo.
1)

cp -xpr /media/old_root /media/new_root
Тем самым мы просто скопируем исходный корень в конечный, со всеми атрибутами исходных файлов и директорий, а также будем держаться в пределах одной файловой системы (то есть, если у вас что-то примонтировано в /media/old_root/mnt/disk - оно не скопируется). Процесс длительный. Можно добавить в начало команды time, чтобы в конце узнать, сколько длилось копирование :)
2)
mount --bind /dev /media/new_root/dev
Монтируем текущий /dev в новый раздел, чтобы новая система "видела" установленные устройства. Это нужно для корректной установки загрузчика.
3)
chroot /media/new_root
Входим в окружение новой системы.
4)
mount -t proc proc /proc
Монтируем файловую систему /proc.
5)
mkswap /dev/new_swap
Говорим системе, где находится новый, предварительно созданный swap-раздел. Например, /dev/sda3.
6)
grub -> root(hd0,0) -> setup(hd0)
Этими командами мы установим загрузчик grub (директория которого находится в hd0,0) на новый диск hd0 (т.е., в MBR). Выполнять это следует только при переносе системы на новый HDD. При переносе просто на другой раздел текущего HDD старый загрузчик останется в рабочем состоянии и нужно будет только подправить его конфиг.
7)
nano /boot/grub/menu.lst
Подправим конфиг загрузчика - теперь он должен указывать на свежесозданные разделы. Если вы переносите систему только на другой раздел, то править нужно старый menu.lst - /media/old_root/boot/grub/menu.lst
8)
nano /etc/fstab
Также необходимо подправить конфиг монтируемых при загрузке устройств.

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

3. Дополнения
1) Прописывать новые разделы в menu.lst и fstab лучше всего по UUID (Universally Unique Identifier) этих разделов. Это исключит вероятность того, что именование ваших разделов будет отличным от текущего и в любом случае ядро сможет правильно работать именно с нужными вам разделами. Узнать идентификаторы можно командой ls -l /dev/disk/by-uuid/.
В menu.lst формат будет таким:
kernel /vmlinuz26 root=/dev/disk/by-uuid/1ce08b86-b671-4013-beda-2d521ab187ec ro quiet vga=794 splash

А для fstab таким:
UUID=1ce08b86-b671-4013-beda-2d521ab187ec / ext3 defaults 0 1

2) В Arch Linux я столкнулся с проблемой при перезагрузке:
kinit: opening console: no such file or directory

В данном случае достаточно выполнить данную команду:
mknod -m 600 /dev/console c 5 1

Выполнять, естественно, надо в chroot. Или можно просто скопировать этот файл со старой системы (cp -a).
Также рекомендую пересоздать загрузочный образ:
mkinitcpio -p kernel26

из chroot.

4. Вот и всё
Перезагружаемся, проверяем всё ли работает.
???
PROFIT!

При написании данного очерка использовались материалы из данного топика на forum.ubuntu.ru А также 4 жестких диска и дистрибутивы Arch Linux "Overlord" и Debian Etch. Ни один из них в результате не пострадал.


Полный текст очерка

5 окт. 2008 г.

Цветной вывод в bash

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

Цветной вывод
Мне часто бывает нужно выделять определенные строки цветом, так что я просто создал файл /etc/colors следующего содержания:

#!/bin/sh
c_std=""
c_h_std=""
c_pink=""
c_h_pink=""
c_red=""
c_h_red=""
c_cayan=""
c_h_cayan=""
c_yellow=""
c_green=""
c_h_green=""
c_blue=""
c_h_blue=""

В нем задаются переменные, хранящие в себе соответствующие своим названиям цвета. Так, например, "c_std" - стандартный цвет текста в терминале; "c_h_std" - он же, но более "жирное" начертание, и т.д.

Этот файл можно использовать в скриптах для цветного вывода. Например:
#!/bin/bash
. /etc/colors

echo "${c_green}Это зеленый цвет${c_std}"


Цветное приглашение bash
Здесь в принципе идея та же, только у меня цвета прописаны в самом bashrc - так уж повелось. Приведу часть своего basrc, отвечающую за приглашение, там все и так довольно очевидно:
bash_prompt() {
local NONE="\[\033[0m\]" # unsets color to term's fg color

# regular colors
local K="\[\033[0;30m\]" # black
local R="\[\033[0;31m\]" # red
local G="\[\033[0;32m\]" # green
local Y="\[\033[0;33m\]" # yellow
local B="\[\033[0;34m\]" # blue
local M="\[\033[0;35m\]" # magenta
local C="\[\033[0;36m\]" # cyan
local W="\[\033[0;37m\]" # white

# emphasized (bolded) colors
local EMK="\[\033[1;30m\]"
local EMR="\[\033[1;31m\]"
local EMG="\[\033[1;32m\]"
local EMY="\[\033[1;33m\]"
local EMB="\[\033[1;34m\]"
local EMM="\[\033[1;35m\]"
local EMC="\[\033[1;36m\]"
local EMW="\[\033[1;37m\]"

# background colors
local BGK="\[\033[40m\]"
local BGR="\[\033[41m\]"
local BGG="\[\033[42m\]"
local BGY="\[\033[43m\]"
local BGB="\[\033[44m\]"
local BGM="\[\033[45m\]"
local BGC="\[\033[46m\]"
local BGW="\[\033[47m\]"

case $TERM in
xterm*|rxvt*)
if [ `echo $SSH_CLIENT | wc -c` -gt 1 ]; then SSH_FLAG=1; fi
if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
if ([ "$SSH_FLAG" = 1 ] && [ "$ROOT_FLAG" = 1 ]); then
local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
elif [ "$SSH_FLAG" = 1 ]; then
local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
elif [ "$ROOT_FLAG" = 1 ]; then
local TITLEBAR='\[\033]0;\u@\h\007\]'
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
else
local TITLEBAR='\[\033]0;\u@\h\007\]'
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
fi
;;
*)
if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
if [ "$ROOT_FLAG" = 1 ]; then
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
else
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
fi
;;
esac
}

bash_prompt

Внимательный читатель заметит, что также присутствует проверка на то, является ли текущая сессия сессией ssh и/или рутовой сессией. Соответственно устанавливаются флаги SSH_FLAG и ROOT_FLAG и определенным образом меняется приглашение. Пример:


Полный текст очерка

3 авг. 2008 г.

Оптимизация файловой системы XFS

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

Есть очень хорошая статья на эту тему здесь. Я частично переведу некоторые моменты.

Немного теории
Архитектура XFS такова, что содержимое файла в ней располагается в так называемом "пространстве переменной длины" (extent). Данные пространства представляют собой смежные регионы, расположенные в файловой системе. То есть, при копировании файла на ФС он обычно занимает один extent. Однако, если позже содержимое файла меняется, то возможна ситуация, что пространство, находящееся после файла, уже занято другими данными. В этом случае содержимое файла может быть помещено в два разных extent'а, физически находящиеся на удаленных друг от друга местах диска. Конечно, какой-либо процесс/программа по-прежнему без проблем может обращаться к файлу, однако скорость работы снижается при обращении к разным удаленным друг от друга секторам диска.
В зависимости от аспектов использования ФС, файлы на ней могут довольно значительно фрагментироваться.

Программа xfs_bmap: просмотр информации о расположении файла
С помощью программы xfs_bmap можно увидеть карту extent'ов, в которых хранится конкретный файл.

[alsvartr@bust ~]$ xfs_bmap -v /media/storage/VL5.9-Light-B2.iso
/media/storage/VL5.9-Light-B2.iso:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL
0: [0..416991]: 392994088..393411079 10 (26702088..27119079) 416992
1: [416992..532679]: 392631640..392747327 10 (26339640..26455327) 115688
2: [532680..641599]: 64962272..65071191 1 (28333072..28441991) 108920
3: [641600..712959]: 63823592..63894951 1 (27194392..27265751) 71360

Опция -v (verbose) выводит дополнительную информацию.
Как видно, файл VL5.9-Light-B2.iso фрагментирован: хранится в четырех разных extent'ах. Можно попробовать его дефрагментировать.

xfs_fsr: дефрагментация XFS
Данная программа предназначена для реорганизации XFS. Достаточно указать ей нужный файл:
[alsvartr@bust ~]$ xfs_fsr /media/storage/VL5.9-Light-B2.iso

Дефрагментация длится некоторое время в зависимости от объема файла. Можно теперь снова проверить карту extent'ов:
[alsvartr@bust ~]$ xfs_bmap -v /media/storage/VL5.9-Light-B2.iso
/media/storage/VL5.9-Light-B2.iso:
EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL
0: [0..712959]: 394944045..395411741 10 (26702088..27119079) 712960

Теперь файл занимает один extent.

Для того, чтобы дефрагментировать всю файловую систему целиком, достаточно указать в качестве параметра к программе устройство ФС, вместо файла:
[alsvartr@bust ~]$ xfs_fsr /dev/sdb1
/media/storage start inode=0

Полезными опциями также могут быть -v (выводит информацию о файле, обрабатывающемся в данный момент) и -t (время работы программы).
Про последнюю опцию стоит сказать отдельно. Она ограничивает время работы программы указанным значением в секундах. То есть запуск xfs_fsr -t 7200 /dev/sdb1 ограничит время работы двумя часами. После истечения указанного времени xfs_fsr сохранит текущее состояние работы в файл /var/tmp/.fsrlast, чтобы продолжить с этого же места в следующий раз, когда будет указана опция -t. С помощью этой опции можно, например, автоматически выполнять дефрагментацию регулярно небольшими интервалами по cron'у.
Нужно отметить, что механизм работы xfs_fsr состоит в том, что при обработке каждого отдельного файла его содержимое копируется в отдельный extent и метаданные ФС меняются так, что новый файл заменяет старый. Поэтому для дефрагментации необходимо иметь достаточно свободного места - столько, чтобы поместилась копия любого файла на диске.
После выполнения xfs_fsr полезно взглянуть на текущий процент фрагментации ФС.

Статус фрагментации при помощи xfs_db
Программа xfs_db может быть использована для просмотра информации о фрагментации файлов:
[alsvartr@bust ~]$ xfs_db -r /dev/sdb1
xfs_db> frag
actual 101181, ideal 95800, fragmentation factor 5.32%
xfs_db> quit

Опция -r (readonly) нужна для проверки ФС, которая в данный момент примонтирована и используется.

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

P.S. Для некоторых операций могут потребоваться права root.

Дополнительные материалы:
Wikipedia: File system fragmentation
Wikipedia: Extent (file systems)


Полный текст очерка

5 нояб. 2007 г.

Подключение WindowsMobile 2003 PocketPC к Linux с помощью SynCE

Сложилось так, что я являюсь счастливым (но во многих аспектах и несчастным) обладателем цифрового устройства типа PocketPC. Устройство носит гордую марку "Samsung SGH-i700". Счастливый я потому, что все-таки это довольно удобная штука для хранения информации, совершения звонков, написания смс-сообщений и общения в сети. К "несчастливым" аспектам относится, в частности, то, что штуковина работает под управлением Windows Mobile 2003. В итоге его приходится перезагружать (каждый раз вынимая аккумулятор, ага) чуть ли не каждые часа полтора-два активного использования для стабильной работы. Ладно, недостатки технических решений Microsoft - это тема для отдельной статьи, причем не одной.

Постановка задачи
Итак, мне нужно настроить свою ОС Ubuntu таким образом, чтобы при подключении телефона (если позволите так называть этот долбаный кирпич) она автоматически подключалась к нему, каким-либо образом информируя меня об этом. Также мне нужно иметь возможность доступа к файлам моего ПДА, устанавливать программы непосредственно из ОС и делать это быстро при минимуме движений пальцами по клавиатуре. Последнее важно потому, что очень часто у меня нет возможности или желания (лень) вовремя подзарядить телефон. В итоге все мои установленные программы отправляются в /dev/null, причиняя мне тем самым глубокие душевные страдания.

Выбор оптимального решения
Для моей задачи я выбрал программу SynCE. Теперь мне нужно:

1. Установить программу;
2. Настроить;
3. Наладить подключение к ПДА;
4. Автоматизировать процесс подключения;
5. Автоматизировать процесс восстановления установленных программ;

Let's fuck our brains out
Приступим, господа:

1. Установка
a) Мне нужно установить следующие пакеты:

  • libsynce0
  • librapi2
  • librra0
  • synce-dccm
  • syncekonnector
  • synce-serial
  • synce-kde
  • synce-multisync-plugin

Делается это с помощью Синаптика, но быстрее выполнить в консоли следующий код:
sudo apt-get install libsynce0 librapi2 librra0 synce-dccm syncekonnector synce-serial synce-kde synce-multisync-plugin


b) Также мне понадобятся пакеты:
  • synce-gnomevfs (для доступа к файлам через Наутилус)
  • synce-software-manager (для установки/удаления программ)
  • synce-trayicon (значок для трея)


Поэтому:
wget http://kuci.org/~teddy/ubuntu/synce-gnomevfs_0.9.0-2_i386.deb
wget http://kuci.org/~teddy/ubuntu/synce-software-manager_0.9.0-2_i386.deb
wget http://kuci.org/~teddy/ubuntu/synce-trayicon_0.9.0-2_i386.deb


И:
sudo dpkg -i synce-gnomevfs_0.9.0-2_i386.deb
sudo dpkg -i synce-software-manager_0.9.0-2_i386.deb
sudo dpkg -i synce-trayicon_0.9.0-2_i386.deb


c) Нужно еще создать символическую ссылку, чтобы всё это работало:
sudo ln -s /usr/lib/libgtop-2.0.so.X /usr/lib/libgtop-2.0.so.2

где X - версия библиотеки. У меня на Ubuntu 7.10 - это "7". У вас - может быть другая, поэтому ищите файл /usr/lib/libgtop-2.0.so.X

Оригинальный текст: здесь

2. Настройка.
a) SynCE перехватывает USB-соединения с помощью модуля ядра ipaq. В дефолтных ядрах он присутствует, соответственно, по дефолту. Если стоит собственное ядро, то необходимо этот модуль скомпилить.

Note: не забыть включить в ядро следующие позиции (!):
Device Drivers ---> USB Support ---> USB Serial Converter support --->
USB PocketPC PDA Driver

Device Drivers ---> Network device support ---> PPP (point-to-point protocol) support
PPP support for async serial ports


b) Далее необходимо убедиться, что устройство будет нормально и безопасно работать с SynCE.
Устройство не должно быть подключено к компьютеру!Выполнить в терминале:
cat /proc/bus/usb/devices > /tmp/before

Подключить устройство и выполнить:
cat /proc/bus/usb/devices > /tmp/after

Затем отключить и сравнить:
diff /tmp/before /tmp/after


Должно быть что-то в духе этого:
23a24,31
> T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 10 Spd=12 MxCh= 0
> D: Ver= 1.00 Cls=ff(vend.) Sub=ff Prot=ff MxPS= 8 #Cfgs= 1
> P: Vendor=049f ProdID=0003 Rev= 0.00
> C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
> I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ipaq
> E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
> E: Ad=82(I) Atr=02(Bulk) MxPS= 16 Ivl=0ms

Важные части помечены красным. Если все сходится - можно продолжать.

Если же результат похож на это:
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 9 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=ef(unk. ) Sub=01 Prot=01 MxPS=16 #Cfgs= 1
P: Vendor=0bb4 ProdID=0b01 Rev= 0.00
S: Manufacturer=MSFT
S: Product=PocketPC USB Sync
C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=ef(unk. ) Sub=01 Prot=01 Driver=(none)
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=1ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=(none)
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms

то лучше остановиться! Скорее всего, на устройстве стоит WM2005, а не 2003 и данная инструкция может привести к непредсказуемым последствиям!

c) Дальше нужно посмотреть на параметр #Cfgs=, если его значение - 1, то можно читать дальше. Если нет - разработчики SynCE советуют связаться с ними и сообщить некоторые детали о своем устройстве и системе. Подробнее читайте в оригинальном тексте статьи (ссылка внизу).

Смотрим на параметр Driver=. Если стоит ipaq или usbserial, значит устройство распознано и вообще жизнь налаживается. Если стоит (none), значит что-то не так. Скорее всего отсутствует или не подключен модуль. Для решения, опять же, читайте оригинальную статью.

Теперь нужно посмотреть на параметр #EPs= (USB endpoints). Если равен "2" или "3" - все отлично. Если "4" - обращайтесь к оригинальной статье за помощью.

Оригинальный текст: здесь

3. Настройка подключения.
a) Подключить устройство;

b) От рута пробовать следующие команды, до тех пор, пока одна из них не выдаст положительный результат (у меня сработала первая же):
  • synce-serial-config ttyUSB0
  • synce-serial-config tts/USB0
  • synce-serial-config usb/tts/0
  • synce-serial-config usb/ttyUSB0
  • synce-serial-config ttyu0


c) Здесь надо еще сказать, что некоторым бывает необходимо настроить файрвол. У меня, однако, стоят стандартные правила и проблем не было.
Если что, нужно открыть следующие TCP порты:
От устройства к ПК - 5678, 5679.
От ПК к устройству - 990.

d) Пришло время проверить соединение.
Устройство должно быть отключено от компьютера! От своего пользователя (не от рута) выполнить:
vdccm

или для устройств с паролем:
vdccm -p password


Эта команда должна быть выполнена после каждой перезагрузки

Подключить ПДА. Выолнить с sudo:
sudo synce-serial-start

для, собственно, установки подключения.
Должно появиться сообщение synce-serial-start is now waiting for your device и, после нескольких секунд, опять перед глазами командная строка! Если нет - значит не повезло.

Чтобы протестировать соединение, достаточно выполнить команду:
synce-pstatus

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

e) Отключать устройство следует не простым выдергиванием шнура, а, как белый человек, следующими командами:
killall -HUP dccm

либо
synce-serial-abort

либо через значок в трее.

4. Автоматизация подключения.
Итак, я хочу, чтобы при подключении ПДА, SynCE автоматически соединялся с ним и помещал иконку в трей.
a)Для этого мне нужно, во-первых, создать правило по адресу /etc/udev/rules.d/z30_synce.rules со следующим содержанием:
BUS!="usb", ACTION!="add", KERNEL!="ttyUSB*", GOTO="synce_rules_end"
SYSFS{idVendor}=="0bb4", SYSFS{idProduct}=="0a02", RUN+="/usr/local/sbin/synce-serial-start"
LABEL="synce_rules_end"

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

b)Во-вторых, в меню "Ситема -> Параметры -> Сеансы" (для Ubuntu) добавить запуск программы vdccm.

c)В-третьих, чтобы лицезреть иконку в трее, нужно зайти в пункт меню "Ситема -> Параметры -> Сменные устройства и носители" и на вкладке КПК поставить галочку Синхронизировать устройство PocketPC при подключении, введя команду synce-trayicon.
Всё.

5. Автоматизация восстановления программ.
Я написал небольшой скрипт, в который поместил следующее:
#!/bin/sh
echo "Restoring PocketPC files..."
echo "Installing Opera:"
synce-install-cab /media/storage1/Backup/PDA/opera_wm2003_ppc_865.cab
sleep 12
echo "Installing QIP:"
synce-install-cab /media/storage1/Backup/PDA/Setup_QIP_PPC2003.CAB
sleep 8
echo "Installing Resco Keyboard:"
synce-install-cab /media/storage1/Backup/PDA/resco.keyboard.pro.4.37_RUSkey/cab/RKeyboard_p.ARM.CAB
sleep 8
echo "Done!"

synce-install-cab - это программа, которая устанавливает cab-файл, переданный ей параметром. Сохраняю файл как, например, synce-restore-all, помещаю в домашнюю папку и даю права на исполнение. Теперь, при необходимости восстановления моих программ мне достаточно набрать в терминале:
./synce-restore-all

из домашней папки.

Команды SynCE
Список команд для фанатов консоли:
  • pcp - копировать файлы
  • pls - отобразить содержимое директории
  • pmkdir - создать директорию
  • pmv - переместить (переименовать) файлы
  • prm - удалить файл
  • prmdir - удалить пустую директорию
  • prun - запустить программу
  • pstatus - информация об устройстве
  • synce-install-cab - установить .cab файл


Not today
У меня так и не получилось реализовать следующее:
1) Если при старте компьютера устройство уже подсоединено к нему, то SynCE не подключится и ничего работать не будет. Происходит это, видимо, потому, что сначала стартует synce-serial-start по правилу, которое помещено в папку udev, а уже потом - vdccm, который должен быть запущен до присоединения устройства.
2) При отсоединении значок из трея не пропадает, а при повторном соединении появляется второй аналогичный значок.
3) Не работает интернет на ПДА через компьютер. Вообще-то мне это и не особо нужно.

Rock is dead?
Знаете, когда я вижу такую долбоебическую (дети, закройте уши!) реализацию настройки, как у SynCE, мне становится очень грустно и обидно за Linux. Можно же было не трахать пользователям мозг и сделать автоматическую настройку и реализовать нормальную возможность автоподключения. Нет, блять, мы не ищем легких путей (hello, Gentoo!) и презираем компьютерную мышь.
Извините.


Полный текст очерка