Saltar para o conteúdo

Multiterminais/Multiterminal com Ruby

Origem: Wikilivros, livros abertos por um mundo aberto.

Um Multiterminal com Ruby é um multiterminal que permite o uso de consoles independentes. Foi o primeiro método de se fazer multiterminais desenvolvido. Ele utiliza um patch no kernel.

Backstreet Ruby é um patch para o kernel, desenvolvido com a finalidade de fornecer vários consoles independentes. Uma das desvantagens é que o patch é específico para um determinado kernel. Sendo assim, ao fazer uma atualização de kernel, deve-se dispor também de uma versão do patch para o mesmo kernel.

Sistema Operacional

[editar | editar código-fonte]

Debian Sarge (outras distribuições de Linux também podem ser facilmente utilizadas).

Placas de Vídeo:

  • 4 Placas SiS (outras placas de vídeo também podem ser utilizadas, mas nem todas).

Dispositivos:

  • 1 teclado PS/2
  • 1 mouse PS/2
  • 3 teclados USB
  • 3 mouses USB

Instalando driver da placa SiS

[editar | editar código-fonte]

1. Adicione esta linha ao arquivo /etc/apt/sources.list:

deb http://www.winischhofer.net/sis/debian/stable ./

2. Atualize a base de dados dos pacotes e instale o pacote x-driver-sis

apt-get update
apt-get install x-driver-sis

Instalando pacote pré-compilado do kernel 2.6.7 já com o patch ruby

[editar | editar código-fonte]

1. Faça o download do arquivo kernel-image-2.6.7-ruby_10.00.Custom_i386.deb 2. Instale o pacote

dpkg -i kernel-image-2.6.7-ruby_10.00.Custom_i386.deb

1. Instale o pacote hotplug:

apt-get update
apt-get install hotplug

2. Substitua os arquivos /etc/hotplug/input.agent e /etc/hotplug/input.rc pelos seguintes: input.agent e input.rc.

3. Crie dois arquivos, mouse.conf e kbd.conf. Esses dois arquivos identificam dispositivos(mouses e teclados) de acordo com seu endereço físico, relacionando-os a um link simbólico, no caso dos mouses, e a um VT(Terminal Virtual), no caso dos teclados. Veja exemplos de configuração de cada um deles respectivamente:

      mouse0br		isa0060/serio1/input0
      mouse1br		usb-0000:00:10.0-2/input0
      mouse2br		usb-0000:00:10.1-2/input0
      mouse3br		usb-0000:00:10.2-2/input0

Cada linha identifica um dos mouses. A primeira informação, mouse0br, é um link simbólico para o mouse que está conectado ao endereço físico isa0060/serio1/input0. As demais linhas seguem a mesma lógica.

      VT0		isa0060/serio0/input
      VT1		usb-0000:00:10.0-1/input0
      VT2		usb-0000:00:10.1-1/input0
      VT3		usb-0000:00:10.2-1/input0

Cada linha identifica um dos teclados. A primeira informação, VT0, associa um VT ao teclado conectado ao endereço físico isa0060/serio0/input. As demais linhas seguem a mesma lógica.

Observações:

Quando um dispositivo é conectado, o HotPlug automaticamente cria o respectivo link em /dev/input/

O endereço físico de cada dispositivo pode ser obtido através do arquivo /proc/bus/input/devices

Dispositivos de Entrada

[editar | editar código-fonte]

Antes de proceder, verifique se os teclados e mouses foram detectados corretamente. Leia o conteúdo do arquivo /proc/bus/input/devices, que contém informações sobre os dispositivos detectados pelo kernel.

Veja um exemplo deste arquivo. Daremos destaque para dois campos: nome dos dispositivos, presente em linhas que começam com “N: Name=”, e o endereço físico, mostrado em linha que começan com “P: Phys”.

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 mostrar a presença de três teclados, quando na verdade existem apenas dois. A razão para o dispositivo adicional é que muitos teclados USB incluem teclas especiais(como de acesso à internet), as quais são detectadas pelo kernel como um teclado secundário. Teclados secundários tem o endereço físico terminado por “input1”. Estamos interessados somente no primeiro teclado, cujo endereço físico termina com “input0”. Sendo assim, a seção referente ao teclado secundário com endereço físico “usb-0000:00:10.2-1/input1” será ignorada.

