Вопрос или проблема
Мне нужна работающая настройка для выполнения следующего:
- Автоматически подключать некоторые Bluetooth аудиоустройства (Bluetooth динамики) при загрузке.
- При запуске системы (или с помощью другого фонового задания cron) автоматически воспроизводить музыку на нескольких аудиоустройствах (включая Bluetooth из пункта 1).
Требование:
Избегать интерактивного входа в эту систему.
У меня есть такая настройка на Ubuntu Desktop 22.04, использующая PulseAudio в качестве системной службы. Настройка достаточно проста:
- Создайте файл юнита для системной службы PulseAudio /etc/systemd/system/pulseaudio.service, чтобы выполнить pulseaudio с флагом “–system”:
[Unit]
Description=PulseAudio системный сервер
[Service]
Type=notify
ExecStart=pulseaudio --daemonize=no --system --realtime --log-target=journal
Restart=on-failure
[Install]
WantedBy=multi-user.target
- Включите этот юнит:
sudo systemctl enable pulseaudio
- Добавьте учетную запись пользователя, которая будет подключать Bluetooth устройства и воспроизводить музыку, в следующие группы:
pulse,pulse-access,audio
sudo usermod -a -G pulse,pulse-access,audio homeadmin
- Сопрячьте систему с Bluetooth аудиоустройством. Это нужно сделать только один раз, поэтому я вошел в систему интерактивно и подключил Bluetooth динамики, используя Настройки.
- Создайте скрипт (/usr/local/bin/connect_audio.sh), который подключит Bluetooth устройство и объединит аудиосинхронизаторы следующим образом:
bluetoothctl connect <mac адрес bluetooth устройства>
pactl load-module module-combine-sink
- Запланируйте выполнение скрипта из пункта 5 и аудиоплеера с помощью cron:
@reboot /usr/local/bin/connect_audio.sh; mpg123 <путь к mp3>
Но мне не удалось перенести эту настройку на Ubuntu 24.04. Она не работает. После установки PulseAudio и настройки его в качестве системной службы на 24.04 (как описано выше) я не смог сделать Bluetooth аудиоустройства доступными для пользователя как системное аудиоустройство без интерактивного входа. Похоже, что в Ubuntu Desktop 24.04 используется PipeWire в качестве аудиоподсистемы, и это мешает.
Что я пытался сделать на 24.04:
- Найти и использовать конфигурацию для запуска PipeWire как системной службы так же, как и PulseAudio.
Не было найдено работающего решения с поддержкой Bluetooth. Похоже, это невозможно и не поддерживается в настоящее время.
Некоторые обсуждения здесь:
https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1610 - Отключить PipeWire (Как удалить PipeWire и вернуться к PulseAudio), установить PulseAudio и затем настроить PulseAudio как системную службу (как описано выше). Похоже, что невозможно полностью отключить PipeWire, потому что он теперь является частью Desktop (gdm).
Пожалуйста, помогите мне создать работающую настройку на Ubuntu Desktop 24.04, используя PipeWire или PulseAudio.
UPD. Я нашел только два работающих варианта, чтобы обойти эту проблему:
- Использовать Ubuntu Server 24.04 вместо Desktop. У него нет gdm (графический интерфейс), и, следовательно, PipeWire не установлен. В этом случае Bluetooth и аудио не работают “из коробки” и требуют дополнительных шагов для настройки.
- Использовать Ubuntu Desktop, но включить автологин для учетной записи пользователя с подключенными Bluetooth динамиками. Это единственный случай, когда Bluetooth динамики начинают быть доступными для пользователя как аудиоустройство в системе. Но в этом случае мое требование не выполнено.
После многочисленных исследований я наконец нашел работающую настройку, которая соответствует моим потребностям и не требует системной настройки аудио.
Настройки зависят от того, какая аудиоподсистема используется в дистрибутиве по умолчанию: PulseAudio (Ubuntu 22.04) или PipeWire (Ubuntu 24.04).
PulseAudio (Ubuntu 22.04)
Не нужно изменять режим PulseAudio с пользовательского на системный. Вместо этого отредактируйте следующие настройки:
- Установите
autospawn = yes
в
/etc/pulse/client.conf
- Включите поддержку задержки входа:
sudo loginctl enable-linger <имя пользователя>
где <имя пользователя>
— это имя учетной записи, от имени которой будет выполняться задача cron.
PulseAudio работает как пользовательская служба по умолчанию, которая завершается после завершения последней сессии. Включите поддержку задержки для пользователя, чтобы исправить это.
Чтобы проверить статус задержки:
sudo loginctl user-status <имя пользователя>
- Добавьте учетную запись пользователя в группы audio,pulse,pulse-access,bluetooth:
sudo usermod -G audio,pulse,pulse-access,bluetooth -a <имя пользователя>
- В скрипте cron (/usr/local/bin/connect_audio.sh) вам нужно начать воспроизводить аудиофайл перед подключением Bluetooth и объединением синков, чтобы запустить процесс PulseAudio:
/usr/bin/mpg321 <путь к mp3> &
sleep 5
bluetoothctl connect <mac адрес bluetooth устройства>
pactl load-module module-combine-sink
PipeWire (Ubuntu 24.04)
- Включите поддержку задержки входа:
sudo loginctl enable-linger <имя пользователя>
где <имя пользователя>
— это имя учетной записи, от имени которой будет выполняться задача cron.
PipeWire работает как пользовательская служба по умолчанию, которая завершается после завершения последней сессии. Включите поддержку задержки для пользователя, чтобы исправить это.
- Добавьте эту учетную запись пользователя в группы audio,bluetooth:
sudo usermod -G audio,bluetooth -a <имя пользователя>
- Создайте файл /etc/wireplumber/bluetooth.lua.d/50-bluez-config.lua со следующим содержимым:
bluez_monitor.properties = {
["with-logind"] = false,
}
sudo mkdir -p /etc/wireplumber/bluetooth.lua.d/
sudo nano /etc/wireplumber/bluetooth.lua.d/50-bluez-config.lua
Когда WirePlumber работает с PipeWire (что обычно и происходит),
WirePlumber запускает “logind-monitor”, который включает Bluetooth при входе
и отключает его при выходе.
Ссылки
https://wiki.archlinux.org/title/bluetooth
https://wiki.archlinux.org/title/Systemd/User#Automatic_start-up_of_systemd_user_instances
Я использую pipewire
/wireplumber
с Bluetooth для моей аудиосистемы. Я прочитал о loginctl enable-linger
в этой статье. Я возился с этим пару часов и никак не мог заставить это работать. Я заметил, что loginctl
— это еще одно изобретение тех же людей, которые принесли нам systemd
… Я подумал, что это и является причиной моей проблемы!
В любом случае – к сути этого ответа: я нашел альтернативное решение, которое очень надежно работает на моей системе. Я использую cmus
в качестве плеера на моей системе (начал с screen -S cmus cmus
); я могу запустить плейлист в cmus
, затем выйти, и звук продолжает играть. Вот что я сделал:
# откройте файл '[email protected]' в вашем редакторе:
$ sudo systemctl edit [email protected]
# В разделе [Service] добавьте следующие две строки:
ExecStart=
ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM
# сохраните изменения и выйдите из редактора...
$ sudo reboot
# после 'reboot', вы можете протестировать:
$ who
pi tty1 1970-01-10 21:45 # <=== это!
pi pts/0 -3386239902218585523 (192.168.1.209)
Ответ или решение
Для настройки системы звука, включая поддержку Bluetooth-устройств, на Ubuntu 24.04, нужно обратить внимание на изменения в архитектуре системы, поскольку в этой версии по умолчанию используется PipeWire, а не PulseAudio, как в предыдущих версиях.
Шаги по настройке системы звука на Ubuntu 24.04 с PipeWire
-
Активация удержания пользователя (lingering):
Чтобы избежать выхода из пользовательской сессии, необходимо включить удержание для нужного пользователя, чего можно достичь следующей командой:
sudo loginctl enable-linger <ваш_пользователь>
Удержание позволяет пользовательским службам работать даже после выхода из системы.
-
Добавление пользователя в группу аудио и Bluetooth:
Обязательно добавьте пользователя, от которого будут запускаться скрипты, в группы
audio
иbluetooth
:sudo usermod -aG audio,bluetooth <ваш_пользователь>
-
Создание конфигурационного файла для WirePlumber:
WirePlumber, являющийся менеджером сессий для PipeWire, может требовать дополнительной настройки для работы с Bluetooth. Создайте файл конфигурации для управления Bluetooth:
sudo mkdir -p /etc/wireplumber/bluetooth.lua.d/ sudo nano /etc/wireplumber/bluetooth.lua.d/50-bluez-config.lua
Вставьте в файл следующий код:
bluez_monitor.properties = { ["with-logind"] = false, }
-
Создание скрипта для автоматического подключения Bluetooth-устройств и воспроизведения музыки:
Скрипт, который будет запускаться при загрузке системы, позволяет подключить Bluetooth-устройство и воспроизводить музыку. Создайте файл
/usr/local/bin/connect_audio.sh
и добавьте в него следующий код:#!/bin/bash # Запустите музыкальный плеер в фоновом режиме /usr/bin/mpg321 <путь_к_mp3> & sleep 5 bluetoothctl connect <MAC_адрес_вашего_устройства> pactl load-module module-combine-sink
Не забудьте сделать скрипт исполняемым:
sudo chmod +x /usr/local/bin/connect_audio.sh
-
Планировщик заданий (cron):
Настройте cron на запуск вашего скрипта при загрузке системы:
crontab -e
И добавьте строку:
@reboot /usr/local/bin/connect_audio.sh
Дополнительные рекомендации
- После каждой настройки необходимо перезагрузить систему, чтобы изменения вступили в силу.
- Убедитесь, что Bluetooth-устройство находится в пределах досягаемости и правильно сопряжено.
- Если вы работаете с графическим интерфейсом, используйте проверки в
bluetoothctl
для управления Bluetooth устройствами, если это необходимо.
Заключение
Следуя этим шагам, вы сможете настроить систему звука на Ubuntu 24.04 с использованием PipeWire для автоматического подключенияBluetooth устройств и воспроизведения музыки без необходимости интерактивного входа в систему. Это обеспечивает более гибкий подход, соответствующий современным требованиям.