Existe-t-il un moyen de définir des autorisations afin qu'un processus puisse utiliser un périphérique spécifique?

12

Comme vous pouvez le lire, par exemple ici , logind, qui fait partie de systemd, peut définir des autorisations sur certains appareils pour les sessions utilisateur. Il y a aussi une vidéo montrant comment ce type de comportement fonctionne dans la pratique. En bref, si vous commencez, disons, amarok, et que vous jouez une chanson, vous entendrez le son jusqu'à ce que vous passiez à un autre utilisateur ou TTY où vous n'avez que l'invite de connexion. C'est parce que la session active est devenue inactive.

Je sais que vous pouvez simplement ajouter un utilisateur (ou des utilisateurs) à un groupe spécifique, dans ce cas "audio", et cela "résoudra" ce problème, mais je me demande s'il y a une autre solution. Ce que je veux vraiment, c'est définir des autorisations pour le processus afin qu'il puisse utiliser la carte son tout le temps, même lorsque tous les utilisateurs verrouillent leurs sessions.

Est-ce possible? Je demande parce que j'écoute souvent de la musique et que je n'ai pas vraiment besoin que mon moniteur soit allumé la plupart du temps, alors je verrouille simplement l'écran. Mais lorsque je verrouille l'écran, la session active devient inactive et amarok cesse de jouer. Et oui, l'écran doit être verrouillé et non pas simplement éteint.

ÉDITER:

Je ne pense pas que la distribution que j'utilise importe, car s'il y a systemd à bord, ce serait exactement le même problème. Quoi qu'il en soit, j'utilise Debian Sid, mais certains paquets comme systemd, udev (et certaines dépendances) proviennent de la branche expérimentale, et maintenant c'est la version 219-9.

Mikhail Morfikov
la source
1
Peut-être que courir nohup program_x & ; disownpourrait aider. Ou en utilisant l' écran
JustMe
Mais le processus fonctionne très bien. Lorsque je verrouille l'écran, il ne peut plus utiliser la carte son, du moins jusqu'à ce que je déverrouille l'écran.
Mikhail Morfikov
Avez-vous essayé d'utiliser loginctl enable-lingerle compte?
2015
Selon l'arch wiki: The systemd user instance is started after the first login of a user and killed after the last session of the user is closed. Sometimes it may be useful to start it right after boot, and keep the systemd user instance running after the last session closes, for instance to have some user process running without any open session. Lingering is used to that effect.cela ne concerne pas une session utilisateur inactive car elle systemd --userest présente tout le temps.
Mikhail Morfikov
Je laisse régulièrement ma musique jouer sur mon ordinateur portable Fedora 21 pendant que je dors après l'avoir verrouillé. Donc, je ne pense pas que le verrouillage de l'écran de votre ordinateur devrait marquer une session comme inactive juste à cause de systemd.
Bratchley

Réponses:

1

Je ne sais pas quelle version / saveur de Linux vous utilisez, mais il semble que les ACL pour les périphériques audio soient contrôlés par ConsoleKit via les règles udev. Sur mon hôte Debian, je vois quelque chose comme ci-dessous dans /lib/udev/rules.d/70-udev-acl.rules

# sound devices
SUBSYSTEM=="sound", TAG+="udev-acl"

Je jouerais avec cela, donc consolekit n'ajoutera pas de périphériques audio dans sa base de données et ne gèrera pas ACL sur les périphériques audio

VenkatC
la source
J'ai vérifié sur mon bureau en commentant la ligne ci-dessus et après le redémarrage. Plus de gestion ACL pour les périphériques audio et je peux jouer des chansons avec mon écran verrouillé
VenkatC
J'ai mis à jour la question. Maintenant, consolekit est obsolète - vous pouvez en savoir plus à ce sujet ici freedesktop.org/wiki/Software/ConsoleKit , et mon système ne l'utilise pas. Logind le remplace, et il fait essentiellement la même chose. J'ai essayé de commenter la ligne que vous m'avez donnée, et après le redémarrage, mon système ne voit aucune carte son. Même si cela a fonctionné et que cela a très bien fonctionné, je ne pense pas que j'utiliserais cette solution - c'est parce que ce serait la même chose que d'ajouter un utilisateur au groupe audio, du moins je le vois de cette façon.
Mikhail Morfikov
Merci, j'ai regardé les détails de la connexion et oui, cela fait des choses similaires. Cela cherche udev TAG 'uaccess' pour identifier les périphériques à gérer et c'est dans /lib/udev/rules.d/70-uaccess.rules. Tout se résume aux autorisations de base Unix, à mon avis, vous avez ces options 1) supprimer la balise de la carte son via udev, donc logind ne gère pas le périphérique audio et l'écran de verrouillage, en changeant d'utilisateurs - ne changera pas les autorisations des périphériques audio. vous pouvez définir des perms comme vous le souhaitez 2) vous pouvez simplement trouver un binaire amarok et définir son groupe pour qu'il soit audio et le définir, de sorte que son groupe efficace devienne audio
VenkatC
J'ai vérifié la deuxième solution, mais malheureusement, cela ne fonctionne pas. J'ai défini audio grouple binaire amarok, et les autorisations sont les suivantes -rwxr-sr-xQDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave. unnamed app(24333): KUniqueApplication: Cannot find the D-Bus session server: "Unable to autolaunch when setuid"
:,
hmm, il semble que l'exécution de programmes setuid dans l'interface graphique semble bien compliquée et bloquée pour des raisons de sécurité, par exemple: gtk.org/setuid.html . Je ferai plus de recherches et je vous ferai savoir, c'est une bonne chose - apprendre de nouvelles choses!
VenkatC
0

