Модули ядра для поддержки USB-видео в Linux

Веб-камера определяется системой в lsusb, но устройство /dev/video0 не появляется — почти всегда причина в том, что модуль ядра uvcvideo не загружен или заблокирован. Этот модуль реализует стандарт USB Video Class (UVC), которому следует подавляющее большинство современных USB-камер, и без него видеопоток попросту некому обрабатывать на уровне ядра.

В этой статье разберём, какие модули ядра Linux отвечают за USB-видео, как проверить их состояние, что делать при ошибках загрузки и когда требуются альтернативные драйверы вроде gspca. Материал ориентирован на дистрибутивы с ядром Linux — Ubuntu, Debian, Fedora, Arch и их производные.

Как устроена поддержка USB-видео в ядре Linux

Поддержка USB-камер в Linux строится в несколько слоёв. На нижнем уровне работает USB-стек ядра (модули usbcore, xhci_hcd или ehci_hcd в зависимости от контроллера), который обеспечивает само подключение устройства к шине. Выше располагается подсистема Video4Linux2 (V4L2) — единый интерфейс для всех видеоустройств, через который приложения получают доступ к потоку.

Между ними находится драйвер конкретного класса устройств. Для камер, совместимых со стандартом UVC, это uvcvideo. Для старых или нестандартных моделей существуют отдельные драйверы — исторически наиболее известен набор gspca, охватывающий множество чипов бюджетных камер.

Именно модуль uvcvideo создаёт файлы устройств /dev/video0, /dev/video1 и так далее. Если этих файлов нет, проблема почти наверняка на уровне модуля, а не в приложении.

Основные модули ядра для USB-видео

Ниже перечислены ключевые модули, которые участвуют в работе USB-видео. Знать их имена полезно при диагностике: по выводу lsmod сразу видно, какой элемент цепочки отсутствует.

  • 🎥 uvcvideo — драйвер устройств USB Video Class, основной модуль для современных веб-камер и камер ноутбуков.
  • 📼 videodev — ядро подсистемы V4L2, загружается автоматически как зависимость драйверов камер.
  • 🔌 usbcore и модули хост-контроллера (xhci_hcd, ehci_hcd) — обеспечивают работу самой шины USB.
  • 🧩 gspca_* — семейство драйверов для старых и нестандартных камер (например, gspca_zc3xx, gspca_sonixj).
  • 🔊 snd-usb-audio — модуль микрофона камеры: звуковая часть UVC-устройства обслуживается отдельно от видео.

Обратите внимание на последний пункт: у большинства веб-камер микрофон — это отдельное USB-устройство. Поэтому ситуация, когда видео работает, а звук нет (или наоборот), вполне нормальна и решается независимо.

Проверка состояния модулей

Начните диагностику с проверки того, видит ли система камеру на уровне USB:

lsusb

В выводе должна присутствовать строка с названием камеры или её производителя. Если устройства нет даже здесь — проблема аппаратная: порт, кабель или сама камера. Модули ядра в этом случае ни при чём.

Далее проверьте, загружен ли модуль uvcvideo:

lsmod | grep -E "uvcvideo|videodev"

Пустой вывод означает, что модуль не загружен. Загрузите его вручную:

sudo modprobe uvcvideo

После этого снова проверьте наличие устройства командой ls /dev/video*. Если файл появился — камера должна заработать в приложениях без перезагрузки.

☑️ Диагностика USB-камеры

Выполнено: 0 / 5

Типичные проблемы и их решение

Одна из частых ситуаций — модуль загружается, но с ошибкой. Детали смотрите в журнале ядра:

sudo dmesg | grep -i -E "uvc|video"

Сообщения вида «Failed to query» или ошибки инициализации UVC-дескрипторов указывают на нестандартную прошивку камеры. Для некоторых таких устройств помогает загрузка модуля с параметром quirks, но конкретное значение зависит от модели камеры — его стоит искать в документации к драйверу или в баг-трекерах вашего дистрибутива.

⚠️ Внимание: не загружайте модули с параметрами, найденными на форумах для чужих моделей камер. Неверное значение quirks может привести к зависанию устройства или полному отказу инициализации. Сначала сверьтесь с источниками, относящимися именно к вашей модели (её VID:PID виден в выводе lsusb).

Ещё одна причина «невидимой» камеры — права доступа. Пользователь должен входить в группу video. Проверить это можно командой groups, а добавить себя в группу — командой sudo usermod -aG video имя_пользователя с последующим повторным входом в сессию.

