Ниже описан процесс организации второго рабочего места в Debian/Ubuntu Linux,
подключив к компьютеру USB-хаб к которому подключены дополнительные клавиатура,
мышь и монитор (через USB2VGA переходник Displaylink).
1. Устанавливаем framebuffer-драйвер для адаптера DisplayLink:
Драйвер udlfb включен в состав staging-ветки ядра 2.6.32, но мы будем
использовать последний срез исходных текстов из Git-репозитория:
sudo apt-get install module-assistant
sudo module-assistant prepare
git clone http://git.plugable.com/webdav/udlfb/
cd udlfb
make
sudo make install
sudo depmod -a
Если драйвер установлен и загружен корректно, то при подключении монитора через
адаптер DisplayLinkNow, на мониторе будет отображен "зеленый экран".
2. Устанавливаем X-драйвер для DisplayLink:
sudo apt-get install pkg-config xorg-dev
cd ~git
git clone http://git.plugable.com/webdav/xf-video-udlfb/
cd xf-video-udlfb
./configure
make
sudo make install
Далее следует поправить несколько файлов конфигурации и скриптов, примеры можно
загрузить из Git-репозитория проекта udlfb:
git clone http://git.plugable.com/webdav/misc-udlfb/
3. Правим скрипты udev
Создаем с правами root файл /lib/udev/rules.d/50-usbseat.rules
# set all DisplayLink devices to configuration 1
# see http://libdlo.freedesktop.org/wiki/DeviceQuirks for more info
ATTR{idVendor}=="17e9", ATTR{bConfigurationValue}=="2", RUN="/bin/echo 1 > /sys%p/bConfigurationValue"
# aliases for display, kbd, mouse attached to specific hubs
KERNEL=="fb*",SUBSYSTEMS=="usb",PROGRAM="/bin/cat /sys/%p/../../../devnum",
SYMLINK+="usbseat/%c/display",RUN+="usbseat.sh %c"
KERNEL=="mouse*", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="03",
ATTRS{bInterfaceProtocol}=="02", PROGRAM="/bin/cat /sys/%p/../../../../../../devnum",
SYMLINK+="usbseat/%c/mouse",RUN+="usbseat.sh %c"
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{bInterfaceClass}=="03",
ATTRS{bInterfaceProtocol}=="01",PROGRAM="/bin/cat /sys/%p/../../../../../../devnum",
SYMLINK+="usbseat/%c/keyboard",RUN+="usbseat.sh %c"
Данный скрипт будет запущен автоматически в момент подключения USB-устройства;
4. Создаем скрипт /lib/udev/usbseat.sh:
#!/bin/bash
# takes the "seat number" as parameter $1
# the seat number is the kernel device id of the hub the seat's devices are sitting off of
# called once for every usb device that MIGHT be part of a seat, when they arrive or remove
if [[ !(-n `/bin/pidof gdm`) ]]; then
exit 0
fi
seat_running=`/usr/bin/gdmdynamic -l | /bin/sed -n -e "/:$1,/p"`
# $ACTION environment variable is set by udev subsystem
case "$ACTION" in
'remove')
if [[ -n "{$seat_running}" ]]; then
/usr/bin/gdmdynamic -v -d $1
fi
;;
*)
# A device which might be part of a seat has been added
# if we already have a running seat for this #, exit
if [[ -n "${seat_running}" ]]; then
exit 0
fi
if [[ -e /dev/usbseat/$1/keyboard && -e /dev/usbseat/$1/mouse && \
-e /dev/usbseat/$1/display ]]; then
# We have a newly complete seat. Start it.
TMPFILE=`/bin/mktemp` || exit 1
/bin/sed "s/%ID_SEAT%/$1/g" < /lib/udev/usbseat-xf86.conf.sed > $TMPFILE
/usr/bin/gdmdynamic -v -t 2 -s 1 -a \
"$1=/usr/X11R6/bin/X -br :$1 -audit 0 -nolisten tcp -novtswitch -sharevts -config $TMPFILE"
/usr/bin/gdmdynamic -v -r $1
fi
;;
esac
exit 0
5. Создаем файл конфигурации для X-сервера:
Создаем файл /lib/udev/usbseat-xf86.conf.sed:
Section "ServerFlags"
Option "AutoEnableDevices" "false"
Option "AutoAddDevices" "false"
Option "DefaultLayout" "seat"
Option "DontZoom" "true"
Option "DontZap" "true"
Option "AllowMouseOpenFail" "yes"
EndSection
Section "Module"
Load "ddc"
EndSection
Section "Files"
ModulePath "/usr/lib/xorg/modules"
ModulePath "/usr/local/lib/xorg/modules"
EndSection
Section "Device"
Identifier "dl"
driver "displaylink"
Option "fbdev" "/dev/usbseat/%ID_SEAT%/display"
EndSection
Section "InputDevice"
Identifier "keyboard"
Driver "evdev"
Option "CoreKeyboard"
Option "Device" "/dev/usbseat/%ID_SEAT%/keyboard"
Option "XkbModel" "evdev"
Option "XkbLayout" "us"
EndSection
Section "InputDevice"
Identifier "mouse"
Driver "mouse"
Option "CorePointer"
Option "Protocol" "auto"
Option "Device" "/dev/usbseat/%ID_SEAT%/mouse"
Option "Buttons" "5"
Option "ZAxisMapping" "4 5"
EndSection
Section "Monitor"
Identifier "monitor"
EndSection
Section "Screen"
Identifier "screen"
Device "dl"
Monitor "monitor"
EndSection
Section "ServerLayout"
Identifier "seat"
Screen 0 "screen" 0 0
InputDevice "keyboard" "CoreKeyboard"
InputDevice "mouse" "CorePointer"
EndSection
6. Запрещаем загрузку модуля ядра fbcon чтобы избежать конфликта при работе
Devicelink через framebuffer.
Создаем /etc/modprobe.d/fbcon.conf
blacklist font
blacklist tileblit
blacklist bitblit
blacklist fbcon
7. Обходной путь для решения проблемы с некорректным позиционированием экрана
Добавляем в /etc/gdm/Init/Default после упоминания gdmwhich() вызов xrand для
установки нормальной ориентации экрана
XRANDR=`gdmwhich xrandr`
if [ "x$XRANDR" != "x" ]; then
$XRANDR -o 0
fi
8. В /etc/rc.local добавляем код для проверки подключения usb-терминала:
oldIFS=$IFS
IFS=/
for seat in /dev/usbseat/*; do
set $seat
/lib/udev/usbseat.sh $4
done
IFS=$oldIFS
9. Правка /etc/init.d/gdm для использования разных конфигурация для работы с
несколькими X-серверами:
Добавляем в /etc/init.d/gdm после секции "Allow cdd to override the config"
(примерно в районе 35 строки):
# При наличии конфигурации для usb монитора подключаем отдельную конфигурацию
if [ -f /etc/gdm/gdm-usbseat.conf ]; then
for usbseat in /dev/usbseat/*; do
seatid=${usbseat##*/}
if [ -e "/dev/usbseat/$seatid/keyboard" -a \
-e "/dev/usbseat/$seatid/mouse" -a -e "/dev/usbseat/$seatid/display" ]; then
CONFIG_FILE="--config=/etc/gdm/gdm-usbseat.conf"
fi
done
fi
10. Создаем файл конфигурации /etc/gdm/gdm-usbseat.conf, который будет
использован вместо gdm.conf для монитора, подключенного через USB-переходник:
[daemon]
DynamicXServers=true
FlexibleXServers=0
Greeter=/usr/lib/gdm/gdmgreeter
[security]
[xdmcp]
[gui]
[greeter]
[chooser]
[debug]
[servers]
0=inactive
После внесения вышеуказанных изменений при подключении монитора через USB на
нем должно появиться приглашение для входа в систему
|