MultiHeads no Linux

A idéia é simples, colocar várias placas de vídeo, vários teclados e vários mouses num mesmo computador de forma que diversos usuários usem-o simultaneamente e independentemente a mesma CPU. Solução barata e muito na moda ultimamente.

[ Hits: 59.262 ]

Por: Alexandre Felipe Muller de Souza em 07/12/2005


Começando a por a mão na massa



Dentre os problemas que envolvem os multiheads, existem alguns realmente chatos. As placas não são projetadas pra funcionar de forma independente. Uma placa sempre derruba a outra, às vezes aparecem caracteres estranhos em uma delas e a tela misteriosamente começa a rodar com um simples mount ou swapon.

Por exemplo, uma interrupção pode ser "entendida" por todas elas. Isto acontece com a int 10. Quando a placa é inicializada. Porém simplesmente tirando a interrupção 10 faz com que as placas secundárias não tenham memória suficiente para inicializar (sem modos de tela válidos).

Mas calma, não é o fim do mundo. Para isso dá-se um jeito, colocando um script simples no boot que chamaremos de "Xorg-multiterminal". Ele só inicializará as placas sem a interrupção 10 pra 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:

....
Section "InputDevice"
        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 "Xorgmultiterminal" 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:

Section "Device"
        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/xorgmultiterminal com a seguinte linha de comando:

[[ -f "/etc/X11/xorg.conf.probe" ]] && /usr/X11R6/bin/X -config /etc/X11/xorg.conf.probe -probeonly

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:

$ ln -s /etc/init.d/xorgmultiterminal S80xorgmultiterminal

O número 80 corresponde a prioridade que esse script tem no boot. Quando você parar o X, execute sempre ele novamente na mão pra não precisar reiniciar. Por exemplo:

$ /etc/init.d/gdm stop
$ /etc/init.d/xorgmultiterminal
.......
$ /etc/init.d/gdm start


Página anterior     Próxima página

Páginas do artigo
   1. Considerações Gerais
   2. Colocando as placas e achando elas no sistema
   3. Começando a por a mão na massa
   4. Configurando o gerenciador de displays (kdm, xdm, gdm)
   5. Testando e usando
   6. Concluindo
Outros artigos deste autor

Solução corporativa Expresso Livre, substituto de peso do Notes

Multi-head usando udev e Xnest

Jopen, não se preocupe mais em descobrir qual aplicativo usar

Como montar um pacote RPM

Ajude o Linux, use o Linux

Leitura recomendada

NFS sem segredos

Otimizando o uso do seu disco rígido usando a mesma /home para várias distribuições

Shared Config com Apache a la brasileira

Instalação de servidor Slackware 10.2

OSPF + quagua + CentOS 5.3

  
Comentários
[1] Comentário enviado por reimassupilami em 07/12/2005 - 10:26h

cara, muito interessante... eu já tinha lido algo sobre isso, mas achava que era necessário algum sistema especial, e até hardware especial também... mas assim, dá juntar uma turma e tentar quebrar a cabeça pra montar isso...

muito legal mesmo, tá de parabéns...

[2] Comentário enviado por slackdaemon em 07/12/2005 - 11:07h

Muito bom cara, nunca tinha visto isso. Vou dá uma pesquisada a mais e implementar em casa, se achar alguma solução para as pendencias eu posto aqui. Valeu!

[3] Comentário enviado por peregrino em 07/12/2005 - 11:53h

Bom Dia winchester

eu já conhecia e uso essa solução mas seu tutorial esta de parabens mesmo

falow

[4] Comentário enviado por cpolegatojr em 07/12/2005 - 13:05h

Olá,

Ja venho trabalhando nisso há algum tempo (mais de um ano) para ser uma solução viável para as empresas e um grande prolema é quando um usuário abre algum aplicativo que tome todo o processamento, disco, memória ou outro recurso que seja, os outros usuário ficam na mão e botão a boca no trombone... Dae aconcelho no mínimo um 1GHz de processamento cada, 256 MB de RAM para o sistema e 256 MB para cada usuário na máquina... Menos que isso, numa empresa de movimentação constante é dor de cabeça...
Além disso, um grande problem é quando um usuário trava num aplicativo específico (ou numa janela) e não consegue tralhar, dae CTRL+ATL+BS geralmente (99%) trava tudo, dae todo mundo trava... For que quando uma peça queima, seja fonte, drives, rede, etc ou até um mané que tropeça nos cabos, os usuários ficam perdidos...
Acho que até isso ficar tecnologia totalmente madura para empresas (em lan house não vejo problemas) é aconselhável 2 por máquina e um monitoramento constante... Do resto, uso em casa e no trabalho e não volto atrás...
E parabéns por esse seu passo a passo, vai ajudar muita gente. Até então somente indicava o da C3SL, mas agora também vou indicar o seu.

[]'s

Claudio
Um peregrino de problemas; Um pergaminho de soluções!

