Multiterminais em um PC

Introdução

Xephyr é um tipo de servidor X que utiliza outro servidor X (Xorg) para a exibição das imagens. O Xephyr funciona como cliente do Xorg, mas é também servidor para outros aplicativos, que enxergam o Xephyr como se fosse um servidor X normal. O Xephyr pode ser utilizado para se trabalhar em dois ou mais desktops simultaneamente, no entanto, fizemos alterações em seu código para permitir que ele seja utilizado para implementar um sistema multiterminal.O sistema opera da seguinte maneira. Roda-se apenas um servidor X, configurado para utilizar várias telas (screens), sendo que cada tela estará associada a uma placa de vídeo. Após a inicialização do X, abre-se, em tela cheia, um Xephyr para cada tela, o qual será utilizado pelo usuário, de maneira transparente.

O Xephyr original obtêm os eventos de mouse e teclado a partir do servidor X pai. No entanto, para permitir a utilização do Xephyr no multiterminal, tivemos que alterar seu código fonte para que ele lesse os eventos diretamente dos dispositivos, sem intermediação do servidor X. Para ler os eventos do mouse e do teclado utiliza-se o protocolo evdev.

A vantagem de se utilizar o Xephyr é que o gerenciamento das diversas placas de vídeo é feito por um único X, o que elimina os problemas de compatibilidade e conflitos presentes nas outras maneiras de implementar o multiterminal. Isso significa que o multiterminal funciona com qualquer combinação de placas de vídeo que o X consiga gerenciar.

A vantagem de se utilizar o Xephyr ao invés do Xnest é que o Xephyr está sendo mantido atualmente, é mais rápido, e permite a implementação de extensões do X mais facilmente.

Instalação de requisitos

XOrg

Neste HOWTO descreveremos os passos para configurar o multiterminal utilizando o servidor XOrg, mas é possível utilizar o XFree86, com poucas alterações. Para utilizar o XOrg você precisa utilizar a versão Etch ou superior do Debian, pois a versão Sarge não possui o servidor XOrg. Se você está utilizando o Debian Sarge, proceda da seguinte maneira para atualizá-lo para Etch:

1. Altere as ocorrências de “sarge” ou “stable” dos mirrors do Debian no arquivo /etc/apt/sources.list para “etch”, por exemplo:

deb http://ftp.debian.org/debian sarge main contrib non-free

Deve ficar:

deb http://ftp.debian.org/debian etch main contrib non-free
2. Atualize o sistema e instale o pacote xserver-xorg:# apt-get update
# apt-get upgrade
# apt-get install xserver-xorg

Evdev e Udev

Certifique-se de que seu kernel (núcleo do sistema) esteja compilado com suporte ao módulo evdev.

É necessária também a instalação do udev, que provê um diretório /dev dinâmico e atualizado de acordo com os dispositivos conectados:

# apt-get install udev

O udev exige um kernel 2.6.

Xephyr (Modificado)

1. Faça o download do servidor Xephyr modificado em:

Extraia o arquivo no diretório /usr/local. Caso queira obter os patches, acesse:

2. Faça o download do script “wrapper” Xephyr.sh:

responsável por carregar o servidor Xephyr. O script deve ser copiado para o diretório /usr/sbin.

Após a instalação do Xephyr, adicione a seguinte linha no arquivo /etc/ld.so.conf:

/usr/local/lib
Em seguinte, rode o comando ldconfig:# ldconfig

Para atualizar as bibliotecas.

Configurações

Dispositivos de entrada

Antes de prosseguir, é preciso verificar se os dispositivos de entrada (mouses e teclados) foram detectados. Para isso analise o arquivo /proc/bus/input/devices, que informa detalhes sobre os dispositivos de entrada encontrados pelo kernel.

