Как предотвратить отключение звука при смене пользователя?

Предполагая, что timeout(1) доступен, команда shell

timeout 5s whateverthatcommandis; sleep 99

должна убить программу через пять секунд (предполагая, что программа хорошо себя ведет...), а затем sleep на любое количество xx секунд. Затем эти команды могут быть завернуты в какой-нибудь цикл по мере необходимости; при условии наличия seq (на BSD вместо этого можно использовать jot) типичный цикл может выглядеть так:

for n in `seq 1 1000`; do timeout 5s whateverthatcommandis; sleep 99; done

Цикл shell, кстати, может быть несколько более разборчивым в ZSH:

repeat 1000 { timeout 5s whateverthatcommandis; sleep 99 }
5
29.07.2017, 18:08
3 ответа

Решение

  1. Добавьте всех пользователей, которые должны иметь возможность воспроизведения, в импульсный -доступ группу

    # adduser problemofficer pulse-access

  2. Создайте /etc/systemd/system/pulseaudio.service со следующим содержимым:

    [Service]
    Type=simple
    PIDFile=/var/run/pulse/pid
    ExecStart=/usr/bin/pulseaudio --daemonize=yes --system=yes --disallow-module-loading=yes --disallow-exit=yes
    
    [Install]
    WantedBy=multi-user.target
    
  3. Включите эту новую службу systemd, чтобы она запускалась при загрузке:# systemctl enable pulseaudio

  4. Имейте в виду, что эта конфигурация

    • менее безопасный (. другие пользователи могут слушать ваш микрофон)
    • вывод звука больше не будет автоматически переключаться на наушники и обратно и
    • может помешать работе Bluetooth. Также см. раздел «Предостережение» ниже.
  5. Перезагрузка

Причина

Причина, по которой звук отключается, заключается в том, что Pulseaudio запускается при каждом входе в систему с правами этого пользователя, а система¹ не позволяет другим пользователям прослушивать аудио других пользователей.

Предыстория решения

Импульсный звук

Чтобы решить эту проблему, Pulseaudio необходимо запустить с привилегиями root, чтобы он работал как общесистемный демон, доступный только для всех пользователей. Все будут подключаться к этому экземпляру и смогут воспроизводить и слушать все, что воспроизводят или записывают другие пользователи.

Pulseaudio на самом деле не будет работать от имени пользователя root все время, а эти привилегии и предполагают пользователя pulse .

Изman pulseaudio

User pulse, group pulse: if PulseAudio is running as a system daemon (see --system above) and is started as root the daemon will drop privileges and become a normal user process using this user and group. If PulseAudio is running as a user daemon this user and group has no meaning.

Обратите внимание, что «пользовательский демон» — это не то же самое, что «системный демон». Первый — это то, как Pulseaudio работал раньше, второй — как он будет работать, если будут применены изменения.

Чтобы иметь возможность подключиться к системной службе Pulseaudio, вы должны быть членом группы доступа pulse -.

Снова изman pulseaudio

Group pulse-access: if PulseAudio is running as a system daemon (see --system above) access is granted to members of this group when they connect via AF_UNIX sockets. If PulseAudio is running as a user daemon this group has no meaning.

Системная служба

В качестве быстрого обходного пути можно было бы просто убить все экземпляры «пользовательского демона» Pulseaudio, а затем запустить /usr/bin/pulseaudio --system=yes. Это запустит Pulseaudio без превращения в демона и более небезопасным способом, но может быть полезно для быстрого доказательства -проверки концепции -.

Чтобы сделать это постоянным и чтобы демон Pulseaudio запускался автоматически при запуске, его необходимо добавить в качестве службы systemd. Для этого предназначен файл /etc/systemd/system/pulseaudio.service .

Pulseaudio не запустит пользовательский демон², если он уже нашел системный демон, поэтому это решение работает.

Внимание

Официальная документация Pulseaudio не рекомендует использовать Pulseaudio в качестве системного демона . Некоторые из упомянутых проблем:

  • ...one especially problematic thing from security point of view is module loading. Anyone who has access can load and unload modules. Module loading can be disabled, but then bluetooth and alsa hotplug functionality doesn't work...

(Это означает, что при подключении -наушников звук не переключается автоматически с динамиков на наушники. Обратное также верно, когда вы снимаете наушники. Оба должны быть сделаны вручную.)

  • ...much higher memory usage and CPU load in system mode...

    (Лично я изменений в нагрузке не заметил.)

  • ...all users that have access to the server can sniff into each others audio streams, listen to their mikes, and so on...

  • ...you also lose a lot of further functionality, like the bridging to jack...

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

Примечание к ответу карпи:Ни один из шагов, описанных в его ответе, не был необходим для этого решения.

Ресурсы


¹ Если кто-то может объяснить это подробно, я был бы очень благодарен.

² Успение [требуется ссылка]

6
27.01.2020, 20:39

Изhttps://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/213149:

Это пульсаудио "функция".

Редактировать/etc/default/pulseaudio

Изменить PULSEAUDIO_SYSTEM_START=0кPULSEAUDIO_SYSTEM_START=1

Таким образом, pulseaudio запускается в системном режиме.

Из файла /etc/default/pulseaudio:

# Start the PulseAudio sound server in system mode.
# (enables the pulseaudio init script)
# System mode is not the recommended way to run PulseAudio as it has some
# limitations (such as no shared memory access) and could potentially allow
# users to disconnect or redirect each others audio streams. The
# recommend way to run PulseAudio is as a per-session daemon. For GNOME
# sessions you can install pulseaudio-esound-compat and GNOME will
# automatically start PulseAudio on login (if ESD is enabled in
# System->Preferences->Sound). For other sessions, you can simply start
# PulseAudio with "pulseaudio --daemonize".
# 0 = don't start, 1 = start

Самый простой способ применить ваше изменение — запустить pulseaudio с параметром --daemonizeи перезапустить систему.

Другой вариант — полностью удалить pulseaudio и использовать вместо него alsa, лично мой предпочтительный вариант...

1
27.01.2020, 20:39

Я использую Arch Linux с systemd, и у меня была точно такая же проблема. Моя цель состояла в том, чтобы просто переключиться на другого пользователя (с помощью Ctrl -Alt -Fx или с помощью диспетчера отображения )и сохранить мой звук включенным.

Наконец-то я заработал, не играя с системным режимом (опасным, неподдерживаемым )или PolicyKit (ничего об этом не знаю ).

Шаги:

  1. Добавьте пользователя $USER, чей PulseAudio должен продолжать воспроизводиться, в группу «аудио»:usermod -aG audio $USER
  2. Включить задержку для пользователя, чтобы PulseAudio запускался без входа в систему :loginctl enable-linger $USER

Если это сработает, вы можете опционально поделиться PA этого пользователя с другими пользователями в сети, добавив что-нибудь в ~/.config/pulse/default.pa, например:

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24

Для "клиентских пользователей" просто добавьте к~/.config/pulse/client.conf:

default-server = 127.0.0.1
1
27.01.2020, 20:39

Теги

Похожие вопросы