Saya ingin menggunakan program berbasis SDL untuk menampilkan grafik di konsol, tanpa harus masuk dari konsol, dan tanpa menjalankan program sebagai root. Sebagai contoh, saya ingin dapat menjalankannya melalui ssh. OS target adalah raspbian.
Berikut adalah contoh singkat dalam python untuk menggambarkan masalah:
import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"
Ini berfungsi (berjalan sampai selesai, tidak membuang pengecualian) jika saya menjalankannya dari konsol, dan bekerja melalui ssh jika saya menjalankannya sebagai root.
Saya telah memeriksa bahwa pengguna saya ada di grup audio dan video.
Saya telah menggunakan strace untuk melihat apa yang berbeda antara menjalankannya dari konsol (yang berfungsi), menjalankannya sebagai root melalui ssh (juga berfungsi), dan menjalankannya sebagai pengguna biasa melalui ssh (tidak berfungsi).
Perbedaan pertama adalah bahwa pengguna saya tidak memiliki izin untuk mengakses / dev / tty0. Saya membuat grup baru (tty0), menempatkan pengguna saya di grup itu, dan menambahkan aturan udev untuk memberikan akses grup itu ke / dev / tty0.
Output strace menyimpang pada panggilan ioctl ini - kegagalan ditampilkan di sini; ioctl mengembalikan 0 ketika program dijalankan dari konsol atau dijalankan dari ssh sebagai root:
open("/dev/tty", O_RDWR) = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8) = -1 EINVAL (Invalid argument)
(Alamatnya juga berbeda, tapi itu tidak penting.)
Mengingat bahwa program saya berfungsi saat dijalankan sebagai root, saya pikir ini berarti saya memiliki masalah izin. Bagaimana cara memberikan izin yang diperlukan kepada pengguna saya untuk dapat menjalankan program ini tanpa masuk di konsol (dan tanpa menjalankan sebagai root)?
sumber
Jawaban:
Tujuan saya sama dengan poster asli, tetapi dengan satu perbedaan: saya perlu menjalankan aplikasi SDL sebagai daemon systemd. Mesin Linux saya adalah Raspberry Pi 3 dan sistem operasinya adalah Raspbian Jessie. Tidak ada keyboard atau mouse yang terhubung ke RPi. Saya terhubung dengannya menggunakan SSH. Aplikasi SDL saya sebenarnya adalah aplikasi berbasis Pygame . Saya mengatur pygame / SDL untuk menggunakan driver framebuffer “fbcon” melalui variabel lingkungan SDL_VIDEODRIVER.
systemd --version
Output saya adalah:Versi paket pygame saya adalah: (
aptitude show python-pygame
):Versi libSDL 1.2 saya adalah: (
aptitude show libsdl1.2debian
- pada nama paket mesin Anda bisa berbeda):Resep
Tambahkan baris ini ke bagian [Layanan] pada file .service daemon Anda:
Jika ada yang tertarik, berikut adalah file pyscopefb.service lengkap yang saya gunakan:
Keluarkan perintah-perintah ini di command prompt (saya berasumsi file pyscopefb.service sudah ditempatkan ke lokasi yang benar di mana systemd dapat menemukannya):
Ini bekerja untuk saya. Harap dicatat saya tidak menguji apakah aplikasi pygame dapat menerima acara keyboard dan mouse atau tidak.
Bonus
Saya juga harus menyelesaikan 2 masalah lain yang mungkin menarik juga
Ada kursor teks berkedip di bagian bawah layar dengan grafis framebuffer. Untuk mengatasi itu, saya menambahkan kode Python berikut yang berjalan di aplikasi saya sebelum inisialisasi Pygame / SDL:
Setelah sekitar 10 menit layar terhubung ke output HDMI Raspberry Pi menjadi hitam (tetapi tidak dimatikan) dan gambar saya tidak ditampilkan, meskipun Pygame melaporkan tidak ada kesalahan. Ini ternyata merupakan fitur hemat daya. Untuk menonaktifkannya, saya menambahkan kode Python berikut yang juga berjalan sebelum inisialisasi Pygame / SDL:
sumber
/dev/tty7
dan mengeluarkan sebuahExecStartPre=/bin/chvt 7
untuk menghindari hal kursor, dan itu memiliki bonus tidak bertabrakan dengan agetty yang berjalan secara default pada tty1-tty6.Meskipun pertanyaan Anda agak ambigu (apa yang dimaksud dengan konsol), saya akan mencoba menjawab untuk kasus yang paling umum: / dev / console, / dev / tty, / dev / fb0 ... sesuaikan ini ke perangkat yang Anda butuhkan. Kami menganggap nama pengguna adalah "pengguna saya".
Lihatlah izin perangkat (ini adalah ubuntu 15.04)
Mengambil tindakan
/ dev / console
grup adalah "root" tetapi tidak ada akses grup yang diizinkan. Saya tidak suka hanya menambahkan izin ke grup root, jadi alih-alih saya membuat grup dan chgrp file dan mengubah izin
/ dev / tty
/ dev / fb0
Anda dapat menggunakan perintah usermod untuk menambahkan pengguna Anda ke semua grup di atas, jika itu adalah kebutuhan Anda.
sumber
Dari pengalaman saya baru-baru ini, selain memberikan izin ke perangkat tty Anda (seperti yang disebutkan sebelumnya), Anda perlu melakukan 2 hal tambahan:
setcap cap_sys_tty_config+eip /usr/bin/python3.5
(ganti jalur dengan python dengan Anda). Tentu saja, pertimbangkan bahwa Anda memberikan kemampuan ini untuk skrip python.openvt ./your_script.py
sumber