Multiseat com uma GPU só no Linux (difícil mas possível)

Vi que numa versão antiga do Xephyr (aplicativo que permite rodar um Xserver dentro do outro), era possível fazer multiseat com uma GPU só. Não era bem estável e não tinha aceleração de GPU (ao menos de modo fácil). Curioso, fui baixar a tal versão antiga e acabou dando certo (rodei dois Minecrafts juntos). A jornada é longa, no entanto.

1 - Xephyrassic Park

A última versão do Xephyr antes de tirarem o suporte multiseat (que seria francamente o único propósito de ter um Xephyr) foi a 1.19. Então vamos atrás dela.

A maneira mais fácil que eu achei foi pegar o arquivo do Xephyr para Ubuntu 18.04 (2:1.19.6-1ubuntu4.5 : xserver-xephyr : amd64 : Bionic (18.04) : Ubuntu). NÃO instale, ainda que esteja no Ubuntu real.

Abra num extrator de arquivos, abra o data.tar.xz, pegue o usr/bin/Xephyr dentro e coloque na pasta que desejar.

Abra um terminal e saia tentando rodar o Xephyr que você extrair. Cada vez que ele reclamar de uma biblioteca faltando, instale ela pelo gerenciador de pacotes (use pacman -F, apt-file, etc. para buscar os pacotes correspondentes). Certeza que tem, porque eu estou no Arch Linux, 100% atualizado duro de aturar e consegui rodar esse Xephyr antigo.

Criando uma nova cadeira

Para separar o mouse e o teclado do segundo usuário, é necessário usar o prompt de comando.

Liste todos os dispositivos reconhecidos pelo terminal atual com loginctl seat-status
A saída vai ser como a seguinte:

seat0
        Sessions: *3 1
         Devices:
                  ├─/sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3
                  │ input:input3 "Power Button"
                  ├─/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input4
                  │ input:input4 "Video Bus"
                  ├─/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
                  │ input:input1 "Power Button"
                  ├─/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input0
                  │ input:input0 "Lid Switch"
é bem longo...
├─/sys/devices/pci0000:00/0000:00:14.0/usb1
                  │ usb:usb1
                  │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1
                  │ │ usb:1-1
                  │ │ ├─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:046D:C534.0007/0003:046D:4022.0009/input/input46
                  │ │ │ input:input46 "Logitech Wireless Mouse PID:4022"
                  │ │ └─/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:046D:C534.0007/0003:046D:4023.0008/input/input45
                  │ │   input:input45 "Logitech Wireless Keyboard PID:4023"

Nessa saída, busque o mouse e o teclado que você quer dar à segunda pessoa. No meu caso são os Logitech.

Em seguida, remova esses dispositivos do seu terminal e dê para um hipótetico segundo terminal com um comando do modelo seguinte

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:046D:C534.0007/0003:046D:4022.0009/input/input46 /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.1/0003:046D:C534.0007/0003:046D:4023.0008/input/input45

Basicamente, loginctl attach seat1 <copie e cole os /sys dos dispositivos da segunda pessoa>

Depois disso, você não vai conseguir mais usar o mouse que você deu na sessão atual.

Pode repetir esse procedimento com outros terminais, seat2, seat3, dependendo da potência do PC e quantas pessoas forem trabalhar nele. Só não repita os nomes.

Hora da verdade

Rode o Xephyr baixado com o seguinte comando (use o Xephyr baixado como parte inicial do comando)

~/Downloads/Xephyr -seat seat1 :1 & DISPLAY=:1 algumprogramapratestar

(troque algumprogramapratestar por, bem, algum programa pra testar)

Caso tenha dado certo, vai abrir janela do Xephyr, que tem dentro de si um cursor independente do do resto do sistema. Eu testei com VLC:

Você não vai conseguir clicar em nada na janela do Xephyr com o mouse principal, apenas com o da segunda pessoa.

Agora só sair abrindo outros terminais com comandos no modelo

DISPLAY=:1 programa

Para abrir coisas na janela do Xephyr.

Com mais pessoas, os modelos passam a ser:

~/Downloads/Xephyr -seat seat2 :2
DISPLAY=:2 programa

(basicamente aumente o número do seat e o que vem depois dos dois pointos).

Multiplayer Mod

