LINUX.ORG.RU
решено ФорумTalks

Состояние pulseaudio-5.0

 ,


0

0

Разбирая причины незапуска PA в openwrt, дошел до исходников и теперь совсем в растерянности.

Оно все так криво написано (функция pa_make_secure_dir()) или я удачно косяк ?

Они тупо создают каталог ( не проверяя существование его ) и если ошибка не EEXIST, то abort()

То, что mkdir() мог вернуть EACCESS ( т.к. юзер pulse в /var/run ничего не может создать ) авторы видать не догадывались :(

Пока я не собрал и не залил на роутер strace - хрен бы я понял в чем беда.

★★★★★

Зачем тебе в openwrt пшшш-аудио?

StReLoK ☆☆ ()

Ну так пошли патч в рассылку, чтобы демон писал вменяемое сообщение в лог при таких ошибках. Я добавлю свое ревью.

P.S. А с какого перепугу он создает свой безопасный каталог в /var/run?

AEP ★★★★★ ()
Последнее исправление: AEP (всего исправлений: 1)
Ответ на: комментарий от StReLoK

Радио маршрутизатор

Зачем тебе в openwrt пшшш-аудио?

А почему бы и нет, можно подключить USB'шную звуковуху и слушать радио с маршрутизатора :-]

Camel ★★★★★ ()
Ответ на: комментарий от AEP

И кстати да - с какого действительно перепугу прилетает EPERM? У тебя же системный режим, и pulseaudio запускается от root, и на тот момент привилегии не сброшены.

AEP ★★★★★ ()
Ответ на: комментарий от AEP

Я тоже ревью добавлю.

Автор, давай, сделаешь мир немного лучше.

Adonai ★★★ ()
Ответ на: комментарий от AEP

Получаем EACCES как и написано в «man 2 mkdir» когда парент недоступен по записи.

Есть вопросы и к libc - там же не glibc. Не может это быть косяком в той облегченной libc, что используется в openwrt ? На нормальной системе я таких проблем не получал.

P.S. А с какого перепугу он создает свой безопасный каталог в /var/run?

это путь по-умолчанию. В openwrt оно конфигурируется без указания путей.

vel ★★★★★ ()
Ответ на: Радио маршрутизатор от Camel

Хочется иметь колонки к которым нужно тянуть только провод питания. wifi покрытие уже есть.

tplink mr3020 + usb sound по мотивам хабра

vel ★★★★★ ()
Ответ на: комментарий от vel

Цифропередатчик

Хочется иметь колонки к которым нужно тянуть только провод питания. wifi покрытие уже есть.
tplink mr3020 + usb sound по мотивам хабра

А разве на рынке нет готовых цифровых беспроводных приёмопередатчиков звука?

Camel ★★★★★ ()
Ответ на: комментарий от vel

А не будет проблем с хилым процом на роутере? Качественный ресемплинг и на десктопе-то жрёт нехило, а быстрый алгоритм выдаёт говно.

Axon ★★★★★ ()
Ответ на: комментарий от AEP

Посмотрел таки исходники повнимательнее.

Общий паттерн такой: тот, кто вызывает pa_make_secure_dir(), тот и протоколирует сообщение об ошибке. Единственное исключение - функция pa_make_secure_parent_dir(). По аналогии, протоколировать ошибку в этом случае должен вызывающий pa_make_secure_parent_dir(). Этого не происходит в следующих ситуациях:

1. Внутри pa_make_secure_dir(). Ошибки просто игнорируются и вне зависимости от результата повторно выполняется mkdir. Собственно, довольно разумное поведение, поскольку тогда mkdir вернет «правильную» ошибку.

2. Чтение авторизационной куки в authkey.c. Там тоже расчет на то, что провалится с разумной ошибкой следующий за этим вызов open() или pa_open_cloexec(), и есть протоколирование этой ошибки. Но написано довольно неочевидно и не факт, что правильно.

Правильно ли я понимаю, что вы напоролись на вторую ситуацию?

AEP ★★★★★ ()
Ответ на: Цифропередатчик от Camel

Есть, но там комплект и соответственно цена.

А тут половина уже есть (комп) и есть wifi.

Цена поделки <1500р + опыт конфигуряния openwrt, который меня давно интересовал.

vel ★★★★★ ()
Ответ на: комментарий от AEP

pulseaudio-5.0

--- a/src/pulsecore/core-util.c 2014-06-04 15:49:09.794526584 +0400
+++ b/src/pulsecore/core-util.c 2014-06-04 15:50:36.940542017 +0400
@@ -296,7 +296,7 @@
         goto again;
     }