Um exemplo deste arquivo é apresentado abaixo. Apenas dois campos nos interessam: o nome de cada dispositivo, indicado nas linhas que começam com “N: Name=” e o nome do arquivo relacionado ao dispositivo, mostrado nas linhas que começam com “H: Handlers”.

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name=”AT Translated Set 2 keyboard”
P: Phys=isa0060/serio0/input0
H: Handlers=kbd event0
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name=”ImPS/2 Generic Wheel Mouse”
P: Phys=isa0060/serio1/input0
H: Handlers=mouse0 event1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

I: Bus=0003 Vendor=0a81 Product=0101 Version=0110
N: Name=”CHESEN USB Keyboard”
P: Phys=usb-0000:00:10.2-1/input0
H: Handlers=kbd event2
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7

I: Bus=0003 Vendor=0a81 Product=0101 Version=0110
N: Name=”CHESEN USB Keyboard”
P: Phys=usb-0000:00:10.2-1/input1
H: Handlers=kbd event3
B: EV=3
B: KEY=1f 0 20000 3878 d801d101 1e0000 0 0 0

I: Bus=0003 Vendor=04fc Product=0013 Version=06b0
N: Name=”USB OpticalWheel Mouse”
P: Phys=usb-0000:00:10.2-2/input0
H: Handlers=mouse1 event4
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

Os dados necessários estão destacados. Note que o arquivo parece indicar a presença de três teclados, embora no sistema aferido existam apenas dois. A razão do dispositivo adicional é que muitos teclados USB contém teclas especiais (por exemplo, de controle multimídia ou acesso à Internet), detectadas pelo kernel como pertencentes a um teclado secundário, cujo endereço físico termina em “input1”. Configuraremos apenas os teclados primários, com endereço físico terminado em “input0”. Portanto, a seção correspondente ao teclado secundário de endereço físico “usb-0000:00:10.2-1/input1” será ignorada.

Podemos perceber, pelo arquivo de exemplo, a presença de 2 teclados, relacionados aos arquivos /dev/input/event0 e /dev/input/event2, respectivamente, e 2 mouses, associados aos arquivos /dev/input/event1 e /dev/input/event4, respectivamente. Esses arquivos são importantes, pois são utilizados, como descreveremos posteriormente, para relacionar cada cabeça do multiterminal aos dispositivos de entrada corretos.

Servidor XOrg

xorg.conf

Para um multiterminal de N terminais, o arquivo /etc/X11/xorg.conf deve ser configurado da seguinte forma:

1. Defina um layout contendo N screen’s.

Section "ServerLayout"
  Identifier  "Layout"
  Screen      "Default Screen 1"
  Screen      "Default Screen 2"   Below   "Default Screen 1"
  Screen      "Default Screen 3"   Below   "Default Screen 2"
  .
  .
  Screen      "Default Screen N"   Below   "Default Screen N-1"
  InputDevice "Generic Keyboard"
  InputDevice "Configured Mouse 1"
EndSection
OBS: A disposição das telas apresentadas no layout acima não é relevante.2. Defina as seções das N placas de vídeo.
Section "Device"
  Identifier   "Placa de Vídeo Genérica 1"
  Driver      "sis"   
  BusID      "PCI:0:5:0"   
  Screen      0   
EndSection   
#
# Substitua o driver da placa de vídeo de acordo com 
# o seu hardware.
#
# A opção BusId identifica qual o endereço da placa de 
# vídeo que está sendo utilizada.
# Para obter o BusId de suas placas digite "lspci | grep VGA"
# Tome cuidado com os valores, pois o endereço fornecido 
# por lspci é em Hexadecimal enquanto que o X
# espera um valor em decimal. Para conversão use 
# "echo $((0xVALOR_HEXADECIMAL))"
.
.
.
Section "Device"
  Identifier   "Placa de Vídeo Genérica N"
  Driver      "sis"
  BusID      "PCI:0:6:0"
  Screen      0   
EndSection
3. Defina as seções dos N monitores.
Section "Monitor"
  Identifier   "Monitor 1"
  HorizSync    30-71
  VertRefresh  50-160
  Option       "DPMS"
EndSection         
.
.
.      
Section "Monitor"
  Identifier   "Monitor N"
  HorizSync    30-71
  VertRefresh  50-160
  Option       "DPMS"
EndSection
4. Defina as seções das N screen’s. Recomenda-se utilizar 24 bits pois em alguns testes os navegadores não conseguiam executar animações em flash se essa configuração fosse inferior.
Section "Screen"
  Identifier   "Screen 1"
  Device       "Placa de Vídeo Genérica 1"
  Monitor      "Monitor 1"
  DefaultDepth 24   
  SubSection   "Display"
     Depth     24
     Modes     "1024x768" "800x600" "640x480"
  EndSubSection
EndSection
.
.
.
Section "Screen"
  Identifier   "Screen N"
  Device       "Placa de Vídeo Genérica N"
  Monitor      "Monitor N"
  DefaultDepth 24   
  SubSection   "Display"
     Depth     24
     Modes     "1024x768" "800x600" "640x480"
  EndSubSection
EndSection
5. A definição de teclado pode continuar igual a já existente em seu xorg.conf, no entanto, certifique-se de que o nome do teclado (Identifier) está de acordo com a Seção Layout (isto é, “Generic Keyboard”). O mouse você deve fazer apontar para o dispositivo /dev/input/mice:
Section "InputDevice"
  Identifier   "Configured Mouse 1"
  Driver       "mouse"
  Option       "CorePointer"
  Option       "Device"       "/dev/input/mice"
  Option       "Protocol"     "ImPS/2"
EndSection
6. Para evitar problemas na inicialização do Servidor X devido ao não reconhecimento do mouse, você pode incluir, sem problemas, a seguinte seção:
Section "ServerFlags"
  Option "AllowMouseOpenFail"   "yes"
EndSection
OBS: Isso não afetará o multiterminal, pois os dispositivos mouses/teclados serão passados como parâmetros, posteriormente, para o Xephyr.7. Finalmente, para desabilitar a troca de VT’s e as teclas Ctrl+Alt+Backspace, verifique que a seção “ServerFlags” possui as seguintes opções:
Section "ServerFlags"
  ...

  # Desativar VT Switching
  Option    "DontVTSwitch" "yes"

  # Desativa o uso das teclas Ctrl+Alt+Backspace
  Option    "DontZap"       "yes"
  ...
EndSection

Configuração do Layout

Como a detecção dos dispositivos de entrada (mouses e teclados) feita pelo kernel (veja seção “Dispositivos de Entrada”) nem sempre segue a mesma ordem, é possível que o kernel associe o mesmo dispositivo a arquivos diferentes, em cada inicialização, o que poderá “embaralhar” os mouses e teclados.

Para evitar o problema, fizemos scripts que automatizam o processo de associação de mouses e teclados a seus respectivos monitores. Você só precisa configurar o layout (qual teclado e mouse estão associados a qual monitor) uma vez, e o script irá armazenar esse “layout” no arquivo /etc/X11/devices.conf. Para utilizar o script, siga os seguintes passos:

1. Instale o pacote xdialog:

# apt-get install xdialog

2. Descomprima o arquivo xkb-evdev.tar.gz no diretório /etc/X11.

3. Remova ou renomeie o arquivo /etc/gdm/gdm.conf:

# mv /etc/gdm/gdm.conf /etc/gdm/gdm.conf.backup

4. Descompacte o arquivo public.tgz e copie os arquivos “configura_layout” e “select.out” para o diretório /usr/local/sbin. Depois copie o arquivo “configuracao_automatica” para o diretório “/etc/init.d”.

5. Configure para que o script configuracao_automatica seja executado na inicialização do sistema:

# update-rc.d configuracao_automatica start 70 S .

6. Execute o seguinte comando, para configurar o layout do sistema. O script irá fazer perguntas em cada uma das telas do seu multiterminal para saber qual teclado e qual mouse serão associados a cada monitor.

# invoke-rc.d configuracao_automatica start