Permettez-moi de dire que je connais peu de données audio sur le bureau Linux. Mea Culpa si cela n'aide pas.

Je définirais les autorisations de groupe du périphérique audio:

chgrp audio <dev-path>
chmod g+rw <dev-path>

au groupe dans lequel amarok s'exécute. Utilisez systemd pour forcer amarok à s'exécuter dans ce groupe. Copiez d'abord le fichier amarok systemd dans / etc / systemd / user / et modifiez-le:

[Service]
Group=audio

(c'est une modification, pas tout le fichier).

Mais il peut y avoir une réponse plus "sophistiquée" en raison des multiples couches qui constituent le système audio Linux actuel.

Otheus
la source
1
Quant à chgrp audio- tous les périphériques sous / dev / snd / ont déjà le audiogroupe, mais cela ne devrait pas avoir d'importance lorsque vous utilisez pulseaudio, et c'est le cas. En ce qui concerne le service de systemd, je l'ai essayé, mais j'ai eu l'erreur suivante:, Failed at step GROUP spawning /usr/bin/amarok: Operation not permitted. amarok.service: main process exited, code=exited, status=216/GROUPet je ne pense pas pouvoir changer ces groupes en tant qu'utilisateur normal. J'ai un autre service qui nécessite un changement de groupe, mais c'est un démon système normal, et cela fonctionne très bien. `
Mikhail Morfikov
Le service Amarok n'est pas démarré par root? Il est possible qu'Amarok ait besoin d'autres autorisations de groupe pour d'autres pupes. Dommage que ce ne soit pas si simple.
Otheus
C'est juste un lecteur de musique. :)
Mikhail Morfikov
0

Que diriez-vous d'exécuter le lecteur dans framebuffer vnc? À la menthe 17 ...

# apt search vfb
p   xvfb                            - Virtual Framebuffer 'fake' X server
p   xvfb:i386                       - Virtual Framebuffer 'fake' X server

Vous utiliseriez VNC pour afficher le bureau comme décrit dans https://en.wikipedia.org/wiki/Xvfb

fume2345
la source
J'ai lu le Usage scenariosdans le lien wiki, et je ne pense pas que cela s'applique ici. Le processus (amarok) a juste besoin de quelques autorisations, et je n'ai aucune idée de comment les définir, si c'est même possible.
Mikhail Morfikov
De quelles autorisations pensez-vous avoir besoin? Je doute fortement que systemd change les autorisations sur les appareils simplement parce que vous changez de tty et si c'est le cas, je ferai de mon mieux pour l'éviter comme la peste à partir de maintenant. Je ne sais pas si cela vous aidera non plus, je ne l'ai pas testé, mais c'est la seule idée que j'ai qui ait une chance de fonctionner. En outre, les utilisateurs ont des autorisations, pas des processus.
fume2345
Lisez simplement le premier lien de la question.
Mikhail Morfikov
0

Pulseaudio est démarré via xdg autostart, qui se trouve sous ~/.config/autostart/. Il y a un fichier appelé pulseaudio.desktop, et dans ce fichier, j'ai changé la execligne par défaut en celle-ci:

Exec=/usr/bin/sg audio -c "pulseaudio -D"

Lorsque je me connecte au système, le processus pulseaudio ressemble à ceci:

$ ps -eo user,group,args | grep pulse
morfik   audio    pulseaudio -D
morfik   audio    /usr/lib/pulseaudio/pulse/gconf-helper

Et maintenant, je peux écouter de la musique tout le temps. Je pense que c'est la solution que je cherchais.

Mikhail Morfikov
la source