Жил да был ТВ тюнер. Из видео устройств в системе он был один и гордо занимал место в /dev/video0. Но в один прекрасный день в системе поселилась веб камера, которая тоже стала претендовать на место в каталоге /dev. И началась борьба за место под солнцем. При каждой загрузки системы, то камера займет /dev/video0, то ТВ тюнер. От этого начали страдать программы. То tvtime подключается к /dev/video0, а там веб камера, то skype к /dev/video1, а там тюнер.
Знакомая ситуация? Решение в общем-то известно. Нужно раздать имена файлов в каталоге /dev при помощи udev. Здесь я расскажу о своем опыте и о нюансах, с которыми мне пришлось столкнуться.
Как проблема была решена в итоге.
Для начала я узнал все о своих устройствах.
udevadm info -a -p $(udevadm info -q path -n /dev/video0)
udevadm info -a -p $(udevadm info -q path -n /dev/video1)Данные команды выдадут много всего, но интересны нам будут следующие пункты:
для веб камеры это ATTRS{idVendor} и ATTRS{idProduct},
для ТВ тюнера это ATTRS{vendor} и ATTRS{device}.
После сбора информации идем в /etc/udev/rules.d и создаем там файл с именем 25-name-video-device.rules (название может быть абсолютно любым) следующего содержания:
ATTRS{idVendor}=="046d", ATTRS{idProduct}=="09a5", ATTR{name}=="UVC Camera (046d:09a5)", NAME="video2"
KERNEL=="video*", ATTRS{vendor}=="0x1131", ATTRS{device}=="0x7133", NAME="tuner"Данное правило говорит udev, что устройства с определенными идентификаторами (vendor, idProduct и пр.) будут иметь в каталоге /dev имена video2 (камера) и tuner (ТВ тюнер).
Осталось только перезагрузиться (или перезапустить udev) и получим желаемый результат.
Почему я распределил устройства именно так.
Изначально идея была дать устройствам имена video0 и video1, но как показала практика, ни фига из этого не вышло. Конфликт при загрузке все равно имел место быть, и в итоге я получал только устройство video1 (железка могла быть любая).
Рассудил я так. Раз устройства 2, то при загрузке, где-то в самом начале, они раскидываются на video0 и video1, а когда udev начинает назначать имена, получается чехарда. А раз устройства два, то video2 всегда свободно. Пусть это и будет вэб камера. Имя video веб камере тоже дано не спроста. Дело в том, что skype видит только устройства video в каталоге /dev. Что-то типа /dev/webcam skype просто не увидит, и сказать ему о том, где камера нельзя.
А вот с ТВ тюнером проще. Его использует только tvtime, а ему можно шепнуть на ушко где искать тюнер. Так я и сделал. Открыл ~/.tvtime/tvtime.xml и поменял
<option name="V4LDevice" value="/dev/video0"/> на
<option name="V4LDevice" value="/dev/tuner"/>
Есть еще вариант. Вместо назначения имени устройству, сделать симлинки. То есть в файле 25-name-video-device.rules вместо NAME="video2" прописать SYMLINK+="video2". При этом устройства video0 и video1 будут существовать и так же рандомно назначаться, только симлинки будут делаться на конкретные железки с вышеуказанными идентификаторами.
Я так делать не стал потому, что не хотел делать лишний клик в программе Komoso для выбора устройства. В моем решении устройство video только одно и Komoso только его (веб камеру) и видит. В общем, кому что больше нравится.







