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.

1 Curtida