DKMS (Dynamic Kernel Module Support) — это механизм, который автоматически пересобирает модули ядра при каждом его обновлении. Поставил nvidia-dkms или v4l2loopback-dkms один раз — и после каждого обновления ядра модуль компилируется заново сам, без ручных действий. Ниже — как это работает, что ставить и что делать, когда сборка падает.
Ядро Linux состоит из модулей. Часть из них встроена прямо в ядро, часть лежит отдельными файлами .ko и подгружается по требованию. Модуль жёстко привязан к версии ядра: собранный под 6.12 модуль не загрузится в ядро 6.13. Поэтому всё, чего нет в основной ветке ядра, приходится пересобирать под каждую новую версию.
В основной ветке нет проприетарного драйвера Nvidia, нет виртуальной камеры v4l2loopback, нет драйверов многих Wi-Fi адаптеров на чипах Realtek, нет ZFS. Всё это живёт отдельно и компилируется под конкретное ядро.
Без DKMS каждый переход на новое ядро превращался в ритуал: скачать исходники, запустить make, положить собранный модуль в /lib/modules/<версия>/. Ошибся версией — модуль молча не загрузится, а modprobe выдаст Invalid module format. Привязку легко увидеть: modinfo у любого модуля показывает поле vermagic — строку с версией ядра, под которую он собран. Ядро сверяет её при загрузке и отказывается грузить несовпадающую. DKMS убирает этот ручной шаг: он хранит исходники модуля, а при появлении нового ядра компилирует модуль заново и кладёт его в каталог нового ядра.
В Arch обновление ядра — это пакет linux (или linux-lts, linux-zen). При установке пакета срабатывают хуки pacman. Один из них, dkms, запускает dkms autoinstall, который проходит по всем зарегистрированным модулям и пересобирает те, у которых версия ядра не совпадает.
Цепочка такая: pacman -Syu → обновилось ядро → хук dkms → компиляция модулей → модули готовы для нового ядра. Если сборка упала, pacman покажет ошибку хука, но обновление не откатится — модуль просто останется несобранным.
Исходники DKMS-модуля лежат в /usr/src/<имя>-<версия>, а состояние сборки — в /var/lib/dkms/<имя>/<версия>/. Там же хранятся логи: build/make.log и build/make.err.log. По этим путям легко понять, что именно собиралось и где упало.
При удалении пакета ядра хук делает обратную операцию: сносит модули, собранные под это ядро. Так в системе не копятся бинарники для давно удалённых ядер. Сами хуки живут в /usr/lib/dkms/dkms_prerm и /usr/lib/dkms/dkms_postinst — их вызывает pacman при установке и удалении пакетов ядра.
Важный момент: DKMS собирает модули для установленных ядер, а не для того, что загружено сейчас. Если стоят linux и linux-lts, модуль соберётся под оба. Про выбор ядра — в статье «Какое ядро выбрать: linux, linux-lts, linux-zen или linux-hardened».
В официальных репозиториях DKMS-версии пакетов обычно имеют суффикс -dkms:
nvidia-dkms — проприетарный драйвер Nvidia. Обычный nvidia тоже пересобирается хуками, но nvidia-dkms удобнее при нескольких ядрах и нестандартных сборках. Разница разобрана в статье «Драйвер Nvidia на Arch Linux».v4l2loopback-dkms — виртуальная камера. Создаёт устройство /dev/videoN, в которое можно выводить картинку: OBS, Zoom, тесты веб-камер.rtl88x2bu-dkms — драйвер Wi-Fi адаптеров на чипе Realtek RTL88x2BU (чаще из AUR).zfs-dkms — модуль ZFS (из AUR).Суффикс -dkms означает, что исходники модуля лежат в /usr/src, а пересборку берёт на себя DKMS.
Пакеты из AUR с суффиксом -dkms работают точно так же: после установки через yay или paru исходники попадают в /usr/src, а сборку запускает тот же хук pacman.
Драйвер Nvidia в DKMS-варианте собирает сразу несколько модулей: nvidia, nvidia_modeset, nvidia_uvm и nvidia_drm. В dkms status они появятся отдельными строками. После установки проверь, что они загружаются: lsmod | grep nvidia.
Сначала нужны заголовки ядра. Без них компиляция невозможна: DKMS берёт из них заголовочные файлы и конфигурацию ядра. Версия заголовков должна совпадать с версией ядра.
pacman -S linux-headers # заголовки для ядра linux
# если стоит linux-lts — ставь linux-lts-headers
Проверь, что версии совпадают:
uname -r
pacman -Q linux linux-headers
Первая команда показывает загруженное ядро, вторая — установленные пакеты. Версии должны совпадать. Если они разошлись — обнови систему полностью: pacman -Syu. Частичное обновление — самая частая причина несовпадения ядра и заголовков.
Теперь сам модуль:
pacman -S nvidia-dkms v4l2loopback-dkms
Для Nvidia дополнительно понадобится nvidia-utils — пользовательские библиотеки драйвера. Их ставят отдельно, DKMS их не заменяет.
Что происходит в момент установки: pacman кладёт исходники в /usr/src, запускает dkms add (регистрация модуля), затем dkms build и dkms install под текущее ядро. Если на этом шаге что-то падает, pacman покажет ошибку прямо во время установки пакета.
После установки пакет сам регистрирует модуль в DKMS и сразу собирает его под текущее ядро. Проверь:
dkms status
В выводе увидишь строки вида v4l2loopback/0.12.5, 6.12.1-arch1-1, x86_64: installed. Статус installed — модуль собран и готов к загрузке.
dkms status — главная команда диагностики. Показывает все модули, их версии, ядра и статус.
Удалить модуль полностью:
dkms remove v4l2loopback/0.12.5 --all
--all — удалить для всех ядер. Версию бери из вывода dkms status.
Пересобрать всё вручную:
dkms autoinstall
Команда собирает все модули для всех установленных ядер, где они ещё не собраны. Пригодится после ручной установки ядра или после сбоя сборки. Именно её запускает хук pacman при обновлении.
Сборка упала — pacman покажет ошибку хука dkms. Первым делом смотри статус: вместо installed в dkms status будет error или bad. Затем открывай лог сборки:
tail -n 50 /var/lib/dkms/v4l2loopback/0.12.5/build/make.log
Путь такой: /var/lib/dkms/<имя>/<версия>/build/make.log. Последние строки обычно содержат настоящую причину. Если лог пустой — смотри make.err.log рядом.
Частые причины:
linux/version.h: No such file or directory. Лечится установкой linux-headers нужной версии.pacman -Syu.Если хук не сработал, собери модуль вручную:
dkms build v4l2loopback/0.12.5 -k 6.12.1-arch1-1
dkms install v4l2loopback/0.12.5 -k 6.12.1-arch1-1
-k — версия ядра из uname -r. После install модуль появится в /lib/modules/<версия>/extra/ и станет доступен для modprobe. Если модуль уже был загружен в старой версии — выгрузи его перед проверкой: rmmod v4l2loopback, затем modprobe v4l2loopback заново.
Если модуль не собрался под новое ядро, но собран под старое — загрузись со старого ядра из меню загрузчика, и модуль будет работать. Классический случай, когда модуль пропадает после обновления, — Wi-Fi адаптер на Realtek. Разбор — в статье «Пропал модуль Wi-Fi после обновления».
Собранный модуль ещё нужно загрузить в ядро. Для v4l2loopback:
modprobe v4l2loopback
Проверка:
lsmod | grep v4l2loopback
Модуль в списке — загружен. Устройство появится как /dev/videoN (проверь ls /dev/video*). Версию загруженного модуля показывает modinfo v4l2loopback | grep version — она должна совпадать с версией из dkms status.
Чтобы модуль грузился при старте системы, добавь его имя в /etc/modules-load.d/:
echo "v4l2loopback" | sudo tee /etc/modules-load.d/v4l2loopback.conf
Параметры модуля задаются в /etc/modprobe.d/. Например, две виртуальные камеры:
options v4l2loopback devices=2 video_nr=10,11 card_label="Cam1","Cam2"
Зачем это нужно на практике: виртуальная камера позволяет показывать в Zoom или OBS не веб-камеру, а окно, экран или видеофайл. После загрузки модуля /dev/video0 работает как обычная камера. Вывести видеофайл в неё можно через ffmpeg:
ffmpeg -re -i video.mp4 -f v4l2 -vcodec rawvideo -pix_fmt yuv420p /dev/video0
Для Nvidia отдельная загрузка обычно не нужна: модули nvidia, nvidia_modeset и nvidia_drm подхватываются сами при старте X или Wayland. Если в lsmod их нет — добавь nvidia_drm в /etc/modules-load.d/ или загрузи вручную modprobe nvidia_drm. Параметр modeset=1 в /etc/modprobe.d/nvidia.conf включает аппаратное ускорение композитинга.
Если модуль не загружается — смотри dmesg:
dmesg | tail -n 30
Там будет причина: несовпадение версии, отсутствие символов ядра и так далее.
Да, если используешь любой DKMS-модуль. Заголовки — обязательная зависимость сборки. Без них хук dkms упадёт с ошибкой. Заголовки ставятся под каждое ядро отдельно: linux-headers для linux, linux-lts-headers для linux-lts.
nvidia-dkms удобнее при нескольких ядрах: модуль пересобирается автоматически под каждое. Обычный nvidia тоже работает, но привязан к конкретной версии ядра. Подробнее — в статье про драйвер Nvidia.
Нет. Система загрузится, просто модуль не будет работать в новом ядре. Загрузись со старого ядра из меню загрузчика или дождись обновления пакета с исходниками.
Классический признак несобранного DKMS-модуля для беспроводного адаптера. Проверь dkms status и лог сборки. Если статус error — смотри make.log, там будет причина.
dkms status. Статус installed — модуль собран и установлен, built — собран, но не установлен, error — сборка падала, смотри лог. Пустая строка для ядра — модуль под него вообще не собирался.
DKMS снимает главную боль модулей вне основного ядра: пересборку при каждом обновлении. Поставил -dkms пакет, убедился, что заголовки ядра на месте, и забыл — хук pacman сделает всё сам. Если сборка упала, dkms status и make.log подскажут причину, а старое ядро в меню загрузчика даст время на починку. DKMS не панацея: если автор модуля не обновил исходники под новое ядро, пересборка не поможет. Но для популярных модулей — nvidia, v4l2loopback, Realtek — обновления приходят быстро, и система остаётся рабочей после каждого pacman -Syu.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии