Multiterminais/Multiterminal com Xephyr

Origem: Wikilivros, livros abertos por um mundo aberto.
Saltar para a navegação Saltar para a pesquisa

Vamos descrever aqui como fazer um Multiterminal com Xephyr. Há muitas maneiras de se fazer multiterminais, pra vê-las, veja a seção Veja também.

A partir de uma modificação realizada no servidor Xephyr, foi possível implementar uma nova solução para multiterminal. O sistema funciona de maneira muito parecida ao multiXnest, só que utiliza o Xephyr ao invés do Xnest. O Xephyr possui várias vantagens, pois está sendo mantido, é mais rápido, e permite a implementação de extensões do X mais facilmente.

Como fazer[editar | editar código-fonte]

Você deve seguir o tutorial abaixo, passo a passo. Outras informações podem ser obtidas na página do C3SL da UFPR aqui. No Item 3, há um link para o LIVE-CD desenvolvido recentemente.

Sistema operacional[editar | editar código-fonte]

Debian Etch

Introdução[editar | editar código-fonte]

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 lêsse 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 do servidor XOrg[editar | editar código-fonte]

Aqui 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[editar | editar código-fonte]

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.

Dispositivos de Entrada[editar | editar código-fonte]

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

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.

Ldconfig[editar | editar código-fonte]

Adicione a seguinte linha no arquivo /etc/ld.so.conf:

/usr/local/lib

Em seguinte, rode o comando ldconfig:

ldconfig

Download do Xephyr modificado[editar | editar código-fonte]

1. Faça o download do servidor Xephyr modificado aqui. Extraia o arquivo no diretório /usr/local. Caso queira obter os patches, baixe-os clicando aqui. 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 e ter permissão de execução. Para dar permissão de execução para o arquivo, execute o seguinte comando:

chmod +x /usr/sbin/Xephyr.sh

Configuração do Servidor X(XOrg)[editar | editar código-fonte]

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		"Screen 1"
      	Screen		"Screen 2"	Below	"Screen 1"
      	Screen		"Screen 3"	Below	"Screen 2"
      	.
      	.
      	Screen		"Screen N"	Below	"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 eh em Hexadecimal enquando 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		N	
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.

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 à 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 dispositovo /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 parametros, 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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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 por diante. Um exemplo de um arquivo de configuração para um teclado ABNT2 pode ser visto a seguir:

rules = "evdev"
model = "abnt2"
layout = "br"

Em algumas situações, o proposto acima pode não funcionar, quando o Xephyr for compilado para procurar as definições do layout de keyboard em /usr/X11/lib/xkb. Nesse caso, é necessário fazer também o seguinte link simbólico e copiar o xkbcomp para essa pasta:

ln –s /usr/share/X11/xkb /usr/lib/X11/xkb
cp `which xkbcomp` /usr/lib/X11/xkb

Observação: nas novas versões do Debian Etch, houve algumas mudanças, e pode ser que o teclado fique todo desconfigurado. Para isso, basta modificar a linha 70 do arquivo /xkb/rules/evdev

Mude a linha de:

   abnt2               br      =       pc/pc(pc104)+pc/br

Para:

   abnt2               br      =       pc(pc104)+br

Configuração do Gdm[editar | editar código-fonte]

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.

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's
	
	1=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 1024x768+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 1024x768+0+0
	-keyboard /dev/input/eventXX -mouse /dev/input/eventYY -use-evdev -dpi 92
	handled=true
	flexible=false

Foto exemplo[editar | editar código-fonte]

Multiterminal com 3 terminais usando Ubuntu feisty e xephyr

Licença da imagem:

Heckert GNU white.svg
É dada permissão para copiar, distribuir e/ou modificar este documento sob os termos da Licença de Documentação Livre GNU, Versão 1.2 ou qualquer versão posterior publicada pela Free Software Foundation. Uma cópia da licença está inclusa na seção intitulada "Licença de Documentação Livre GNU"

Deutsch - English - Español - Français - http://www.gnu.org/copyleft/fdl.html

Veja também[editar | editar código-fonte]

LIVE-CD[editar | editar código-fonte]

O Centro de Computação Científica e Software Livre (C3SL) da Universidade Federal do Paraná desenvolveu um LIVE-CD baseado na distribuição UBUNTU Feisty (7.04) com o objetivo de testar a tecnologia de multiterminais nas mais diversas variedades de hardware e também como forma de apresentar o multiterminal sem a necessidade de instalação prévia no computador.

Esta ainda é uma versão BETA e possui problemas de segurança de rede, mas está plenamente funcional. A todos que tiverem interesse em testar, aprimorar, fazer sugestões, críticas ou simplesmente conhecer a tecnologia, sejam bem-vindos e sintam-se encorajados a baixar a imagem do CD no seguinte link:

multiterminal-0.1BETA_ubuntu704.iso
multiterminal-0.1BETA_ubuntu704.iso.md5

Os scripts que controlam o multiterminal estão em /multiterminal que é montado quando o LIVE-CD está em execução. Comentários, sugestões, otimização do código dos scripts, idéias novas ou um simples feedback sobre o funcionamento do multiterminal serão bem-vindos.

Mais informações podem ser obtidas em http://www.c3sl.ufpr.br/multiterminal/livecd.html


Multilinux - multiterminais agora com script para Ubuntu 7.04

Agora ficou mais fácil tornar seu Ubuntu 7.04 em Multiterminais, o script que acabou de sair do forno, deixa essa tarefa muito mais fácil e agradável. Para quem ainda não conhece ou nunca ouviu falar sobre esse maravilhoso projeto leia um pouco sobre o mesmo e verá as vantagens de se usar GNU/Linux como Sistema Operacional. Veja abaixo onde encontrar informações sobre o mesmo.

Grupo Multilinux - http://groups.google.com.br/group/multilinux?hl=pt-BR

Lista de discussão do Multilinux - http://listas.softwarelivre.org/cgi-bin/mailman/listinfo/multilinux

Wikipedia
A Wikipédia tem mais sobre este assunto:
multiterminal