Introdução
MultiHead vêm do inglês “cabeças múltiplas”. Na prática é como colocar várias pessoas usando a mesma máquina sem uma atrapalhar a outra. Muitos dos usuários de computadores não imaginam o que os computadores ainda podem fazer. Vemos nos filmes de ficção coisas engenhosas que controlam e facilitam a vida das pessoas. O que geralmente é um erro de se pensar é que muitas das inovações só virão com a evolução técnica da engenharia e arquitetura. Na prática basta uma idéia simples para que tudo que se evoluiu até o presente momento possa ser abandonado ou potencializado. Então, além de aumentar a capacidade dos recursos é importante usá-los de forma plena.
A idéia do multi-head é baseado nesta otimização e melhor aproveitamento dos recursos que temos. Essa é uma idéia que surgiu basicamente da comunidade de software livre. Acho que a maior e primeira referência no assunto foi Alvils Stoss um letão (nascido na Letônia) que escreveu um patch para o kernel chamado Backstreet Ruby. Esse patch foi bem assimilado pela comunidade e mais tarde possibilitou o servidor X a suportar nativamente o conceito sem adaptações. O servidor X é “um capítulo a parte”. Na verdade a concepção dos sistemas Unix definem os recursos de vídeo através de uma aplicação remota cliente-servidor (X). E pelo X já ter esta natureza possibilitou configurações diversas de computadores e terminais. Na prática pode até ser que isso traga um desempenho um pouco menor mas traz um recurso poderoso.
Os requerimentos não são muitos. Os recursos que você precisa para rodar pelo menos 2 terminais são muito baixos. Se você tiver 1 teclado usb, 1 mouse usb, e uma placa com duas saídas de vídeo (até mesmo 1 saída de TV) já existe a possibilidade de configurar o seu multihead. Na teoria o número de usuários podem usar simultaneamente apenas uma CPU é bem grande. Existem placas Desktop com até 6 slots PCI mais 1 AGP ou video onBoard. Todos os slots podem ser usados, e se considerarmos cada slot com uma placa de duas saídas conseguiríamos rodar praticamente um laboratório inteiro!
Não tem quem veja uma solução pronta rodando e não fique igual criança com brinquedo novo. . . Essa solução deu novas perspectivas a montagem de um laboratório e pode reduzir e muito os custos dos mesmos.
Foto de um Multihead usando 4 terminais (Mandriva, Curitiba. Foto tirada por mim)
Os micro-processadores evoluíram muito ao longo da sua história. Os computadores que temos hoje são computadores de grande capacidade de processamento. Enquanto as tarefas básicas, mesmo com todos os recursos gráficos, não são um verdadeiro desafio para o processamento em geral. Os usuários que gostam de ter gráficos com histórico do uso da CPU podem constatar que, há um grande período que a CPU fica ociosa. Você pode fazer um teste habilitando o monitor do sistema na barra do Gnome ou usando o Superkaramba. No uso geral o gráfico se mostra mais ou menos com picos:
Exemplo:
Supondo que este é um histórico de uso esperado dos usuários, se os picos não coincidirem entre eles o resultado(sensação do usuário) vai ser igual a de um computador dedicado. Por outro lado se os picos coincidirem você terá divisão do desempenho pela quantidade de coincidências que ocorrerão. Para teorizar estas informações podemos usar um exemplo. Consideremos “picos” os momentos que a CPU passou de 50% de uso e se manteve por pelo menos 1 segundo e no máximo 2 segundos. Durante o meu teste de uso que abri alguns emails e editei este texto tive 2 picos em 2 minutos. Se tivéssemos 2 usuários, com o mesmo tipo de uso, a probabilidade de haver um momento de colisão dos picos é muito baixa (perto de 5%, dúvidas?). Porém quanto mais usuários, mais alta essa probabilidade vai ser e mais rápido ela cresce (visto que ela não é uma função linear). É possível fazer mais estudos dessa forma, mas isto pode não ser adequado pois não podemos prever o que cada usuário vai fazer. Então a única ferramenta adequada pode ser uma pesquisa com os usuários perguntando a sensação que cada um teve ao usar o computador.
É claro que algumas aplicações como jogos por exemplo exigem um processamento grande e contínuo. Mas tarefas como tarefas de escritório este gráfico é bem exemplificado. Então podemos partir do princípio que seus usuários não vão jogar pesados jogos 3D (no máximo jogos em flash da internet). Porém nem tudo num computador é CPU. Esse tipo de ambiente traz outros tipos de desafios. Por exemplo: o acesso a disco! Os discos rígidos são dispositivos que eu, particularmente, considero verdadeiros dinossauros da informática. Eles são lentos e tem uma latência muito grande. Pior que isso, tendem a ficar mais lentos quando os acessos são não seqüenciais ou seja em setores distantes. O que nos leva a concluir que um ambiente de multiterminais é o pior ambiente possível para acesso a discos (visto que os usuários são independentes).
Mesmo tendo estes desafios o Linux nativamente já usa as melhores alternativas de amenização dos problemas. Como por exemplo:
- Cache de disco em memória.
- Bibliotecas compartilhadas.
- Filosofia Unix de multi-usuário.
- Além da atribuição do Linux como sistema para servidores.
O cache de disco em memória possibilita que pequenos acessos sejam imperceptíveis. Por outro lado o uso de bibliotecas compartilhadas faz com que programas já abertos sejam aproveitados entre vários usuários de forma transparente. O administrador da máquina pode (e é desejável) configurar o sistema de forma a não possibilitar diversas implementações que não são compartilhadas. Por exemplo, numa mesma máquina instalado KDE e GNOME. Visto que um usa QT e o outro GTK e não compartilham nada entre eles. Essas facilidade que o linux apresenta faz com que o multiterminal funcione bem até em um Celeron 1.6 Ghz com 128 mb de RAM. Pelo menos 512MB de RAM e HD Sata é recomendado.
Outra coisa que vale a pena ressaltar: Para configurar seu ambiente multiterminal é necessário ter uma certa experiência com Linux.
Colocando as placas e achando elas no sistema
Procure não fazer a instalação do Linux com elas plugadas. Várias distros possuem ferramentas de configuração automática, e em geral essa configuração vai pensar que você quer estender seu ambiente num único X ou até mesmo travam.
Exemplo da foto de como as placas ficam no gabinete (foto do Instituto Curitiba de Informática)
Aqui irei explicar como configurar o Xorg. Esta implementação do X foi substituida pela Xfree em praticamente todos os projetos do Linux. Então acredito que não haverá problemas nessa parte. Caso você ainda use o Xfree tente fazer uma atualização pro Xorg, isso não vai ser doloroso. Verifique se o hotplug e o udev estão instalados. Isso é facilmente visto pelo seu empacotador padrão da sua distribuição. Se tudo deu certo você deve abrir um shell e executar lspci e a saída deve ser mais ou menos assim:
….
0000:00:0a.0 VGA compatible controller: ATI Technologies Inc Rage 128 RK/VR
0000:00:0b.0 VGA compatible controller: ATI Technologies Inc Rage 128 RK/VR
0000:01:00.0 VGA compatible controller: Silicon Integrated Systems [SiS] 661FX/M661FX/M661MX/741/M741/760/M760 PCI/AGP
Caso não consiga visualizar faça
Anote todos os endereços que estão no primeiro campo (exemplo 0000:00:09.0), se a placa que estiver instalada fisicamente exigir alguma configuração de software especial você deve faze-la. Por exemplo carregar um módulo.
Feito isso podemos plugar os dispositivos USB. Conecte eles de forma que os usuários fiquem mais a vontade possível no seu ambiente de uso. É totalmente indiferente onde eles ficarão plugados. Verifique se estão mesmo plugados! Um número muito grande assim de dispositivos sempre tem um mal encaixado e você perde muito tempo desnecessário com isso. No shell mesmo execute cat dentro do /proc/bus/input/devices:
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=event1 mouse0 ts0
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:03.0-1/input0
H: Handlers=kbd event2
I: Bus=0003 Vendor=0a81 Product=0101 Version=0110
N: Name=”CHESEN USB Keyboard”
P: Phys=usb-0000:00:03.0-1/input1
H: Handlers=kbd event3
I: Bus=0003 Vendor=0566 Product=3002 Version=0100
N: Name=”0566:3002″
P: Phys=usb-0000:00:03.0-2/input0
H: Handlers=kbd event4
I: Bus=0003 Vendor=1267 Product=0210 Version=0001
N: Name=”PS/2+USB Mouse”
P: Phys=usb-0000:00:03.0-3/input1
…. (e tudo mais lá pra baixo)
Cada “bloco” de linhas separados por linhas vazias é um dispositivo. Veja que o mesmo teclado “CHESEN USB Keyboard” tem o mesmo endereço físico, mas tem duas entradas. Isso se deve as teclas especiais como desligar, suspender, navegação na internet e “Windows” que o kernel trata como um teclado separado. Aqui iremos só usar o primeiro input. Anote o endereço físico (Phys) de cada um dos dispositivos e dos teclados apenas o que contém input0.
Tendo anotado tudo que precisamos agora vamos configurar o Linux. Aqui neste passo você pode optar por duas soluções diferentes. O mais interessante é fazer as duas e compará-las. Se quiser ir pra segunda opção pule para Multihead com Xnest e Udev
Multihead usando servidores X separados
O hardware (e algum software que controla esse hardware) geralmente não é projetado para uma configuração dessas. As vezes todas as placas não conseguem trabalhar independentemente. Uma placa pode derrubar a outra em condições especiais que não são tratadas. Um dos casos especiais destes é na inicialização. Esta solução que aqui estou demonstrando funciona com vários servidores X rodando na mesma máquina.
Quando abrimos vários servidores X e quando a placa é inicializada(e o monitor ligado) o canal 10 (IRQ 10) precisa ser desabilitado. A chamada dele é tratada por todas as placas. Porém simplesmente tirando a interrupção 10 faz com que as placas secundárias não tenham modos de tela válidos.
Para isso dá-se um jeito, colocando um script simples no boot que chamaremos de “Xorg-multiprobe”. Ele só inicializará as placas para que depois elas sejam usadas.
Mas primeiro vamos configurar o xorg.conf, edite o /etc/X11/xorg.conf mais ou menos com a seguinte configuração, mudando os endereços pelo qual você anotou:
….
Identifier “Keyboard0”
Driver “kbd”
Option “Protocol” “evdev”
Option “Dev Phys” “isa0060/serio0/input0”
Option “XkbRules” “xorg”
Option “XkbModel” “pc104”
Option “XkbLayout” “us”
Option “CoreKeyboard”
EndSection
Section “InputDevice”
Identifier “Keyboard1”
Driver “kbd”
Option “Protocol” “evdev”
Option “Dev Phys” “usb-0000:00:03.0-1/input0”
Option “XkbRules” “xorg”
Option “XkbModel” “pc104”
Option “XkbLayout” “us”
Option “CoreKeyboard”
EndSection
Section “InputDevice”
Identifier “Keyboard2”
Driver “kbd”
Option “Protocol” “evdev”
Option “Dev Phys” “usb-0000:00:03.0-2/input0”
Option “XkbRules” “xorg”
Option “XkbModel” “pc104”
Option “XkbLayout” “us”
Option “CoreKeyboard”
EndSection
Section “InputDevice”
Identifier “Mouse1”
Driver “mouse”
Option “Protocol” “evdev”
Option “Dev Phys” “usb-0000:00:03.2-1/input1”
Option “CorePointer”
Option “ZAxisMapping” “4 5”
EndSection
Section “Device”
Identifier “Device0”
Driver “sis”
BusID “PCI:1:0:0”
Option “NoInt10” “Yes”
Option “RestoreBySetMode” “no”
EndSection
Section “Device”
Identifier “Device1”
Driver “ati”
BusID “PCI:0:9:0”
Option “NoInt10” “Yes”
Option “RestoreBySetMode” “no”
EndSection
Section “ServerLayout”
Identifier “Layout0”
Screen “Screen0”
InputDevice “Keyboard0”
InputDevice “Mouse0”
Option “SingleCard”
EndSection
Section “ServerLayout”
Identifier “Layout1”
Screen “Screen1”
InputDevice “Keyboard1”
InputDevice “Mouse1”
Option “SingleCard”
Option “DontZap” “on”
EndSection
Aqui omiti várias informações, porém o principal ainda se encontra aí. Interessante também é desabilitar a aceleração 3D, já que não vai ser necessário mesmo, coloque Option “NoAccel” em cada device. A opção Dontzap no layout impede que o usuário feche o X com Ctrl+Alt+Backspace. Isso faz com que todos os usuários caiam. Atenção! o BusID usa endereços em decimal.. então converta a =10, b=11, c=12…
Outra coisa muito importante é o driver evdev (event devices), ele é o responsável pela separação dos dispositivos em distros como Mandriva e evdev não vem compilado no Xorg. Infelizmente você vai ter que compilar e o trabalho vai durar semanas. Outra solução é usar o /dev/input ao invés do endereço físico, mas sua distro deve suportar os protocolos.
Agora precisamos configurar o “Xorg-multiprobe” no boot. Pra isso crie um arquivo “xorg.conf.probe”, que será baseado no xorg.conf. Ele habilita as placas no boot. Então crie o /etc/X11/xorg.conf.probe começando já da placa secundária:
Identifier “Device1”
Driver “ati”
Screen 0
BusID “PCI:0:9:0”
Option “NoInt10” “no”
Option “NoAccel”
Option “RestoreBySetMode” “no”
EndSection
Section “ServerLayout”
Identifier “probe”
Screen “Screen1”
Screen “Screen2” LeftOf “Screen1”
Screen “Screen3” LeftOf “Screen2”
InputDevice “Keyboard1”
InputDevice “Mouse1”
EndSection
A ordem das telas não importa. Note que só são inicializadas as placas secundárias. E a interrupção 10 está como “NO”.
Agora precisamos colocar na inicialização. Crie um script /etc/init.d/xorg-multiprobe com a seguinte linha de comando:
Agora descubra qual runlevel corresponde ao modo multi-usuário com X11 na sua distro dando um cat no /etc/inittab.
Vamos supor que seja o Debian, que é 3. Então entre em /etc/rc3.d e crie um link simbólico com:
O número 80 corresponde a prioridade que esse script tem no boot.
Agora podemos testar antes de passar para o próximo passo. Testaremos o X, abra no terminal:
Depois feche o X e teste um por um dos layouts:
$ Xorg -layout Layout2
$ Xorg -layout Layout3
Tendo todos os layouts funcionando, teste o teclado com o numlock, se todos os leds piscarem juntos, não está funcionando como deveria. Isso é muito difícil mas pode ocorrer em alguns casos. Se ocorrer ceritifque-se que sua instalação foi zerada antes de começar.
Deixe seu comentário