-    if (r < 0 && errno != EEXIST)
+    if (r < 0 && errno != EEXIST && errno != EACCES)
         return -1;

 #if defined(HAVE_FSTAT) && !defined(OS_IS_WIN32)

решило проблему

vel ★★★★★ ()
Ответ на: комментарий от vel

Это не решение. Тем самым каталог по факту не создается, т.е. ваше «решение» завязано на то, что такая ситуация как-то обработана вызывающим, что справедливо только в одном месте вызова. EACCES тут просто быть не должно. Настоящий баг в том месте, где pa_make_secure_dir вызывается после сброса привилегий.

AEP ★★★★★ ()
Ответ на: комментарий от AEP

Я, кажется, понял, почему патч «работает».

Это создается подкаталог /var/run/pulse. Он нужен для сохранения громкости потоков и для UNIX-domain сокета, по которому приложения передают звук в PulseAudio. Если ни одно приложение не будет пытаться передать звук локально через сокет, а все будут соединяться по TCP/IP (что и имеет место в вашем случае), то, собственно, и создастся впечатление, что после патча все работает.

Повторяю свои слова «Настоящий баг в том месте, где pa_make_secure_dir вызывается после сброса привилегий». По результатам тестов, это баг не в PulseAudio. Тут при запуске pulseaudio --system от root без патча имеем:

# strace -e mkdir,setresuid pulseaudio --system 
setresuid(0, 0, 0)                      = 0
W: [pulseaudio] main.c: Running in system mode, but --disallow-exit not set!
W: [pulseaudio] main.c: Running in system mode, but --disallow-module-loading not set!
N: [pulseaudio] main.c: Running in system mode, forcibly disabling SHM mode!
N: [pulseaudio] main.c: Running in system mode, forcibly disabling exit idle time!
W: [pulseaudio] main.c: Home directory of user 'pulse' is not '/var/run/pulse', ignoring.
mkdir(«/var/run/pulse», 0755)           = 0
mkdir(«/var/lib/pulse», 0700)           = -1 EEXIST (File exists)
setresuid(1001, 1001, 1001)             = 0
mkdir(«/var/run/pulse», 0755)           = -1 EEXIST (File exists)
mkdir(«/var/lib/pulse», 0700)           = -1 EEXIST (File exists)
W: [pulseaudio] main.c: OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.
W: [pulseaudio] main.c: If you do it nonetheless then it's your own fault if things don't work as expected.
W: [pulseaudio] main.c: Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea.
mkdir(«/var/run/pulse», 0755)           = -1 EEXIST (File exists)
W: [pulseaudio] authkey.c: Failed to open cookie file '/var/run/pulse/.config/pulse/cookie': Нет такого файла или каталога
W: [pulseaudio] authkey.c: Failed to load authorization key '/var/run/pulse/.config/pulse/cookie': Нет такого файла или каталога
W: [pulseaudio] authkey.c: Failed to open cookie file '/var/run/pulse/.pulse-cookie': Нет такого файла или каталога
W: [pulseaudio] authkey.c: Failed to load authorization key '/var/run/pulse/.pulse-cookie': Нет такого файла или каталога
mkdir(«/var/run/pulse/.config/pulse», 0755) = -1 ENOENT (No such file or directory)
mkdir(«/var/run/pulse/.config», 0755)   = 0
mkdir(«/var/run/pulse/.config/pulse», 0755) = 0
mkdir(«/var/run/pulse», 0755)           = -1 EEXIST (File exists)
mkdir(«/var/lib/pulse», 0700)           = -1 EEXIST (File exists)
mkdir(«/var/lib/pulse», 0700)           = -1 EEXIST (File exists)
mkdir(«/var/lib/pulse», 0700)           = -1 EEXIST (File exists)
mkdir(«/var/lib/pulse», 0700)           = -1 EEXIST (File exists)

