Есть ли способ установить разрешения, чтобы процесс мог использовать определенное устройство?

12

Как вы можете прочитать, например, здесь , logind, являющийся частью systemd, может устанавливать разрешения для некоторых устройств для пользовательских сеансов. Также есть видео, показывающее, как такое поведение работает на практике. Короче говоря, если вы запускаете, скажем, amarok, и вы проигрываете какую-то песню, вы будете слышать звук, пока не переключитесь на другого пользователя или TTY, где у вас есть только приглашение для входа. Это потому, что активный сеанс стал неактивным.

Я знаю, что вы можете просто добавить пользователя (или пользователей) в определенную группу, в данном случае «аудио», и это «решит» эту проблему, но мне интересно, есть ли другое решение. Что я действительно хочу, так это установить некоторые разрешения для процесса, чтобы он мог использовать звуковую карту все время, даже когда все пользователи заблокировали свои сеансы.

Это возможно? Я спрашиваю, потому что я часто слушаю музыку, и мне не нужно, чтобы мой монитор был включен большую часть времени, поэтому я просто блокирую экран. Но когда я блокирую экран, активный сеанс становится неактивным, и amarok перестает играть. И да, экран должен быть заблокирован, а не просто выключен.

РЕДАКТИРОВАТЬ:

Я не думаю, что имеет значение, какой дистрибутив я использую, потому что если на борту есть systemd, это будет точно такая же проблема. В любом случае, я использую sid Debian, но некоторые пакеты, такие как systemd, udev (и некоторые зависимости) из экспериментальной ветки, и теперь это версия 219-9.

Михаил Морфиков
источник
1
Возможно, бег nohup program_x & ; disownможет помочь. Или используя экран
JustMe
Но процесс работает просто отлично. Когда я блокирую экран, он больше не может использовать звуковую карту, по крайней мере, пока я не разблокирую экран.
Михаил Морфиков
Вы пытались использовать loginctl enable-lingerдля учетной записи?
spuk
Согласно архивной вики: 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.это не касается неактивного пользовательского сеанса, потому что systemd --userприсутствует постоянно.
Михаил Морфиков
Я обычно оставляю музыку на своем ноутбуке Fedora 21, пока я сплю, заблокировав ее. Поэтому я не думаю, что блокировка экрана компьютера должна помечать сеанс как неактивный только из-за systemd.
Братчли

Ответы:

1

Я не уверен, какую версию Linux вы используете, но похоже, что списки ACL для звуковых устройств контролируются ConsoleKit через правила udev. На моем хосте Debian я вижу что-то вроде ниже в /lib/udev/rules.d/70-udev-acl.rules

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

Я бы поиграл с этим, так что consolekit не будет добавлять звуковые устройства в свою базу данных и не будет управлять ACL на звуковых устройствах.

VenkatC
источник
Я подтвердил на своем рабочем столе с комментариями выше строки и после перезагрузки. Больше нет управления ACL для звуковых устройств, и я могу проигрывать песни с заблокированным экраном
VenkatC
Я обновил вопрос. Теперь, consolekit - это устаревший материал - вы можете узнать больше об этом здесь freedesktop.org/wiki/Software/ConsoleKit , и моя система его не использует. Logind является заменой для него, и он делает в основном то же самое. Я попытался закомментировать строку, которую вы мне дали, и после перезагрузки моя система не видит звуковых карт. Даже если бы это было так, и это работало просто отлично, я не думаю, что я бы использовал это решение - это потому, что это было бы то же самое, что добавить пользователя в аудиогруппу, по крайней мере, я вижу это таким образом.
Михаил Морфиков
Спасибо, я посмотрел детали logind и да, он делает подобные вещи. Это означает, что UAG TAG 'uaccess' идентифицирует устройства для управления и находится в /lib/udev/rules.d/70-uaccess.rules. Все сводится к базовым разрешениям Unix, на мой взгляд, у вас есть следующие варианты: 1) удалить тег звуковой карты через udev, чтобы logind не управлял аудиоустройством и экраном блокировки, не переключал пользователей - не изменял разрешения звуковых устройств. вы можете установить perms так, как вам нравится 2) вы можете просто найти amarok двоичный файл и установить его группу как аудио, и установить его, чтобы его эффективная группа стала аудио
VenkatC
Я проверил второе решение, но, к сожалению, оно не работает. Я установил audio groupна двоичный файл amarok, и права доступа следующие: -rwxr-sr-xно когда я пытаюсь запустить amarok как обычный пользователь, я получаю эту ошибку:QDBusConnection: 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"
Михаил Морфиков
хм, похоже, что запуск программ setuid в графическом интерфейсе кажется сложным и заблокированным по соображениям безопасности, например: gtk.org/setuid.html . Я исследую больше и дам вам знать, что это хорошая вещь - узнавать новые вещи!
VenkatC
0

Позвольте мне сказать, что я мало знаю об аудио на рабочем столе Linux. Меа Калпа, если это не поможет.

Я бы установил групповые разрешения аудиоустройства:

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

в группу, в которую входит amarok. Используйте systemd, чтобы заставить amarok работать в этой группе. Сначала скопируйте файл systemd amarok в / etc / systemd / user / и измените его:

[Service]
Group=audio

(это модификация, а не весь файл).

Но может быть более «изощренный» ответ из-за множества уровней, которые сегодня представляют собой Linux-аудиосистему.

Otheus
источник
1
Что касается chgrp audio- все устройства в / dev / snd / уже имеют audioгруппу, но это не должно иметь значения, когда вы используете pulseaudio, и это так. Что касается службы systemd, я попробовал это сделать, но получил следующую ошибку: Failed at step GROUP spawning /usr/bin/amarok: Operation not permitted. amarok.service: main process exited, code=exited, status=216/GROUPи не думаю, что смогу изменить эти группы как обычный пользователь. У меня есть другой сервис, который требует смены группы, но это обычный системный демон, и он работает просто отлично. `
Михаил Морфиков
Сервис Amarok не запускается пользователем root? Возможно, Amarok нужны другие групповые разрешения для других куколок. Жаль, что это не так просто.
Отей
Это просто музыкальный плеер. :)
Михаил Морфиков
0

Как насчет запуска плеера в vnc framebuffer? В монетном дворе 17 ...

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

Вы бы использовали VNC для просмотра рабочего стола, как описано в https://en.wikipedia.org/wiki/Xvfb

smokes2345
источник
Я прочитал Usage scenariosссылку в вики, и я не думаю, что что-то из этого применимо здесь. Для процесса (amarok) просто необходимы некоторые разрешения, и я не знаю, как их установить, если это вообще возможно.
Михаил Морфиков
Какие разрешения вы считаете нужными? Я очень сомневаюсь, что systemd меняет разрешения на устройствах только потому, что вы переключаете tty, и если это произойдет, я сделаю все возможное, чтобы избежать этого, как чумы, отныне. Не знаю, поможет ли это и вам, я не проверял, но у меня есть единственная идея, у которой есть шанс работать. Кроме того, пользователи имеют разрешения, а не процессы.
курит 2345
Просто прочитайте первую ссылку в вопросе.
Михаил Морфиков
0

Pulseaudio запускается через автозапуск xdg, который можно найти в ~/.config/autostart/. Есть файл с именем pulseaudio.desktop, и в этом файле я изменил execстроку по умолчанию на эту:

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

Когда я вхожу в систему, процесс pulseaudio выглядит следующим образом:

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

И теперь я могу слушать музыку все время. Я думаю, что это решение, которое я искал.

Михаил Морфиков
источник