Configuração do Servidor X(XFree86)

[editar | editar código-fonte]

Deve-se realizar a configuração de dois arquivos. O /etc/X11/XF86Config-4 e o /etc/X11/XF86config-4.probe.

Durante a inicialização do multiterminal, o arquivo /etc/X11/XF86Config-4.probe é utilizado antes do /etc/X11/XF86Config-4. Porém, para um melhor entendimento, geraremos primeiro o arquivo /etc/X11/XF86Config-4 e, a partir deste, geraremos o segundo arquivo(/etc/X11/XF86Config-4.probe).

Essa configuração é aquela que será utilizada durante o funcionamento do multiterminal. Neste arquivo devem ser criadas seções adicionais de acordo com o número de terminais que estamos configurando. Deve ser criada uma seção para cada mouse, placa de vídeo, monitor, screen e layout. Sendo assim, se estivermos interessados em configurar um multiterminal com 4 terminais, teremos 4 seções de mouses, 4 de placas de vídeo, e assim por diante.

Atenção: para o teclado deve ser criado apenas uma seção!

Os valores sugeridos para "Identifier" em cada seção não é rígido. Podendo ser alterado desde que seja mantida a coerência com o restante da configuração. Veja um exemplo de arquivo onde deve ser adicionada cada seção.

		#Seção Mouse
		Section "InputDevice"
			Identifier	"Mouse0"
			Driver		"mouse"
			Option		"CorePointer"			
			Option		"Device"		"/dev/input/IDENT_MOUSE"
			.
			.
		EndSection
		#
		# Na opção "Device", IDENT_MOUSE é o mesmo link simbólico descrito para cada mouse no arquivo mouse.conf.
		# Por exemplo, mouse0br, mouse1br, mouse2br e mouse3br.
		

		#Seção Placa Vídeo SiS
		Section "Device"
			Identifier		"Card0"
			Driver			"sis"
			BusId			"PCI:1:0:0"
			Option			"noInt10"			"yes"
			Option			"RestoreBySetMode"		"No"
		EndSection
		#
		#  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))"
		#		
		#	noInt10:	Desabilita o modulo que usa a chamada int10 da BIOS das placas de vídeo. Essa chamada é
		#  responsável por inicializar as placas de vídeo e será usada somente no arquivo XFree86Config-4.probe
		#  durante a execução "probeonly" do servidor X. Quando utilizada a opção -probeonly,
		#  o servidor X apenas faz um teste dos dispositivos e termina sua execução.
		#
		# 	RestoreBySetMode(para placas de vídeo sis): É utilizada para evitar problemas em monitores LCD 
		#	enquanto a máquina alterna entre terminais virtuais ou então quando esta finaliza o servidor X.		
	

		#Seção Monitores
		Section "Monitor"
			Identifier	"Monitor0"
			HorizSync	30-71
			VertRefresh	50-160
			Option		"DPMS"
		EndSection		
		#

		
		#Screen
		Section "Screen"
			Identifier	"Screen0"
			Device		"Card0"
			Monitor		"Monitor0"
			DefaultDepth	24
			SubSection "Display"
				Depth		16
				Modes		"1024x768" "800x600" "640x480"
			EndSubSection
			SubSection "Display"
				Depth		24
				Modes		"1024x768" "800x600" "640x480"
			EndSubSection
		EndSection
		#

						
		#layout
		Section "ServerLayout"
			Identifier	"X0"
			Screen		"Screen0"
			InputDevice	"kbd0"
			InputDevice	"Mouse0"
			Option		"IsolateDevice"		"PCI:1:0:0"
		EndSection		
		#
		#	Obs: Para todos os layouts, deve-se usar o mesmo teclado.
		#	Neste exemplo, os demais layouts teriam a ocorrência: InputDevice "kbd0"
		#
		#	O valor da opção IsolateDevice é o endereço físico da placa de vídeo utilizada
		#	pela Screen deste mesmo layout. Por exemplo: O layout X0 utiliza Screen0, que por
		# 	sua vez está relacionada a Card0, de endereço físico 1:0:0
		#

XF86Config-4.probe

[editar | editar código-fonte]