O script irá gerar automaticamente o arquivo /etc/gdm/gdm.conf, se ele não existir, e os arquivos de configuração do XKB (/usr/X11R6/lib/X11/xkb/XX-config.keyboard). O script irá criar links no diretório /dev/input, chamados kbd0mt, kbd1mt, etc, que se referem, respectivamente, ao teclado do primeiro terminal, ao teclado do segundo terminal, e assim por diante. O script também irá criar links chamados mouse0mt, mouse1mt, etc, que se referem, respectivamente, ao mouse do primeiro terminal, ao mouse do segundo terminal, e assim por diante.

Após você responder às perguntas, o script irá gerar o arquivo /etc/X11/devices.conf, que irá conter as associações de mouse e teclado a cada terminal, além da configuração dos teclados (regras, modelo e layout).

Configuração manual

Se você utilizou o script da seção anterior, você não deve realizar os passos das próximas seções. No entanto, para completude, apresentaremos os procedimentos manuais para a configuração do XKB e o GDM, caso você não tenha utilizado o script.

Configuração XKB

Para permitir que o Xephyr utilize a extensão XKB, você deve descomprimir o arquivo xkb-evdev.tar.gz no diretório /etc/X11.

Depois é necessário criar um arquivo de configuração XKB para cada Xephyr, para configurar os teclados. O arquivo de configuração do primeiro Xephyr deve ser colocado no arquivo /usr/X11R6/lib/X11/xkb/X1-config.keyboard, o do segundo em /usr/X11R6/lib/X11/xkb/X2-config.keyboard, e assim em diante.

Um exemplo de um arquivo de configuração para um teclado ABNT2 pode ser visto a seguir:

rules = “evdev”
model = “abnt2”
layout = “br”

Configuração do Gdm

O último passo é configurar o gerenciador de login para iniciar o servidor X principal e também para rodar os scripts “wrappers” que serão responsáveis por abrir o Xephyr em cada tela. Trataremos apenas do GDM. Outros gerenciadores como o XDM e o KDM podem ser configurados por um processo similar.

gdm.conf

Edite o arquivo /etc/gdm/gdm.conf na seção [servers] inserindo o seguinte:

[servers]
0=Hardware
# Hardware será o servidor X principal, naquele onde serão executados os demais N servidores Xephyr’s1=Xephyr1
2=Xephyr2
3=Xephyr3
.
.
N=XephyrN
# Xephyr{1..N} é cada um dos servidores Xephyr’s.

[server-Hardware]
name=Hardware
command=/usr/X11R6/bin/X
handled=false
flexible=false
# A opção handled=false impede que seja carregado o gerenciador de login no servidor X principal.

[server-Xephyr1]
name=Xephyr1
command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -geometry 1024×768+0+0
-keyboard /dev/input/event0 -mouse /dev/input/event1,5 -use-evdev -dpi 92
handled=true
flexible=false
#
# A opção -keyboard e -mouse identificam, respectivamente, qual teclado e mouse 
#serão associados ao servidor Xephyr1, conforme analisado no 
#arquivo /proc/bus/input/devices. Se a opção 
#-mouse terminar em “,5”, como no exemplo, a roda do mouse será habilitada.

#
# Xephyr.sh é o script que carrega o servidor Xephyr.
.
.
.
[server-XephyrN]
name=XephyrN
command=/usr/sbin/Xephyr.sh -display :0.(N-1) -xauthority /var/lib/gdm/:0.Xauth -geometry 1024×768+0+0
-keyboard /dev/input/eventXX -mouse /dev/input/eventYY -use-evdev -dpi 92
handled=true
flexible=false

Considerações

Esse tutorial foi desenvolvido pelo Centro de Computação Científica e Software Livre (C3SL – www.c3sl.ufpr.br) da Universidade Federal do Paraná.Outras versões de multiterminais desenvolvidos pelo C3SL estão disponíveis em:

Este tutorial ainda não trata de concorrência de som (mas não deixa a desejar no principal ;-).

Há outros projetos para criação e popularização das máquinas multiterminais como o do Ronald Scherolt:

que se apóia no projeto do C3SL.

Rolar para cima