Devido a uma limitação do X Server que felizmente será superada com o Wayland, apenas um terminal consegue usar a GPU de cada vez. Esse é um dos motivos para a dificuldade de multiseat com uma GPU só (além do pessoal do Xorg ter removido essa função super útil de isolar mouse e teclado). Então todos os comandos dentro do Xephyr rodam apenas na CPU.

Isso não é problema se apenas coisas “Office” estiverem sendo usadas, mas vira um problemão caso queira jogar split-screen. Felizmente há uma maneira de piratear a GPU do terminal principal para dentro do secundário: VirtualGL. Isso foi feito para VNCs em computadores ruins poderem acessar uma placa gráfica monstra de um servidor e assim ficar mais rápida a execução, mas o usaremos aqui para contornar essa limitação.

A instalação do VirtualGL varia de distribuição para distribuição, e é um pacote meio raro. No Manjaro e no Arch tem: sudo pacman -S virtualgl lib32-virtualgl

De qualquer jeito, depois de instalar, as etapas são:

  1. sudo vglserver_config (dê Y em tudo para seguir os padrões)
  2. sudo gpasswd -a $USER virtualgl (se dê permissão para usar VirtualGL)
  3. Deslogue e logue/reinicie
  4. Abra o Xephyr, mas atento ao seguinte detalhe:

Quando algum programa quiser a GPU, rode ele no seguinte modo:
DISPLAY=:1 vglrun programa

Exemplo com o Dolphin Emulator abaixo:

Limitações:

  • Necessário usar um Xephyr velho que pode parar de funcionar a qualquer momento.
  • Sem Vulkan, apenas OpenGL (e com gambiarras!)¹
    ¹O Primus que o Bumblebee usa pode ser promissor para essa aplicação, mas eu teria que passar um tempo compilando eles sem suporte a Nvidia e ainda ensinar aqui como fazer.

Quero desmanchar todos os seats/terminais!

Comando loginctl flush-devices

A configuração de touchpad os laptops pode sair errada, mas nada que deslogar e logar não resolva.

Script autoconfigurante tipo os das saídas virtuais?

Ainda não.

3 curtidas

Oi, @Capezotte , tudo jóia?
Boa noite!

Cara, desde o dia que você me ajudou no tópico 2 Jogos ao Mesmo Tempo no Linux que estou tentando fazer essa magia negra funcionar. Tenho tentado desde então “evoluir” minha experiência no Linux antes, mas acho que não sou eu kk

Não sei se é por eu usar o Ubuntu, mas o Xephyr simplesmente não consegue reconhecer os drivers do dispositivo que eu anexo a ele. Com a versão que você indica, o Xephyr abre, mas sem o VLC dentro.
Tentei antes no Pop_OS! 21.04 e, sem sucesso, fui pro Ubuntu 20.04 pra ver se tinha algo a ver com estabilidade do sistema, mas dá sempre essa mensagem de erro aqui:

