First some interesting fact. Earlier I wrote that performed limited user permissions setup according to reply in the How do I let an SDL app (not running as root) use the console <https://unix.stackexchange.com/questions/58961/how-do-i-let-an-sdl-app-not-running-as-root-use-the-console> StackExchange post. Today I discovered that rights change on /dev/console doesn’t survive reboot. I changed rights back and immediately, without rebooting, tried pygame example again. No visible changes, same “Unable to open console terminal” error for the limited user.
суббота, 8 июля 2017 г., 6:40:08 UTC+3 пользователь Martin Kühne написал: > > > I already changed permissions for the limited user (pi) according to > this instruction: How do I let an SDL app (not running as root) use the > console, but to no avail :( > > I just wanted to suggest you make sure permissions in /dev are > granted, but you appear to have arrived at that conclusion yourself. > Of course now you have to figure out which device is being opened > unsuccessfully. /dev/console only applies to text i/o and not > framebuffer and graphics. /dev/fb0 maybe? Maybe use strace instead? > > cheers! > mar77i > I tried running under strace and got 2 log files: one of running under root and one for running under limited user (pi). Here is the different part: ssh terminal, run as root ssh terminal, run as limited user Comment open("/dev/tty0", O_WRONLY) = 5 ioctl(5, VIDIOC_QUERYCAP or VT_OPENQRY, 0x1e5f89c) = 0 close(5) = 0 open("/dev/tty0", O_WRONLY) = 5 ioctl(5, VIDIOC_QUERYCAP or VT_OPENQRY, 0x776e1c) = 0 close(5) = 0 Visible match, but I don’t know whether ioctl output data was the same, looking at subsequent system calls I suppose it wasn’t. Frankly speaking, I don’t understand what does ioctl call with 2 OR’ed requests mean… According to this article <http://www.linuxjournal.com/article/2783> (it’s 1994!!! But there is no reason not to believe…), ioctl VT_OPENQRY is something like “kernel, give me some number of the free terminal I could use” geteuid32() = 0 geteuid32() = 1000 Mismatch: got user ID we are running behind of open("/dev/vc/2", O_RDWR) = -1 ENOENT (No such file or directory) Mismatch: there was no try to open "/dev/vc/2" under limited user open("/dev/tty2", O_RDWR) = 5 Mismatch: there was no try to open "/dev/tty2" under limited user Looking at this and previous system calls I suppose ioctl VT_OPENQRY returned terminal number 2 for the case when pygame was run under root. For the limited-user case it’s not clear what was the result of that ioctl. open("/dev/tty", O_RDWR) = 6 open("/dev/tty", O_RDWR) = 5 Match: opened current terminal device ioctl(6, TIOCNOTTY) = 0 close(6) = 0 Root version detached itself from the current terminal. As I could find using Google, this is what usually daemon processes started from terminal do. ioctl(5, VT_GETSTATE, 0x7ee7da28) = -1 ENOTTY (Inappropriate ioctl for device) According to article mentioned above, ioctl VT_GETSTATE query is something like “kernel, give me list of terminals available and their use state” ioctl(5, KDGKBMODE, 0x7eaf2078) = 0 ioctl(5, KDGKBMODE, 0x7ee7da28) = -1 ENOTTY (Inappropriate ioctl for device) “Kernel, give me keyboard mode associated with this tty” Limited-user version run this request on /dev/tty and root-user version run on /dev/tty2. ioctl(5, KDGKBENT, 0x7eaf2078) = 0 close(5) = 0 munmap(0x74340000, 3145728) = 0 close(3) = 0 rt_sigaction(SIGINT, NULL, {0x127304, [], SA_RESTORER, 0x76d18180}, 8) = 0 rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0 write(2, "Traceback (most recent call last"..., 35) = 35 Seems previous ioctl result was fatal for limited-user version. Despite large amount of data from strace, it’s really not clear to me what permissions and on what files should I set to allow limited user to run pygame from ssh terminal...