Видно, что первый mkdir вызывается до setresuid. Поэтому, раз у вас это проваливается, делаю вывод, что кто-то запускает pulseaudio --system не от root, что и является багом, подлежащим исправлению в вашей системе.

AEP ★★★★★ ()
Ответ на: комментарий от Quasar

Надо будет посмотреть. Я пока в поисках решений. Особено интересует наличие клиентов под оффтопик.

vel ★★★★★ ()
Ответ на: комментарий от AEP

Запускается оно от рута - в openwrt других учеток почти нет.

интересно, что запуск pulseaudio сделан следующим образом

        [ -d /var/run/pulse ] || {
                mkdir -m 0755 -p /var/run/pulse
                chmod 0750 /var/run/pulse
                chown pulse:pulse /var/run/pulse
        }
        [ -d /var/lib/pulse ] || {
                mkdir -m 0755 -p /var/lib/pulse
                chmod 0750 /var/lib/pulse
                chown pulse:pulse /var/lib/pulse
        }

        chown root:pulse /dev/snd/* /dev/mixer /dev/dsp
        chmod 664 /dev/snd/* /dev/mixer /dev/dsp

        procd_open_instance
        procd_set_param command $PROG --system --disallow-exit --disallow-module-loading --disab
le-shm --exit-idle-time=-1 --realtime=false
        procd_close_instance

vel ★★★★★ ()
Ответ на: комментарий от vel

А можно посмотреть вывод?

strace -e mkdir,setresuid pulseaudio --system --disallow-exit --disallow-module-loading --disable-shm --exit-idle-time=-1 --realtime=false
AEP ★★★★★ ()
Ответ на: комментарий от AEP

Видимо это был какой-то глюк :( Сейчас воспроизвести его не удается.

root@OpenWrt:~# strace -e mkdir,setresuid pulseaudio --system --disallow-exit --disallow-module-
loading --disable-shm --exit-idle-time=-1 --realtime=false 
mkdir("/var/run/pulse", 0755)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
setresuid(-1, 51, -1)                   = 0
W: [pulseaudio] caps.c: Normally all extra capabilities would be dropped now, but that's impossible because PulseAudio was built without capabilities support.
mkdir("/var/run/pulse", 0755)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
W: [pulseaudio] main.c: OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.
W: [pulseaudio] main.c: If you do it nonetheless then it's your own fault if things don't work as expected.
W: [pulseaudio] main.c: Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea.
mkdir("/var/run/pulse", 0755)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
W: [pulseaudio] module.c: module-detect is deprecated: Please use module-udev-detect instead of module-detect!
mkdir("/var/run/pulse", 0755)           = -1 EEXIST (File exists)
mkdir("/tmp/.esd", 0755)                = 0
mkdir("/var/run/pulse", 0755)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
mkdir("/var/lib/pulse", 0700)           = -1 EEXIST (File exists)
^CProcess 1145 detached
конфигурялось оно так
        --with-system-user=pulse \
        --with-system-group=pulse \
        --with-access-group=audio \
        --with-database=simple \
        --enable-alsa \
        --disable-hal \
        --disable-gconf \
        --disable-nls \
        --disable-manpages \
        --disable-oss-output \
        --disable-oss-wrapper \
        --disable-samplerate \
        --disable-per-user-esound-socket \
        --disable-solaris \
        --disable-gtk2 \
        --disable-glib2 \
        --disable-jack \
        --disable-asyncns \
        --disable-lirc \
        --disable-bluez \
        --disable-udev \
        --without-fftw --without-caps

Я за это время успел собрать все заново и все переустановил. Проблема исчезла :(

Выяснилось, что основная проблема была в usb-sound. Заменил адаптера на другой и все сразу заработало! Странно, но aplay работал без проблем со всеми usb-sound.

vel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.