Saltar para o conteúdo

Multiterminais/Multiterminal com faketty

Origem: Wikilivros, livros abertos por um mundo aberto.

Esse artigo ensina como um Multiterminal com faketty funciona, e como fazê-lo. Ele utiliza o módulo faketty, desenvolvido por Aivils Stoss, e não precisa nem do protocolo evdev nem de patches no kernel. Este método é um dos mais famosos de todos para se fazer multiterminais.

Este texto descreve os passos necessários para se configurar um sistema multiterminal utilizando o módulo faketty. O faketty é um módulo do kernel, desenvolvido por Aivils Stoss, que associa os teclados do sistema a arquivos de dispositivo chamados /dev/fttyXX (sendo XX um número que identifica o teclado), os quais o X utiliza para ler os eventos do teclado. Esse módulo usa o mesmo protocolo que o X normalmente utiliza para ler eventos do teclado, isto é, o protocolo TTY, o que dispensa a utilização do evdev. Outra vantagem desse método é que não é necessário nenhum patch para o kernel.

As desvantagens são que esta solução necessita que um módulo do kernel seja compilado, e que esta abordagem só funciona de maneira estável com poucas combinações de placas de vídeo.

Sistema operacional

[editar | editar código-fonte]

Debian Sarge (mas outras distribuições de linux também podem ser utilizadas de maneira muito similar).

e

Ubuntu 6.10 Edgy

Hardware utilizado

[editar | editar código-fonte]

Placas de Vídeo

  • 4 placas SiS 315 (outras placas também podem ser utilizadas, mas nem todas funcionam corretamente).

Teclados e Mouses:

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

Nos testes com Ubuntu 6.10, foram utilizadas:

  • 4 placas de vídeo PCI Nvidia Riva TNT2 Model 64/Model 64 Pro.
  • 1 placa de vídeo SIS 6326 AGP
  • 1 teclado e 1 mouse PS/2
  • 4 teclados e 4 mouses USB

OBS.: para o funcionamento correto das placas de vídeo, a SIS AGP deve ser iniciada por primeiro em X0, card0 etc., bem como na BIOS definir como preferencial, pois como secundário, a tela trava logo após a inicialização do X.

Instalação do udev

[editar | editar código-fonte]

É necessária 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 o kernel 2.6.12 ou mais novo.

    • Já instalado por default no Ubuntu 6.10.

Compilação e carregamento do módulo faketty

[editar | editar código-fonte]

Certifique-se que estão instalados os headers (cabeçalhos) do kernel que você está usando. Se você utiliza o Debian, faça o seguinte comando:

apt-get install linux-headers-$(uname -r)

O próximo passo é compilar o módulo faketty para seu kernel. Você pode encontrar o código fonte do módulo aqui: http://www.ltn.lv/~aivils/files/faketty-0.04.tar.bz2

Para o Ubuntu 6.10 é necessária a versão 0.05 do faketty, senão o módulo não será inicializado corretamente. Encontra-se no link: http://www.ltn.lv/~aivils/files/faketty-0.05.tar.bz2

Descompacte o arquivo, e execute o seguinte comando no diretório onde se encontra o arquivo "Makefile", para compilar e instalar o módulo:

make && make install

Para carregar o módulo no kernel, execute o seguinte comando:

modprobe faketty
[editar | editar código-fonte]

Em seguida, é necessário verificar o arquivo /proc/bus/input/devices para saber a qual arquivo ffty cada teclado foi associado. Um exemplo do arquivo /proc/bus/input/devices é dado a seguir:

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 ftty1
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 ftty2
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 ftty3
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

É possível notar que existem três teclados sendo mostrados, sendo que o primeiro está associado ao arquivo /dev/ftty1 e o segundo ao arquivo /dev/ftty2. Os teclados cujo campo "P: Phys" terminem em input1, ao invés de input0, como o terceiro teclado do arquivo, devem ser desconsiderados, pois se referem às teclas e funções especiais de algum teclado.

Também é possível ver, no arquivo de exemplo, a presença de dois mouses, que estão associados aos arquivos /dev/input/mouse0 e /dev/input/mouse1, respectivamente.

O X, ao ser inicializado, para fazer a leitura dos eventos do teclado abre o arquivo /dev/ttyXX, sendo XX o número do VT (Terminal Virtual) que o X recebe como parâmetro. Como não é possível pedir para o X abrir outro arquivo, é necessário fazer com que os arquivos /dev/ttyXX sejam links para os arquivos ftty indicados no arquivo /proc/bus/input/devices. No exemplo a seguir, criamos 4 links, um para cada teclado, dos arquivos /dev/tty50 em diante.

rm -f /dev/tty5[0-3]
ln -s /dev/ftty1 /dev/tty50
ln -s /dev/ftty2 /dev/tty51
ln -s /dev/ftty3 /dev/tty52
ln -s /dev/ftty4 /dev/tty53

Instalação do driver para placa de vídeo SiS

[editar | editar código-fonte]

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

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