Erro
kuririnssj3@LinuxPC:~$ /media/kuririnssj3/Backup/Jogos/_LinuxSplitScreen/Xephyr -seat seat1 :1 & DISPLAY=:1 vlc
[1] 4492
VLC media player 3.0.9.2 Vetinari (revision 3.0.9.2-0-gd4c1aefe4d)
[00005606f24ea890] main interface error: no suitable interface module
[00005606f23fe5b0] main libvlc error: interface "globalhotkeys,none" initialization failed
[00005606f23fe5b0] main libvlc: Executando o VLC com a interface padrão. Use 'cvlc' para usar o VLC sem interface.
[00005606f24ea890] skins2 interface error: cannot initialize OSFactory
[00005606f2496f10] main playlist: playlist is empty
[00005606f24ea890] [cli] lua interface: Listening on host "*console".
VLC media player 3.0.9.2 Vetinari
Command Line Interface initialized. Type `help' for help.
> Kbd option key (_source) of value (server/udev) not assigned!
Kbd option key (major) of value (13) not assigned!
Kbd option key (minor) of value (90) not assigned!
Kbd option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input31/event26) not assigned!
Kbd option key (GrabDevice) of value (on) not assigned!
Failed to open evdev device /dev/input/event26
couldn't add or enable keyboard "PG-9028 Keyboard" (/dev/input/event26)
unrecognised device identifier: /dev/input/event27
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (92) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/event28) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
Failed to open evdev device /dev/input/event28
couldn't add or enable pointer "PG-9028 Mouse" (/dev/input/event28)
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (34) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/mouse2) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/mouse2)
unrecognised device identifier: /dev/input/event29
unrecognised device identifier: /dev/input/js0
[KdPointerProc] Failed to find pointer for device 7!

Já tentei com sudo e dá a mesma coisa.
Quando tentei com a versão mais atualizada, o Xephyr até chegou abrir com o VLC dentro, mas o cursor de dentro não mexe de jeito nenhum, e a mensagem de erro muda um pouco… Mas a base é a mesma, olha só:

Erro 2
kuririnssj3@LinuxPC:~$ Xephyr -seat seat1 :1 & DISPLAY=:1 vlc
[1] 4539
VLC media player 3.0.9.2 Vetinari (revision 3.0.9.2-0-gd4c1aefe4d)
Kbd option key (_source) of value (server/udev) not assigned!
Kbd option key (major) of value (13) not assigned!
Kbd option key (minor) of value (90) not assigned!
Kbd option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input31/event26) not assigned!
Kbd option key (GrabDevice) of value (on) not assigned!
couldn't find driver for keyboard device "PG-9028 Keyboard" (/dev/input/event26)
unrecognised device identifier: /dev/input/event27
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (92) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/event28) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/event28)
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (34) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/mouse2) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/mouse2)
unrecognised device identifier: /dev/input/event29
unrecognised device identifier: /dev/input/js0
[0000559af0e215b0] main libvlc: Executando o VLC com a interface padrão. Use 'cvlc' para usar o VLC sem interface.
Kbd option key (_source) of value (server/udev) not assigned!
Kbd option key (major) of value (13) not assigned!
Kbd option key (minor) of value (90) not assigned!
Kbd option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input31/event26) not assigned!
Kbd option key (GrabDevice) of value (on) not assigned!
couldn't find driver for keyboard device "PG-9028 Keyboard" (/dev/input/event26)
unrecognised device identifier: /dev/input/event27
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (92) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/event28) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/event28)
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (34) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/mouse2) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/mouse2)
unrecognised device identifier: /dev/input/event29
unrecognised device identifier: /dev/input/js0
Kbd option key (_source) of value (server/udev) not assigned!
Kbd option key (major) of value (13) not assigned!
Kbd option key (minor) of value (90) not assigned!
Kbd option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input31/event26) not assigned!
Kbd option key (GrabDevice) of value (on) not assigned!
couldn't find driver for keyboard device "PG-9028 Keyboard" (/dev/input/event26)
unrecognised device identifier: /dev/input/event27
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (92) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/event28) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/event28)
Pointer option key (_source) of value (server/udev) not assigned!
Pointer option key (major) of value (13) not assigned!
Pointer option key (minor) of value (34) not assigned!
Pointer option key (config_info) of value (udev:/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/bluetooth/hci0/hci0:21/0005:1949:0402.0007/input/input33/mouse2) not assigned!
Pointer option key (GrabDevice) of value (on) not assigned!
couldn't find driver for pointer device "PG-9028 Mouse" (/dev/input/mouse2)
unrecognised device identifier: /dev/input/event29
unrecognised device identifier: /dev/input/js0
[0000559af0eb9f10] main playlist: playlist is empty

Já tentei com outros mouses, teclados, controle bluetooth… O problema é sempre o mesmo. :confounded: :face_with_head_bandage:

A única forma de eu conseguir clicar dentro dele é com o comando sem os -seat seat1, mas aí não faria sentido mais kk

Dá pra ver neste fórum aqui que ninguém lá fora tá sabendo contornar esse BO…
Você tem alguma dica?

Desculpa mesmo reviver seu tópico :woozy_face:

Faz tempo desde que eu tentei isso pela última vez, mas acho que uma coisa que você pode tentar fazer para lidar com a questão das permissões (que parece ser o problema aí), é se adicionar ao grupo input (usermod -aG input seu_usuario_aqui), deslogar, logar de novo e tentar novamente.

1 curtida

Caraaaaaaaaaa, deu certo!!
MUITO obrigado!!! o/

Minha esposa tá agradecendo demais aqui também…
Ela tá grávida de quase 5 meses e disse que quer mudar o nome do bebê pelo seu kkkk
(Parece fanfic mas é verdade kkkk)

Valew mesmo, @Capezotte!!!