📊 Какая проблема с USB-камерой у вас возникла?
Камера не определяется совсем
/dev/video0 есть, но изображения нет
Работает видео, но нет звука
Камера работала и внезапно пропала

Автоматическая загрузка модуля при старте системы

Обычно udev загружает uvcvideo автоматически при обнаружении камеры. Если этого не происходит, проверьте, не попал ли модуль в чёрный список: поищите строки с его именем в файлах каталога /etc/modprobe.d/.

Чтобы принудительно загружать модуль при старте, достаточно добавить его имя в файл /etc/modules-load.d/uvc.conf (создайте файл, если его нет):

echo "uvcvideo" | sudo tee /etc/modules-load.d/uvc.conf

Если модуль отсутствует в системе вообще (команда modinfo uvcvideo выдаёт ошибку), возможно, вы используете кастомное или сильно урезанное ядро. В стандартных ядрах популярных дистрибутивов модуль включён по умолчанию; в собственных сборках убедитесь, что в конфигурации ядра активирован параметр CONFIG_USB_VIDEO_CLASS.

Почему камера может пропадать после обновления ядра

После обновления ядра старые сторонние модули (например, собранные через DKMS) могут оказаться несовместимы с новой версией. Проверьте вывод dkms status и при необходимости пересоберите модули. Для штатного uvcvideo это не требуется — он входит в состав ядра и обновляется вместе с ним.

Сравнение драйверов для USB-камер

Выбор драйвера определяется чипом камеры, а не желанием пользователя. Тем не менее полезно понимать, какой модуль за что отвечает.

МодульНазначениеКогда используется
uvcvideoСтандарт USB Video ClassПрактически все современные камеры
gspca_*Драйверы нестандартных чиповСтарые бюджетные камеры
videobuf2-*Буферизация кадров V4L2Загружается автоматически как зависимость
snd-usb-audioЗвук USB-устройствМикрофон камеры, USB-гарнитуры

Определить, какой драйвер обслуживает конкретное устройство, можно командой lsusb -t: в её выводе для каждого устройства указан привязанный драйвер.

Проверка работоспособности камеры

После того как модуль загружен и устройство появилось, протестируйте захват видео без браузеров и мессенджеров. Проще всего использовать утилиту ffplay из состава FFmpeg:

ffplay /dev/video0

Если окно с изображением открылось — ядро и драйвер работают корректно, а любые дальнейшие проблемы относятся уже к настройкам конкретного приложения (выбор устройства, разрешения в браузере и т.п.).

Отсутствие изображения при открывшемся окне может указывать на неподдерживаемый формат кадра. Список форматов и разрешений, которые камера сообщает системе, выводится командой v4l2-ctl --list-formats-ext.

⚠️ Внимание: камеру одновременно может использовать только одно приложение. Если устройство «занято», закройте все программы, которые могли захватить видео (в том числе вкладки браузера с видеозвонками), и проверьте заново. Узнать, какой процесс держит устройство, поможет команда sudo fuser /dev/video0.

Часто задаваемые вопросы

Что делать, если modprobe uvcvideo выдаёт ошибку «module not found»?

Модуль отсутствует в установленном ядре. В стандартных дистрибутивах он входит в пакет ядра — проверьте, что ядро установлено корректно и система загружена именно с него. В самосборных ядрах включите опцию CONFIG_USB_VIDEO_CLASS и пересоберите ядро.

Нужно ли устанавливать отдельные драйверы для веб-камеры в Linux?

Для камер стандарта UVC — нет, драйвер uvcvideo уже входит в ядро. Отдельные драйверы требуются только для редких устройств с проприетарными чипами, и их наличие нужно проверять по VID:PID конкретной модели.

Почему камера работает в одной программе, но не видна в другой?

Обычно дело в правах доступа приложения (особенно в sandbox-окружениях вроде Flatpak или Snap) либо в том, что устройство уже занято первым приложением. Проверьте настройки разрешений пакета и освободите устройство.

Как узнать, поддерживается ли моя камера стандартом UVC?

Выполните lsusb -v для устройства и поищите в выводе строки с bInterfaceClass 14 Video. Их наличие означает, что камера объявляет себя как UVC-устройство и должна обслуживаться модулем uvcvideo.

Можно ли выгрузить модуль uvcvideo без перезагрузки?

Да, командой sudo modprobe -r uvcvideo, но только если камера не используется ни одним приложением. Перезагрузка модуля иногда помогает при «зависшей» камере — это безопасная обратимая операция.