Se o multiterminal fosse inicializado diretamente, utilizando o arquivo XF86Config-4, não obteríamos sucesso. Isso acontece pelo fato das placas de vídeo secundárias não terem sido inicializadas corretamente. Quando a opção noInt10 está setada como yes, como eh o caso do arquivo XF86Config-4, esta inicialização é inibida.

Dessa forma, o arquivo XF86Config-4.probe fornece uma configuração para que o servidor X possa ser inicializado, em primeira instância, com a opção noInt10="no". Logo após, o X poderá usar com sucesso o arquivo XF86Config-4.

Veja o que modificar para gerar o arquivo XF86Config-4.probe:

			#Nas seções das placas de vídeo, use a opção:
			#
			Option		"noInt10"		"no"



			#Quanto aos layouts, declarar apenas um(como mostrado abaixo) e também sem utilizar a opção:
			#
			#	Option		"IsolateDevice"		"PCI:1:0:0"
			#				
			Section "ServerLayout"
				Identifier	"X0"
				Screen		"Screen0"			
				Screen		"Screen1" LeftOf "Screen0"
				Screen		"Screen2" Below  "Screen0"
				Screen		"Screen3" LeftOf "Screen2"
				InputDevice	"kbd0"
				InputDevice	"Mouse0"
			EndSection
			#
			# A disposição das telas apresentadas no Layout X0 é simplesmente ilustrativa, podendo sofrer váriações.
xfree86-multiterminal

O arquivo xfree86-multiterminal eh responsável pela inicialização probeonly (conforme citado na na seção do arquivo XFree86Config-4) do servidor X, utilizando o arquivo de configuração XFree86Config-4.probe, e garantindo uma correta inicialização das placas de vídeo. Logo após, o servidor X será executado utilizando o arquivo de configuração XFree86Config-4.

1. Salve o arquivo xfree86-multiterminal em /etc/init.d/ 2. Linke-o da seguinte forma:

update-rc.d xfree86-multiterminal start 70 S .

Criando um link S70xfree86-multiterminal em /etc/rcS.d para o arquivo /etc/init.d/xfree86-multiterminal.

Obs: O comando update-rc.d existe somente nas distribuições baseadas no Debian. Alternativamente, crie manualmente um link com nome S70xfree86-multiterminal.

Configuração do Gdm

[editar | editar código-fonte]

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

		[servers]
		
		0=XServer0
		1=XServer1
		2=XServer2
		3=XServer3

		[server-XServer0]
		name=Standard server
		command=/usr/X11R6/bin/X -audit 0 -layout X0 :0 vt7
		flexible=true 

		[server-XServer1]
		name=Standard server
		command=/usr/X11R6/bin/X -audit 0 -layout X1 :1 vt17
		flexible=true

		[server-XServer2]
		name=Standard server
		command=/usr/X11R6/bin/X -audit 0 -layout X2 :0 vt18
		flexible=true 

		[server-XServer3]
		name=Standard server
		command=/usr/X11R6/bin/X -audit 0 -layout X3 :1 vt19
		flexible=true

		# Repare que os VT's utilizados no arquivo gdm.conf podem parecer "diferentes" daqueles criados no arquivo
		# kdb.conf. Porém, na verdade, são os mesmos. Isso acontece pelo fato do gdm se comunicar diretamente com o kernel,
		# ao invés de utilizar a interface /proc.
		#

Configuração GRUB/LILO

[editar | editar código-fonte]

Finalmente, é necessário passar um parâmetro para o kernel indicando quantos VT's(teclados virtuais) adicionais devem ser criados:

Edit o arquivo /boot/grub/menu.lst.

kernel /boot/vmlinuz-2.6.7-ruby /root/dev/hd"xy" ro dumbcon=N
# Onde x e y identificam o disco rígido e sua partição respectivamente
# O valor de N indica o número de teclados adicionais que devem ser criados.
# Para um FourHead, por exemplo, N=3 é suficiente.

No arquivo de configuração do lilo, /etc/lilo.conf, insira o seguinte:

append="dumbcon=N"
# O valor de N indica o número de teclados adicionais que devem ser criados.
# Para um FourHead, por exemplo, N=3 é suficiente.

Verificando problemas

[editar | editar código-fonte]

Problemas na inicialização do multiterminal podem ser analizados em: /var/log/Xorg.*.log. Cada Servidor X criará seu próprio arquivo de log.

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