Несколько звуковых карт в системе. Ядро в sys им каждый раз при загрузки присваивает разные номера: input{N}.Хочу чтобы номера были всегда теже.
> Несколько звуковых карт в системе. Ядро в sys им каждый раз при
> загрузки присваивает разные номера: input{N}.
> Хочу чтобы номера были всегда теже.man udev
> man udevЯ гляну и отпишу, но кажется нето... В /dev все sym линки eudev сделал как надо.
Проблема в самом ядре Linux. В зависимости от того какая звуковая карта первой появляется в dmseg зависит нумерация ее микрофона в /sys.
udev/eudev они в /dev/ работают и в /sys ничего не меняют.
/sys это только ядро и оно присваивает номера устройствам ввода в порядке инициализации звуковой карты:
/sys/*/input/input{N}
> нетобруто?
> А синхронность
а что синхронность?
Это ИИ спелчекера вредит.Асинхронность инициализации звуковых при загрузки ядра Линукс.
scsi драйвер имеет опцию sync/async может и драйвер звуковой карты ее подхватит?
> Несколько звуковых карт в системе.Linux, наверное, да?
> Ядро в sys им каждый раз при загрузки присваивает разные номера: input{N}.
> Хочу чтобы номера были всегда теже.Можно, например, жёстко назначить индексы в конфигурации модулей ядра:
https://wiki.debian.org/ALSA#Troubleshooting
https://alsa.opensrc.org/MultipleCards#Reordering_the_driver...
Спасибоoptions snd-usb-audio index=1,2 vid=0x0ccd,0x0d8c pid=0x0028,0x000c
Может поможет. У меня все звуковые в само ядро Linux вкомпилены. И в рандомном порядке определяются ядром еще до загрузки инитрд. Посмотрю, отпишу.
> У меня все звуковые в само ядро Linux вкомпилены. И
> в рандомном порядке определяются ядром еще до загрузки инитрд. Посмотрю, отпишу.Драйверам вкомпиленным в ядро, в принципе, по фигу что там в конфигурации модулей написанно.
Хотя должна быть возможность задать в параметрах ядра, при запуске, то-же самое что и в параметрах модуля.Рекомендую пересмотреть решение вкомпиливать всё в ядро. Возможно, контроль над порядком определения устройств окажется решающим фактором в пользу использования модулей. Ну, и апгречдить/разворачивать систему проще.
> Рекомендую пересмотреть решение вкомпиливать всё в ядро. Возможно, контроль над порядком
> определения устройств окажется решающим фактором в пользу использования модулей. Ну, и
> апгречдить/разворачивать систему проще.Монолитное ядро, без поддержки модулей, обязательное требование.
Попробую через параметры загрузки ядра разрулить.
Пробую параметры загрузки ядра:snd-usb-audio.index=1,2 snd-usb-audio.vid=0x0ccd,0x0d8c snd-usb-audio.pid=0x0028,0x000c
У меня на одном драйвере 3 звуковухи! Причем 2 одинаковые таки дальше продолжают инициализировать асинхронно.
> Монолитное ядро, без поддержки модулей, обязательное требование.
> У меня на одном драйвере 3 звуковухи! Причем 2 одинаковые таки дальше
> продолжают инициализировать асинхронно.У вас семь красных линий получается, сочувствую.
Надо что-то делать с требованиями. Или приступать к грязным и странным методам: скриптом предёргивать порты в определённом порядке, использовать в качестве путей к устройствам собсвенную систему символических ссылок в место системных, докупить звуковых карт поразнообразнее, ставить в разрыв кабеля USB устройство задержки инициализации, забашлить ядерному хакеру (kernel hacker) чтоб починил...
Как проиндексировать устройства «input»? Список устройств можно просмотреть выполнив команду:dmesg |grep -E ‘^input’
Ядро при каждой загрузки устройства «input» определяет в асинхронным порядке и присваивает им рандомный номер. К input устройствам относятся микрофоны на звуковых картах.
> Как проиндексировать устройства «input»?
> Список устройств можно просмотретьВы тот-же Аноним что и топикстартер?
Задача, как я понял, не в том чтобы помотреть какие индексы каким устройствам присвоены, а в том чтобы заставить их индексироваться каждый раз в одинаковом порядке. Задача со звёздочкой, т.к. устройства одной и той-же модели, монолитное ядро без поддержки модулей и т.д.> выполнив команду:
> dmesg |grep -E ‘^input’Тогда уж
dmesg | grep '] input'
или
dmesg -t | grep '^input'
По дефолту в начале строки идёт таймстамп. У меня, по крайней мере.
> Вы тот-же Аноним что и топикстартер?Это не принципиально.
> Задача, как я понял, не в том чтобы помотреть какие индексы каким устройствам присвоены, а в том чтобы заставить их индексироваться каждый раз в одинаковом порядке.
Да, задача заставить ядро Linux индексировать устройства input всегда в одном и том же порядке.
> Задача со звёздочкой, т.к. устройства одной и той-же модели, монолитное ядро без поддержки модулей и т.д.
Давай сначала решим в упрощенном варианте: как ядру Linux указать индексы устройств "input", когда все устройства разные, а ядро поддерживает модули.
>> выполнив команду:
>> dmesg |grep -E ‘^input’
> Тогда уж
> dmesg | grep '] input'
> или
> dmesg -t | grep '^input'
> По дефолту в начале строки идёт таймстамп. У меня, по крайней мере.Отметте, что в списке не только устройства микрофона от звуковых карт, но и кнопки питания, клавиатуры, мыши и все надо индексировать в одном и том же порядке.
>> Вы тот-же Аноним что и топикстартер?
> Это не принципиально.Не соглашусь. С топикстартером мы вопрос, вроде, исчерпали. К сожалению, без конкретных выводов. На второй круг я идти не готов.
Если вы тот-же самый, то можете сказать: "мы тут среди меня обсудили, и решили что монолитное ядро это стильно, но проблему как-то решать всё-же надо, и готовы вернуться к дефолтам нашего любимого дистрибутива".
А если вы другой, и у вас условия другие, то имет смысл их озвучить. И расказать что именно не получилось из того что было предложено, раз уж вы пытаетесь украсть нить.>> Задача со звёздочкой, т.к. устройства одной и той-же модели, монолитное ядро без поддержки модулей и т.д.
> Давай сначала решим в упрощенном варианте: как ядру Linux указать индексы устройств
> "input", когда все устройства разные, а ядро поддерживает модули.Конечно давай в упрощенном варианте. Я уже предложил
https://wiki.debian.org/ALSA#Troubleshooting
https://alsa.opensrc.org/MultipleCards#Reordering_the_driver...>>> выполнив команду:
>>> dmesg |grep -E ‘^input’
>> Тогда уж
>> ...
> Отметте, что в списке не только устройства микрофона от звуковых карт, но
> и кнопки питания, клавиатуры, мыши и все надо индексировать в одном
> и том же порядке.Аноним (11), это вам.
> Конечно давай в упрощенном варианте. Я уже предложил
> https://wiki.debian.org/ALSA#Troubleshooting
> https://alsa.opensrc.org/MultipleCards#Reordering_the_driver...Спасибо! Обе ссылки, особо вторая, решают проблему с выводом звука.
>>>> выполнив команду:
>>>> dmesg |grep -E ‘^input’
>>> Тогда уж
>>> ...
>> Отметте, что в списке не только устройства микрофона от звуковых карт, но
>> и кнопки питания, клавиатуры, мыши и все надо индексировать в одном
>> и том же порядке.
> Аноним (11), это вам.Вот теперь к теме. Надо чтобы вывод звука, микрофон, тоже был на своем месте. За сортировку отвечает драйвер "input"! Вывод:
dmesg -t |grep ‘^input: ’
должен быть идентичен при каждой загрузке. Точно скажу что на индекс звуковой карты драйвер input внимание не обращает! Клавы, мышки, микрофоны, кнопки питания - все перемешивает.
Про звук забудем, надо драйвер input заставить устройства индексировать синхронно, чтобы номера были всегда теже.
> Вот теперь к теме. Надо чтобы вывод звука, микрофон, тоже был на
> своем месте. За сортировку отвечает драйвер "input"! Вывод:
> dmesg -t |grep ‘^input: ’
> должен быть идентичен при каждой загрузке. Точно скажу что на индекс звуковой
> карты драйвер input внимание не обращает! Клавы, мышки, микрофоны, кнопки питания
> - все перемешивает.
> Про звук забудем, надо драйвер input заставить устройства индексировать синхронно, чтобы
> номера были всегда теже.Если не получилось установить порядок тем-же способом, как и среди разных звуковых контроллеров, то я пас.
Можт быть ваше приложение, которое записывает звук, умеет находить правильный input не только по индексу но и как-то ещё? Например: /devices/pci0000:00/0000:00:14.2/sound/card1/input9.
Может быть можно использовать какую-нибудь прослойку, типа pulseaudio, которая скроет от приложения истинный порядок устройств, и представит персистентные алиасы.
В качестве костыля, можно попробовать запретить загружать модули звуковых контроллеров штатно, а вместо этого написать свой скрипт который будет вызывать modprobe в определённом порядке и с необходимыни паузами, в самом конце загрузки. И запускать его из rc.local, например.
Обратите все внимание что индексация inputN вdmesg -t |grep ‘^input: ’
совсем не совпадает с индексацией устройств eventN в
ls -l /dev/input/
В общем случае inputN и eventN принадлежат разным устройствам! Для просмотра устройства eventN можно выполнить:
udevadm udevadm info /dev/input/eventN
В строках:
P:
E: DEVPATH=
Видно несовпадение нумераций input от ядра Linux и event от eudev. Это меня повторно напрягает...Проблема в сложном, монструозном, комбайне - input. Мне в нем не хватает опции синхронной обработки устройств ввода, как в scsi драйвере:
input.sync=sync
Вот до чего довела погоня за скоростью загрузки и асинхронностью работы драйверов.Хочется обратить внимание и на вывод:
ls -l /dev/disk
Заметьте как все причесано eudev. Просто идеал. Даже:
ls -s /dev/snd/by-path
Для вывода звука добавили!Для дисков, вывода звука через колонки - проблему решили, а на микрофон всем просто на*рать!
Я лично уже себе 3 файла с правилами eudev в /lib/udev/rules.d/ добавил. Придется добавлять еще одно. 60-persistent-input.rules если править перезапишется при обновлении!
Костыльное решение через udev rules мне не нравится. Хочется найти правильное решение через ядро. Грузить модули по порядку, с задержками еще хуже чем писать правила для eudev.
Может кто знает опции ядра для драйвера input типа sync и index для предсказуемой нумерации устройств ввода при загрузке?
В Documentation/kernel-parameters.txt есть упоминание как заставить любой модуль искать железо асинхронно:input.async_probe
а о упорядоченном поиске железа не увидел. Есть что-то для RCU.