Вопрос или проблема
Возможно ли одновременно воспроизводить звук из 2 процессов PulseAudio, один из которых принадлежит пользователю root, а другой – пользователю без root-прав?
Например, взаимное исключение между Audacity, запущенным от имени пользователя root, и VLC, запущенным от имени пользователя без root-прав. Оба приложения используют отдельные процессы PulseAudio.
Когда VLC сначала запускается пользователем без root-прав, то она работает нормально, но затем при попытке запустить Audacity от имени root происходит ошибка в Audacity
“Ошибка открытия звукового устройства
Попробуйте изменить аудио-хост, устройство воспроизведения и частоту дискретизации проекта”
Процесс PulseAudio root-пользователя завладел звуковым выходным устройством здесь.
Наоборот, когда Audacity сначала запускается от имени root-пользователя, то после попытки запуска VLC от имени пользователя без root-прав она отключается, без звукового выхода.
Процесс PulseAudio пользователя без root-прав завладел звуковым выходным устройством здесь.
Другие примеры: когда веб-браузеры с открытым YouTube запускаются от имени root-пользователей, а процессы wine – от обычных пользователей, то также невозможно воспроизводить звук одновременно из обоих приложений.
Я использую эти команды, чтобы узнать, какие процессы используют какие звуковые устройства.
sudo fuser -fv /dev/snd/*
sudo lsof /dev/snd/*
Я пробовал запускать процесс PulseAudio на уровне системы, как описано здесь
https://ubuntuforums.org/showthread.php?t=1417647
Завершаю все экземпляры сервера pulseaudio
pulseaudio -k
Запускаю pulseaudio в системном режиме
pulseaudio --system -D
Предполагается, что это предоставит звук всем пользователям. Но это не совсем работает для меня. Я до сих пор не могу воспроизводить звук одновременно из 2 процессов PulseAudio, один из которых принадлежит root-пользователю, а другой – пользователю без root-прав.
Я думаю, что этот системный режим PulseAudio работает только для нескольких пользователей без root-прав. Вероятно, это отношение root-пользователь/пользователь без root-прав исключено из этого системного режима PulseAudio.
Можно ли сделать какие-либо изменения в Linux, чтобы можно было одновременно воспроизводить звук из процесса PulseAudio, запущенного для root-пользователя, и процесса PulseAudio, запущенного для пользователя без root-прав?
Ответ или решение
Запуск PulseAudio для пользователя root и обычного пользователя одновременно представляет собой интересную задачу с точки зрения управления ресурсами и безопасности в Linux. Для полноценного понимания проблемы и возможных решений важно учесть архитектуру PulseAudio и правила обеспечения безопасности в операционных системах семейства Unix.
Теоретическая основа
PulseAudio — это продвинутый звуковой сервер для систем, основанных на Unix, который обрабатывает аудиопотоки и маршрутизацию между приложениями и физическими устройствами. Работая преимущественно в пространстве пользовательского уровня, он обеспечивает гибкость маршрутизации звука и управление громкостью.
Одной из ключевых особенностей PulseAudio является его многопользовательская и многопоточность, которые позволяют нескольким приложениям получать доступ к звуковым ресурсам одновременно. Однако вызовы возникают, когда речь идет о взаимодействии процессов, запущенных от имени root и обычного пользователя.
По умолчанию, PulseAudio работает сессийно, т.е. его процесс применяется в пределах конкретного пользовательского окружения. Это объясняется политиками безопасности: каждый пользователь должен иметь изолированный доступ к своим звуковым потокам, чтобы предотвратить уязвимости и потенцируемые атаки межпроцессного взаимодействия.
Пример 1: Взаимодействие приложений
В ситуации, описанной в вопросе, когда пользователь запускает VLC от имени обычного пользователя, а затем пытается воспроизвести звук в Audacity от имени root, возникает ошибка. Это связано с тем, что каждый пользователь имеет отдельный экземпляр PulseAudio, который пытается получить эксклюзивный доступ к звуковому устройству. Подобная проблема воспроизводится в обратной последовательности действий, когда сначала запускается приложение Audacity от root, а затем VLC от имени обычного пользователя оказывается заглушенным.
Попытка запуска PulseAudio в системном режиме (pulseaudio --system -D
) может казаться естественным решением, предполагая, что это предоставит единый сервер звука для всех пользователей на системе. Однако на практике запуск PulseAudio в системном режиме не рекомендуется и даже отключен в большинстве дистрибутивов Linux. Основные причины такой политики:
-
Ограничения безопасности: Системный режим предполагает, что все пользователи могут теоретически влиять на качество звука других пользователей, что создаёт риски и неравномерность в управлении правами.
-
Конфликты с архитектурой: PulseAudio изначально не предназначен для использования в системном режиме из-за своей конструкции и подхода к обработке политик доступа.
-
Технические ограничения: В блокировках и управлениях доступом к
/dev/snd/*
через fuser и lsof видно, что устройствами может управлять одновременно лишь ограниченное число процессов PulseAudio, и очевидно, системный демон принимает решения в пользу одного пользователя.
Применение к Задаче
Для достижения цели одновременного воспроизведения звука от root и обычного пользователя необходимо обойти ограничение эксклюзивного удержания акустических устройств. Возможные пути решения:
-
Использование Jack Audio Connection Kit: Jack — это профессиональный звуковой сервер, который предоставляет более гибкие возможности управления соединениями между приложениями. Он позволяет соединить и маршрутизировать аудиопотоки более эффективно между пользователями или процессами.
-
Использование Unix-групп: Настройка подсистемы таким образом, чтобы группы пользователей имели доступ к звуковым устройствам, может помочь, однако потребуется точная настройка прав доступа и контроля, чтобы избежать конфликтов.
-
Использование виртуальных звуковых устройств: Создание виртуальных устройств, предоставленных ALSA, может быть решением, однако для конфигурации и использования может потребоваться значительное количество времени и экспериментов, учитывая специфику приложений и архитектуры операционной системы.
-
Системные настройки и распределители: Использование внешних, более специализированных программных средств для распределения и обработки звуковых потоков может также помочь, однако потребует значительных усилий по внедрению.
Дополнительными преимуществами использования подходов с виртуальными устройствами и Jack является возможность гибкого управления динамическим маршрутом в реальном времени. Это позволяет не только решить проблему параллельного доступа, но и повысить качество управления звуками для профессиональных нужд.
Заключение
Проблема одновременного звуковоспроизведения для процессов от root и обычного пользователя в Linux — это вопрос в большей степени системы управления ресурсами и архитектуры безопасности, установленных в PulseAudio. Несмотря на сложность задачи, существуют методы, включающие использование альтернативных серверов звука и настройку пользовательских прав доступа. Для конкретного использования их преимуществ потребуется детальная конфигурация и настройка системы, основанная на потребностях и условиях вашей среды.