[5] Comentário enviado por agk em 07/12/2005 - 14:45h

É uma solução interessante do ponto de vista financeiro, pois vai se economizar com hardware.
Parabéns pelo artigo, muito bom.

[6] Comentário enviado por bestlinux em 07/12/2005 - 16:07h

Gostei do artigo.....uma solução bem diferente...e muito util hoje em dia :-)

Parabens...

Falow !

[7] Comentário enviado por anderson_souza em 07/12/2005 - 16:36h

Não tem muito tempo eu estava discutindo com outro profissional da informática, sobre o conceito de terminal, que eu achava que tinha morrido, eu senti pena do fato e o ele disse que tinha que acabar mesmo, e era coisa do passada.

Bom eu sempre achei que era válida, apesar de ser uma idéia antiga. Agora fico contente em ver que tem gente que concorda que as vezes precisamos usar outras alternativas e não só descartar por se algo dos anos 60 ou 70 e inicio dos anos 80, so que na época feito por placa terminal.

Gostei muito do seu artigo, valeu mesmo.

[8] Comentário enviado por danilorlima em 07/12/2005 - 19:45h

que distro você usou ?

[9] Comentário enviado por tiago_herrmann em 07/12/2005 - 23:09h

Cara, já te dei os parabéns pessoalmente, mas dou parabéns de volta..
quando olhei o título do artigo eu já tinha idéia que era você que tinha escrito!
Concordo que o site do cara do patch do backstreet ruby é a melhor fonte sobre multihead da internet. Este cara realmente merece muitos créditos.
Continue sempre compartilhando seus conhecimentos.. valeu

[10] Comentário enviado por removido em 08/12/2005 - 01:05h

Muito bom...
10!

[11] Comentário enviado por pedro0278 em 12/12/2005 - 10:17h

O problema é prase economico demanda algum custo...
Tentei montar com placas simples e nao funcionou, mesmo elas suportando multiplacas. parece que so suporta chipsets ATI ou Radeon. Uma plaquina simples resolveria a vida de muita gente... alem de ser uma boa alternativa ao LTSP. mas parece que nao é tão simles assim.
alguem ja tentou montar com o novo projeto do C3SL com o Xine modificado?
Quanto ao artigo, está claro, mas nao a ponto de ser facil do ponto de vista do usuário menos experiente.
Está de parabéns pela iniciativa.

[12] Comentário enviado por winchester em 12/12/2005 - 10:53h

Ja montei sim com o Xnest modificado.. eu inclusive tenho trabalhando nessa solucao noite e dia.
Quanto a compatibilidade.. da pra se fazer com qualquer placa suportada pelo servidor X xorg. Ate da pra fazer com placas q tem duas saidas de video. Nao precisa ser chipset ati, radeon nem nvidia.. pode ser qualquer um.
Quando ao Xnest modificado.. eu vou ter novidades em breve

[13] Comentário enviado por thiagoaraujo em 19/12/2005 - 18:00h

o winchester, me tira uma duvida, so quero rodar isso ai no console, se eu usar a configuracao feita no X, posso usar isso dai somente no console? ou preciso fazer algo no console?

[14] Comentário enviado por fabermon em 15/02/2006 - 17:28h

Este artigo esta incompleto....

Falta passar parametros para o kernel na inicializacao, acertar o /proc/bus/video, etc....

[15] Comentário enviado por winchester em 15/02/2006 - 18:19h

Não precisa passar parâmetros do kernel na inicialização.. eu mesmo nunca fiz isso

[16] Comentário enviado por flaviocc em 24/05/2006 - 14:42h

Ola winchester, Parabéns pelo seu artigo.
Eu montei aki um 4head, e estou com 3 probleminhas...
1) Quando eu deslogo da estação principal (Layer0), todas as estações caem.
2) Após algum tempo de inatividade, todas as estações apagam, e só retorna a estação principal.
3) Algumas combinações de teclas ou a inserção de algum dispositivo usb (impressora, pendrive), fazem uma rotação na tela dos outros terminais, deixando a metade esquerda na direita e vice e versa.

vc já passou por algum desses problemas? vc conhece alguma solução para eles?

[17] Comentário enviado por rattus em 16/06/2006 - 11:14h

flaviocc,

o caso é que quando você pluga algum dispositivo usb você altera a ordem dos events em /proc/bus/input/devices ai você pode ter por exemplo o que era um teclado em event0 passa a ser um pen drive, logo a estação que usava o event0 fica sem teclado.
A solução é colocar todos dispositivos usb antes de iniciar o sistema, ai você já tem o devices preenchido.

Ralph Liebessohn

[18] Comentário enviado por stremenx em 13/01/2016 - 00:19h

Boa noite, estou no Linux Educacional e estou enfrentando muito problemas estou pensando em mudar de distribuição sendo que tenho que manter multiterminal, qual seria melhor Debian, Ubuntu, EduUbuntu? Sendo que na verdade irei tentar pois sou leigo.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts