Se for utilizar placa de vídeo da nvidia, é necessário a instalação dos pacotes, nvidia-kernel-common, o pacote linux-restricted-modules de acordo com o seu kernel e o pacote nvidia-glx.
Pré-requisitos
Ubuntu Linux 6.06.1 LTS
Placa ATI com saída para dois monitores (DVI com adaptador VGA)
2 monitores
2 teclados
2 mouses
Faça a instalação padrão do ubuntu, atualize o mesmo com o apt-get update e apt-get dist-upgrade. E instale o pacote openssh-server, será útil caso perca o X e precise acessar remotamente.
Configuração
Arquivo xorg.conf
Antes de editar o arquivo, verifique o endereço de barramento que a sua placa de vídeo está utilizando, com o comando abaixo.
# lspci -X | grep VGA
Deve retornar algo parecido com,
PCI:1:0:0 VGA compatible controller: ATI Technologies Inc RV380 0x3e50 [Radeon X600]
O que realmente nos importa é o início da linha, PCI:1:0:0, este endereço é utilizado para a configuração do xorg.conf ele que indica onde a placa de vídeo está plugada.
Faça um backup do arquivo xorg.conf por precaução.
# cp /etc/X11/xorg.conf /etc/X11/xorg.conf.bkp
# vi /etc/X11/xorg.conf
Abaixo está a configuração do arquivo xorg.conf utilizado na montagem desta solução. Grande parte deste arquivo não foi alterado da configuração padrão do Ubuntu. A configuração em sí do two-head começa mais ou menos no meio do arquivo, está comentado onde se dá o início da configuração.
# /etc/X11/xorg.conf (xorg X Window System server configuration file)
# sudo dpkg-reconfigure -phigh xserver-xorg
Section "Files"
FontPath "/usr/share/X11/fonts/misc"
# FontPath "/usr/share/X11/fonts/cyrillic"
FontPath "/usr/share/X11/fonts/100dpi/:unscaled"
FontPath "/usr/share/X11/fonts/75dpi/:unscaled"
FontPath "/usr/share/X11/fonts/Type1"
FontPath "/usr/share/X11/fonts/100dpi"
FontPath "/usr/share/X11/fonts/75dpi"
# path to defoma fonts
FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection
Section "Module"
Load "i2c"
Load "bitmap"
Load "ddc"
# Load "dri"
Load "extmod"
Load "freetype"
Load "glx"
Load "int10"
Load "type1"
Load "vbe"
EndSection
Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "abnt2"
Option "XkbLayout" "br"
Option "XkbVariant" "abnt2"
EndSection
Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ExplorerPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection
##############################################################################
########################## INICIO DA CONFIGURACAO #######################
##############################################################################
Section "Device"
Identifier "Card0.0"
Driver "ati"
VendorName "Ati"
BusID "PCI:1:0:0"
Screen 0
Option "NoLogo"
Option "MonitorLayout" "CRT, CRT"
Option "MergedFB" "true"
EndSection
Section "Device"
Identifier "Card0.1"
Driver "ati"
VendorName "Ati"
BusID "PCI:1:0:0"
Screen 1
Option "NoLogo"
Option "MonitorLayout" "CRT, CRT"
Option "MergedFB" "true"
EndSection
Section "Monitor"
Identifier "Monitor0"
DisplaySize 320 240
HorizSync 30.0 - 70.0
VertRefresh 50.0 - 160.0
Option "DPMS"
EndSection
Section "Monitor"
Identifier "Monitor1"
DisplaySize 320 240
HorizSync 30.0 - 70.0
VertRefresh 50.0 - 160.0
Option "DPMS"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Card0.0"
Monitor "Monitor0"
DefaultColorDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Card0.1"
Monitor "Monitor1"
DefaultColorDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Section "ServerLayout"
Identifier "multihead"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" LeftOf "Screen0"
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
EndSection
Section "ServerFlags"
# Se o mouse não for detectado o X starta normalmente
Option "AllowMouseOpenFail" "yes"
# Desativa a troca de VT
Option "DontVTSwitch" "yes"
# Desativa as teclas ctrl+alt+backspace (reinicar o X)
Option "DontZap" "yes"
EndSection
##############################################################################
########################## FINAL DA CONFIGURACAO ########################
##############################################################################
Veja na seção Device onde definimos a placa de vídeo que o primeiro bloco esta configurado com “Screen 0” e o segundo “Screen 1”, isso porque a placa tem duas saídas de vídeo, então, essa configuração indica qual saída deve ser utilizada. No caso de uma solução onde tenha 2 placas pci normal o “Screen” seria 0 para ambas.
No caso de uma solução Fourhead o que mudaria neste arquivo de configuração seria a seção Device, Monitor, Screen e ServerLayout, que seria preciso configurar uma seção para cada novo monitor.
Para fazer um teste se a configuração está correta, plugue o segundo monitor e reinicie o gdm e se tudo estiver ok, deve ser mostrado uma tela de login e após fazer o login o segundo monitor irá exibir outro desktop ou então um desktop extendido será exibido.
Não se preocupe com a configuração do teclado neste momento, o importante agora é fazer com que seja exibido dois desktops independentes um em cada monitor.
Ao logar no sistema veja que o outro monitor carrega outro desktop.
O Ubuntu por padrão vem com o evdev instalado, mas precisamos também do pacote xserver-xephyr, porém, este pacote do repositório do Ubuntu não suporta o evdev e não iremos utilizar ele, portanto não instale o mesmo. Vamos utilizar o pacote pré-compilado pela UFPR, pode ser baixado diretamente no endereço http://www.c3sl.ufpr.br/multiterminal/howtos/xephyr-precompiled.tar.bz2.
Após baixar este arquivo, descompacte o mesmo no diretório /usr/local/ . Este arquivo já está compilado para funcionar, não é necessário fazer nenhuma compilação com ele, estes arquivos não interferem no seu sistema atual.
# tar -xvjf xephyr-precompiled.tar.bz2 -C /usr/local/
Plugue o segundo teclado e mouse e verifique a saída do comando cat /proc/bus/input/devices
I: Bus=0003 Vendor=413c Product=2005 Version=0104
N: Name="DELL DELL USB Keyboard"
P: Phys=usb-0000:00:1d.0-1/input0
S: Sysfs=/class/input/input1
H: Handlers=kbd event1
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7
I: Bus=0003 Vendor=413c Product=3200 Version=2910
N: Name="Dell Dell USB Mouse"
P: Phys=usb-0000:00:1d.0-2/input0
S: Sysfs=/class/input/input2
H: Handlers=mouse0 event2 ts0
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
I: Bus=0003 Vendor=413c Product=2005 Version=0104
N: Name="DELL DELL USB Keyboard"
P: Phys=usb-0000:00:1d.1-1/input0
S: Sysfs=/class/input/input3
H: Handlers=kbd event3
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7
I: Bus=0003 Vendor=413c Product=3200 Version=2910
N: Name="Dell Dell USB Mouse"
P: Phys=usb-0000:00:1d.1-2/input0
S: Sysfs=/class/input/input4
H: Handlers=mouse1 event4 ts1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
Veja, que cada dispositivo possui um endereço físico Phys e também um endereço de evento, localizado ao lado da opção Handlers.
Este endereço de evento pode mudar a cada boot, para isso devemos utilizar um script que faz com que sempre seja atribuído o endereço correto.
O código do script está abaixo e deve ser salvo no diretório /usr/sbin/ com o nome Xephyr.sh
#!/bin/bash
# 20060905 - josean - added get_event() function to obtain eventNN from a physical address
# Original version:
# http://en.wikibooks.org/wiki/Multiterminal_with_Xephyr
# http://www.c3sl.ufpr.br/multiterminal/howtos/Xephyr.sh
trap "" usr1
XEPHYR=/usr/local/bin/Xephyr
get_event()
{
evento=`grep -A2 $1 /proc/bus/input/devices | grep 'H: Handlers=' | grep --only-matching -e 'event[0-9]*'`
}
args=()
while [ ! -z "$1" ]; do
if [[ "$1" == "-xauthority" ]]; then
shift
if [ ! -z "$1" ]; then
export XAUTHORITY="$1"
fi
elif [[ "$1" == "-display" ]]; then
shift
if [ ! -z "$1" ]; then
export DISPLAY="$1"
fi
elif [[ "$1" == "-kbdphys" ]]; then
shift
if [ ! -z "$1" ]; then
get_event $1
args=("${args[@]}" "-keyboard")
args=("${args[@]}" "/dev/input/$evento")
fi
elif [[ "$1" == "-mousephys" ]]; then
shift
if [ ! -z "$1" ]; then
get_event $1
args=("${args[@]}" "-mouse")
args=("${args[@]}" "/dev/input/$evento,5")
fi
else
if ! expr match $1 'vt[0-9][0-9]*' >/dev/null; then
args=("${args[@]}" "$1")
fi
fi
shift
done
# echo $XEPHYR "${args[@]}" >> /tmp/logXephyr
exec $XEPHYR "${args[@]}"
Baixe o arquivo http://www.c3sl.ufpr.br/multiterminal/howtos/xkb-evdev.tar.gz, extraia o mesmo para o diretório /etc/X11/xkb/. Este arquivo contém correções para o funcionamento do teclado abnt2 utilizando o evdev.
# cd /etc/X11/
# wget http://www.c3sl.ufpr.br/multiterminal/howtos/xkb-evdev.tar.gz
# cp -a xkb xkb.bkp
# tar xvzf xkb-evdev.tar.gz -C /etc/X11/
Pequena correção para que o teclado abnt2 funcione perfeitamente com todas as teclas, abra o arquivo /etc/X11/xkb/keycodes/evdev e adicione o código abaixo após a linha xkb_keycodes “basic”, veja abaixo.
# vi /etc/X11/xkb/keycodes/evdev
Após a linha 16 terá o código abaixo, adicione os códigos que estão entre "ABTN2" e "FIM ABNT2" ao seu arquivo de configuração.
xkb_keycodes "basic" {
minimum= 8;
maximum= 255;
// ABNT2
= 94; // Tecla backslash a barra invertida e pipe
= 51; // Tecla fecha colchete e chaves
= 129; // Barra e interrogacao
// FIM ABNT2
Caso tenha alguma tecla que não esteja funcionando depois de configurar o gdm, após fazer login em um dos terminais execute o comando xev no gnome-terminal, irá abrir uma tela branca e você deve digitar as teclas que não estão funcionando e verá no console as informações desta tecla, como o código abaixo.
KeyPress event, serial 29, synthetic NO, window 0x2c00001,
root 0x4c, subw 0x0, time 3237629419, (320,584), root:(335,681),
state 0x10, keycode 51 (keysym 0x5d, bracketright), same_screen YES,
XLookupString gives 1 bytes: (5d) "]"
XmbLookupString gives 1 bytes: (5d) "]"
XFilterEvent returns: False
KeyRelease event, serial 29, synthetic NO, window 0x2c00001,
root 0x4c, subw 0x0, time 3237629523, (320,584), root:(335,681),
state 0x10, keycode 51 (keysym 0x5d, bracketright), same_screen YES,
XLookupString gives 1 bytes: (5d) "]"
Veja que o keycode da tecla ] é 51, neste caso ele já esta setado no arquivo /etc/X11/xkb/keycodes/evdev porém não precisamos alterar nada, mas caso tenha uma tecla que não esteja funcionando, descubra o código dela e modifique o arquivo do evdev, para obter informações sobre o nome da tecla como “BKSL” que é a barra invertida, pode ser obtido no arquivo /etx/X11/xkb/symbols/br.
Feito isso, podemos iniciar a configuração do gdm.conf para que ele saiba como chamar o script Xephyr.sh.
Para garantir, faça um backup do arquivo gdm.conf
# cp /etc/gdm/gdm.conf /etc/gdm/gdm.conf.bkp
# vi /etc/gdm/gdm.conf
Abra o arquivo e localize a seção [servers], nesta seção configure como o código abaixo, alterando somente os endereços obtido com o comando cat /proc/bus/input/devices referentes a cada teclado e cada mouse de cada desktop. Para uma solução Fourhead é preciso inserir a configuração para mais dois monitores neste arquivo, seguindo a mesma lógica da configuração abaixo.
[servers]
0=Xephyr0
1=Xephyr1
2=Xephyr2
[server-Xephyr0]
name=Xephyr0
command=/usr/bin/X -ac -br
handled=false
flexible=false
[server-Xephyr1]
name=Xephyr1
command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -kbdphys usb-0000:00:1d.0-1/input0 -mousephys usb-0000:00:1d.0-2/input0 -use-evdev
handled=true
flexible=false
[server-Xephyr2]
name=Xephyr2
command=/usr/sbin/Xephyr.sh -display :0.1 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -kbdphys usb-0000:00:1d.1-1/input0 -mousephys usb-0000:00:1d.1-2/input0 -use-evdev
handled=true
flexible=false
Neste momento, reinicie o gdm e deve ser exibido duas telas de logins independentes, uma em cada monitor. Porém a configuração do teclado nas estações pode estar errada, é preciso configurar o layout do teclado para que fique correto.
Crie um arquivo de configuração para cada seção Xephyr criada no gdm.conf. O arquivo deve ser criado no diretório /etc/X11/xkb/
# cd /etc/X11/xkb/
# vi X1-config.keyboard
Inclua o conteúdo abaixo dentro do arquivo para um teclado abnt2
model = "abnt2"
keycodes = "evdev"
layout = "br"
variant = "abnt2"
Como temos duas seções criadas no arquivo gdm.conf, é preciso criar o segundo arquivo, no mesmo diretório digite o comando abaixo. No caso de 4 seções é preciso criar o mapa de teclado para cada uma delas.
# cp X1-config.keyboard X2-config.keyboard
# cp X1-config.keyboard X3-config.keyboard
# cp X1-config.keyboard X4-config.keyboard
E teremos a configuração para que as duas seções funcionem com o teclado abnt2.
Reinicie o gdm, e está tudo pronto. A configuração está feita, e temos uma máquina apenas servindo dois usuários.
Links de Referência
http://netpatia.blogspot.com/2006/09/multiseat-computer-with-ubuntu.html
http://en.wikibooks.org/wiki/Multiterminal_with_Xephyr
I've done the same configuration about a year ago at home with ATI Radeon 9600 and LCD+CRT on Kubuntu 6.06 but now I'm planning to make new one on Kubuntu 7.04 or 7.10 with AIGLX with Compiz Fussion and 3D acceleration. Do you know maybe if official Xephyr now has evdev patch included and DRI/GLX support? If not I'm thinking about XGL intergration instead of Xephyr or XAT with MPX. One suggestion - if you use 'Below' instead of 'LeftOf' in xorg.conf you can have DRI acceleration in MergedFB even on two 1280x1024 monitors.
ReplyDelete[...] TwoHead - Multiterminais do Fábio Silva [...]
ReplyDelete