Desejo usar um programa baseado em SDL para exibir gráficos no console, sem precisar fazer logon no console e sem executar o programa como root. Por exemplo, eu quero poder executá-lo via ssh. O SO de destino é raspbian.
Aqui está um pequeno exemplo em python para ilustrar o problema:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Isso funciona (é executado até a conclusão, não gera exceções) se eu o executar no console e via ssh se eu o executar como root.
Eu verifiquei se meu usuário está nos grupos de áudio e vídeo.
Eu usei o strace para ver o que é diferente entre executá-lo no console (que funciona), executá-lo como root via ssh (também funciona) e executá-lo como um usuário comum via ssh (não funciona).
A primeira diferença foi que meu usuário não tinha permissão para acessar / dev / tty0. Criei um novo grupo (tty0), coloquei meu usuário nesse grupo e adicionei uma regra do udev para conceder a esse grupo acesso a / dev / tty0.
A saída strace diverge nesta chamada ioctl - a falha é mostrada aqui; O ioctl retorna 0 quando o programa é executado no console ou no ssh como root:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(Os endereços também diferem, mas isso não é importante.)
Dado que meu programa funciona quando é executado como root, acho que isso significa que tenho um problema de permissões. Como concedo as permissões necessárias ao meu usuário para poder executar este programa sem fazer logon no console (e sem executar como root)?
fonte
Respostas:
Meu objetivo era o mesmo do pôster original, mas com uma diferença: eu precisava executar o aplicativo SDL como um daemon systemd. Minha máquina Linux é Raspberry Pi 3 e o sistema operacional é Raspbian Jessie. Não há teclado ou mouse conectado ao RPi. Eu me conecto a ele usando SSH. Meu aplicativo SDL é realmente um aplicativo baseado em Pygame . Defino pygame / SDL para usar o driver framebuffer "fbcon" por meio da variável de ambiente SDL_VIDEODRIVER. Minha
systemd --version
saída é:Minha versão do pacote pygame é: (
aptitude show python-pygame
):Minha versão do libSDL 1.2 é: (
aptitude show libsdl1.2debian
- no nome do pacote da sua máquina pode ser diferente):A receita
Adicione estas linhas à seção [Serviço] do arquivo .service do seu daemon:
Caso alguém esteja interessado, aqui está o arquivo pyscopefb.service completo que eu usei:
Emita esses comandos no prompt de comando (presumo que o arquivo pyscopefb.service já esteja colocado no local correto onde o systemd pode encontrá-lo):
Isso está funcionando para mim. Observe que não testei se o aplicativo pygame é capaz de receber eventos de teclado e mouse ou não.
Bônus
Eu também tive que resolver outros 2 problemas que também podem ser interessantes
Havia um cursor de texto piscando na parte inferior da tela com gráficos do buffer de moldura. Para resolver isso, adicionei ao meu aplicativo o seguinte código Python que é executado no meu aplicativo antes da inicialização do Pygame / SDL:
Após cerca de 10 minutos, a tela conectada à saída HDMI do Raspberry Pi ficou preta (mas não desligada) e meus gráficos não foram exibidos, embora o Pygame não tenha relatado erros. Isso acabou sendo um recurso de economia de energia. Para desativar isso, adicionei o seguinte código Python, que também é executado antes da inicialização do Pygame / SDL:
fonte
/dev/tty7
e emitir umExecStartPre=/bin/chvt 7
para evitar a coisa do cursor, e ele tem o bônus de não colidir com o agetty, que é executado por padrão em tty1 – tty6.Embora sua pergunta seja um pouco ambígua (o que se entende por console), tentarei responder pelos casos mais comuns: / dev / console, / dev / tty, / dev / fb0 ... adapte isso aos dispositivos que você precisa. Assumimos que o nome de usuário é "myuser".
Veja as permissões do dispositivo (este é o ubuntu 15.04)
Tome uma atitude
/ dev / console
o grupo é "raiz", mas nenhum acesso ao grupo é permitido. Não gosto apenas de adicionar permissões ao grupo raiz, então, em vez disso, crio um grupo e chgrp o arquivo e altero as permissões
/ dev / tty
/ dev / fb0
Você pode usar o comando usermod para adicionar seu usuário a todos os grupos acima também, se essa for sua necessidade.
fonte
Pela minha experiência recente, além de conceder permissão ao seu dispositivo tty (como mencionado anteriormente), você precisa fazer duas coisas adicionais:
setcap cap_sys_tty_config+eip /usr/bin/python3.5
(substitua o caminho do python pelo seu). Obviamente, leve em consideração que você está concedendo esse recurso a qualquer script python.openvt ./your_script.py
fonte