SDLベースのプログラムを使用して、コンソールからログオンする必要なく、またルートとしてプログラムを実行せずに、グラフィックをコンソールに表示したい。たとえば、私はそれをssh経由で実行できるようにしたい。ターゲットOSはraspbianです。
問題を説明するためのPythonの短い例を次に示します。
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
コンソールから実行する場合、これは機能します(完了まで実行され、例外はスローされません)。rootとして実行する場合、sshを介して機能します。
ユーザーがオーディオグループとビデオグループに属していることを確認しました。
私はstraceを使用して、コンソールから実行する(動作する)、ssh経由でrootとして実行する(動作する)、ssh経由で通常のユーザーとして実行する(動作しない)の違いを確認しました。
最初の違いは、ユーザーが/ dev / tty0にアクセスする許可を持っていなかったことです。新しいグループ(tty0)を作成し、ユーザーをそのグループに入れ、そのグループに/ dev / tty0へのアクセスを許可するudevルールを追加しました。
strace出力は、このioctl呼び出しで分岐します-失敗はここに示されています。ioctlは、プログラムがコンソールから実行されるか、rootとしてsshから実行されると0を返します。
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(アドレスも異なりますが、それは重要ではありません。)
私のプログラムがrootとして実行されるときに機能することを考えると、これは許可の問題があることを意味すると思います。コンソールにログオンせずに(およびrootとして実行せずに)このプログラムを実行できるようにするために、ユーザーに必要な許可を与えるにはどうすればよいですか?