2. Atualize as informações de pacotes do sistema e instale o driver x-driver-sis:

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

OBS.: Para Ubuntu 6.10, não foi necessária instalação do driver acima, utilizado driver padrão "sis" no xorg. Apesar disso, foi necessária instalação do driver para linux da Nvidia, disponível em:

http://download.nvidia.com/XFree86/Linux-x86/1.0-7184/NVIDIA-Linux-x86-1.0-7184-pkg1.run

Salve o arquivo, dê permissão de execução ao mesmo (chmod +x NVIDIA-Linux-x86-1.0-7184-pkg1.run) e execute-o. É importante que esse passo seja feito sem o gerenciador gráfico rodando (GDM ou KDM), caso contrário, retornará um erro. Feito isso, o driver "nvidia" terá que ser instanciado posteriormente no xorg.conf.

Instale o pacote hotplug:

apt-get update
apt-get install hotplug

obs.: Para Ubuntu, não é necessário esse procedimento.

Instalação do servidor XOrg

[editar | editar código-fonte]

O próximo passo é a instação do servidor XOrg.

1. Faça uma cópia de segurança (backup) e remova o arquivo /etc/init.d/xfree-common. 2. Adicione as seguintes linhas ao arquivo /etc/apt/sources.list:

deb http://people.debian.org/~nobse/xorg-x11/ sarge main
deb-src http://people.debian.org/~nobse/xorg-x11/ sarge main

3. Instale o pacote xserver-xorg:

apt-get update
apt-get install xserver-xorg
apt-get upgrade

Configuração do servidor XOrg

[editar | editar código-fonte]

Essa configuração será usada durante o funcionamento do multiterminal. Neste arquivo serão criadas seções adicionais de acordo com o número de terminais que estamos configurando. Para cada terminal, criaremos uma seção para o mouse, teclado, placa de vídeo, monitor, tela (screen) e layout. Por exemplo, no caso de um multiterminal com quatro terminais, o arquivo terá quatro seções de mouse, quatro de teclado, e assim por diante.

Os valores sugeridos para “Identifier” em cada seção não são mandatórios. Eles podem ser alterados, desde que mantida a coerência dos nomes na configuração toda.

O endereço físico (opção “Dev Phys”) de cada dispositivo pode ser obtido através do arquivo /proc/bus/input/devices, como visto anteriormente.

A seguir, um exemplo para cada tipo de seção.

Section "InputDevice"
        Identifier      "Generic Keyboard 0"
        Driver          "keyboard"

        # As opções abaixo são adequadas a um teclado brasileiro
        # com cedilha (ABNT2).
        Option          "XkbRules"      "xorg"
        Option          "XkbModel"      "abnt2"
        Option          "XkbLayout"     "br"
        Option          "XkbVariant"    "abnt2"
        Option          "XkbOptions"    "abnt2"
        Option          "CoreKeyboard"
EndSection


Section "InputDevice"
        Identifier      "Configured Mouse 0"
        Driver          "mouse"

        # Substitua o valor da opção "Device" pelo arquivo do
        # mouse correspondente, obtido a partir do arquivo
        # /proc/bus/input/devices .
        Option          "Protocol"      "ImPS/2"
        Option          "Device"      "/dev/input/mouse0"

        # Todos os mouses devem ter a opção "CorePointer"
        Option          "CorePointer"
        Option          "ZAxisMapping"          "4 5"
EndSection


Section "Device"
        Identifier      "Placa de Vídeo Genérica 0"
        Driver          "sis"
        Screen          0

        # É obrigatório explicitar o BusID de todas as placas. Para
        # obtê-los, use "lspci | grep VGA". Cuidado com os valores,
        # pois o endereço fornecido pelo lspci é em base hexadecimal
        # e o XOrg espera um valor decimal.  Para a conversão use
        # "echo $((0xVALOR_HEXADECIMAL))".
        BusID           "PCI:1:0:0"

        # Esta opção desabilita as chamas VGA e VBE da IRQ 10, para
        # evitar que uma placa interfira com as demais.  Ver também o
        # arquivo "xorg.conf.probe".
        Option          "NoInt10"       "Yes"

        # Esta opção para placas SiS evita problemas ao alternar entre
        # terminais virtuais ou ao encerrar o servidor X.
        Option          "RestoreBySetMode"      "no"

EndSection


# Os valores abaixo são default.  Mantenha a configuração que você
# usaria normalmente para seus monitores.
Section "Monitor"
        Identifier      "Monitor Genérico 0"
        HorizSync       30-60
        VertRefresh     50-75
        Option          "DPMS"
EndSection


# A configuração da tela abaixo também é ilustrativa, personalize-a
# de acordo com sua preferência.
Section "Screen"
        Identifier      "Default Screen 0"
        Device          "Placa de Vídeo Genérica 0"
        Monitor         "Monitor Genérico 0"
        DefaultDepth    24
        SubSection "Display"
        Depth           24
                Modes           "1024x768" "800x600" "640x480"
        EndSubSection
EndSection


Section "ServerLayout"
        # O Identifier será usado na chamada em linha de comando.
        Identifier      "Layout0"
        Screen          "Default Screen 0"
        InputDevice     "Generic Keyboard 0"
        InputDevice     "Configured Mouse 0"

        Option          "SingleCard"
EndSection

xorg.conf.probe

[editar | editar código-fonte]

Além do arquivo padrão xorg.conf, será necessário criar um segundo arquivo de configuração, o xorg.conf.probe. Durante o uso do multiterminal, desabilitamos as interrupções no canal 10 (IRQ 10) para evitar que chamadas VGA (e VESA VBE) de uma placa interfiram com as demais. Porém, com essas chamadas desabilitadas as placas secundárias não são inicializadas. Para resolver este problema, durante o processo de inicialização do sistema o XOrg será rodado com o arquivo xorg.conf.probe. Ele fará uma checagem (probe) pela presença destas placas, com a IRQ 10 ativa durante o teste, de forma a inicializá-las.

Para criar o xorg.conf.probe, tome o xorg.conf como base, remova as seções relativas à placa de vídeo primária (que é inicializada pela BIOS ao ligar o computador) e troque a opção NoInt10 para "No". Será necessário um único layout, mas incluindo todas as placas secundárias. Como exemplo, alguns trechos do arquivo xorg.conf.probe derivado do xorg.conf acima:

# Em todas as seções Device (das placas de vídeo), troque a opção
# NoInt10 para:
        Option          "NoInt10"               "no"

# Declarar apenas um layout, e sem usar a opção "SingleCard".
# Todas as telas (screens) secundárias devem ser incluídas. A
# disposição das telas (LeftOf, etc.) não é importante, tampouco
# os dispositivos de entrada usados.
Section "ServerLayout"
        Identifier      "probe"
        Screen          "Default Screen 1"
        Screen          "Default Screen 2"   LeftOf  "Default Screen 1"
        Screen          "Default Screen 3"   LeftOf  "Default Screen 2"
        InputDevice     "Generic Keyboard 1"
        InputDevice     "Configured Mouse 1"
EndSection

Para rodar o teste (probe) é fornecido o arquivo xorg-multiterminal. Ele executa o servidor X no modo probeonly (apenas testar por dispositivos e encerrar), com o arquivo xorg.conf.probe. Como explicado acima, este passo inicializa as placas de vídeo secundárias. O conteúdo do arquivo é:

file=/etc/X11/xorg.conf.probe

[[ -f "file" ]] && /usr/X11R6/bin/X -config "$file" -probeonly 2>/dev/null

Salve-o como um script executável e configure o sistema de inicialização para rodá-lo. No caso do Debian, o caminho deve ser /etc/init.d/xorg-multiterminal, e existem duas maneiras de configurar o sistema:

  • Através do comando update-rc.d. Este comando funciona tanto para usuários do sistema padrão do Debian (sysv-rc) quanto para usuários do pacote file-rc.
update-rc.d xorg-multiterminal start 70 S .
  • Manualmente:

Em um sistema Debian usando o esquema padrão de inicialização, crie um link:

ln -s /etc/init.d/xorg-multiterminal /etc/rcS.d/S70xorg-multiterminal

Em um sistema Debian com o pacote file-rc instalado, acrescente a seguinte linha em um lugar apropriado no arquivo /etc/init.d/runlevel.conf:

70        -        S        /etc/init.d/xorg-multiterminal

O último passo é configurar o gerenciador de login para iniciar todos os servidores X. Trataremos apenas do GDM. Outros gerenciadores como o XDM e o KDM podem ser configurados por um processo similar.

Deve-se editar a seção “[servers]” do arquivo /etc/gdm/gdm.conf para que contenha múltiplas entradas, como no exemplo seguinte para quatro terminais:

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

Os nomes dos servidores são arbitrários, mas deve-se adicionar uma seção para cada servidor, com o conteúdo como abaixo:

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

[server-XServer1]
name=Standard server
mmand=/usr/X11R6/bin/X -br -audit 0 -layout Layout1 :1 vt51
flexible=true

[server-XServer2]
name=Standard server
mmand=/usr/X11R6/bin/X -br -audit 0 -layout Layout2 :2 vt52
flexible=true

[server-XServer3]
name=Standard server
mmand=/usr/X11R6/bin/X -br -audit 0 -layout Layout3 :3 vt53
flexible=true

Observe que os 4 servidores estão utilizando os VT's 50, 51, 52 e 53, respectivamente. Dessa forma, os servidores X irão utilizar, para ler o eventos do teclado, os arquivos /dev/tty50, /dev/tty51, /dev/tty52 e /dev/tty53, que na verdade são links para os arquivos /dev/fttyXX, conforme criamos anteriormente.

Solução de Problemas

[editar | editar código-fonte]

Problemas na inicialização do multiterminal podem ser analisados nos arquivos em /var/log/Xorg.*.log. O servidor X de cada terminal criará seu próprio arquivo de registro.

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