Если тебе после каждого pacman -Syu приходится ставить драйвер заново — у тебя стоит пакет nvidia с готовым модулем, и он привязан ровно к той версии ядра, что была активна в момент установки. Пакет nvidia-dkms убирает эту рутину: он хранит исходники и сам пересобирает модуль хуком pacman, когда появляются заголовки нового ядра. Разбираемся, где физически лежит модуль у каждого способа, почему статический перестаёт видеться после апдейта и в каких случаях dkms всё-таки проигрывает.
Оба пакета ставят один и тот же проприетарный модуль и одну и ту же версию драйвера — цифры совпадают: актуальная ветка сейчас 6xx, LTS-ветка держится на 5xx. Разница ровно в одном — где и когда происходит компиляция.
nvidia — бинарный пакет с готовым nvidia.ko, собранным заранее под то ядро, которое было запущено при установке. Пакет просто кладёт готовый файл на место.
nvidia-dkms — исходники драйвера плюс рецепт сборки. Модуль компилируется локально утилитой dkms, и результат попадает в подкаталог dkms/.
# что реально лежит в каталоге модулей текущего ядра
ls -l /usr/lib/modules/$(uname -r)/updates/
# статический вариант:
# -rw-r--r-- 1 root root 41234560 сен 10 12:04 nvidia.ko
# вариант с dkms:
# drwxr-xr-x 2 root root 4096 сен 10 12:07 dkms
updates/ — штатное место для модулей, пришедших не из ядра. Оттуда modprobe берёт их без дополнительной настройки, а mkinitcpio кладёт в initramfs сам. Проверить, что модуль попал в образ загрузки, можно так:
lsinitcpio /boot/linux-lts.img | grep nvidia
Одновременно оба пакета не ставятся: они конфликтуют и делят один и тот же файл в /usr/lib/modules. Команда pacman -Q nvidia nvidia-dkms покажет только одну строку — ту, что реально стоит.
У каждой версии ядра свой каталог /usr/lib/modules/$(uname -r). Обновился пакет ядра — имя каталога стало другим, а nvidia.ko остался в старом, привязанном к прежнему uname -r.
uname -r
# 6.17.1-arch1-1
ls /usr/lib/modules/$(uname -r)/updates/ 2>/dev/null
# пусто — модуля под новое ядро просто нет
Симптомы узнаваемые: nvidia-smi отвечает «command not found» или «NVRM: driver/library version mismatch», графика проваливается в modesetting, картинка чёрная. Разбор именно этих симптомов — в материале про nvidia-smi not found: диагностика.
Копировать старый модуль в новый каталог бесполезно: у него другой vermagic и другая сигнатура конфигурации ядра, modprobe его всё равно отвергнет. Никакое «пересобрать конфиг старого ядра» тут не помогает — модуль привязан к бинарям, а не к настройкам.
С пакетом nvidia выход один — после каждого обновления ядра переустанавливать драйвер руками:
sudo pacman -S nvidia
sudo mkinitcpio -P
Примерно так и живёт большинство на статическом модуле: апдейт ядра, потом ручная переустановка драйвера, потом пересборка initramfs. Если после апдейта ядра отваливается не только видеокарта, а система целиком, начни с разбора зависания после обновления ядра. Базовая установка драйвера — в статье про драйвер NVIDIA на Arch Linux.
DKMS (Dynamic Kernel Module Support) делает простую вещь: хранит исходники модуля и умеет собирать их заново. В арче за это отвечает хук pacman, который срабатывает при установке нового пакета ядра или его заголовков.
Достаточно поставить заголовки того ядра, которое ты грузишь:
sudo pacman -S linux-headers # для linux
sudo pacman -S linux-lts-headers # для linux-lts
sudo pacman -S linux-zen-headers # для linux-zen
Дальше хук сам вызовет dkms autoinstall под новую версию ядра, а mkinitcpio положит свежий nvidia.ko в initramfs. Состояние видно командой:
dkms status
# nvidia/580.105.08: 6.17.1-arch1-1 (installed), 6.16.8-arch1-1 (installed)
installed рядом с версией ядра — модуль собран. Отсутствие версии в списке — под неё модуль не собран.
Главная причина, по которой выбирают dkms, — свобода ядра. Он одинаково дружит с linux, linux-lts, linux-zen и самособранным ядром, потому что компилируется локально под то, что реально стоит в системе. Статический пакет под самосборку не годится вообще: собрать бинарный модуль под чужую конфигурацию заранее невозможно.
Цена вопроса — компилятор и заголовки, которые нужно доставить:
sudo pacman -S --needed base-devel
Если заголовки не совпадают с загруженным ядром, сборка не запустится, и после обновления ты получишь ту же самую ошибку с nvidia-smi, только с другим источником.
Начинай с простого запроса к базе пакетов:
pacman -Q nvidia nvidia-dkms
Ответом будет одна строка: nvidia 6xx.xx-1 — статический модуль, nvidia-dkms 6xx.xx-1 — сборка на месте. Надёжнее спросить у самого файла, кому он принадлежит:
pacman -Qo /usr/lib/modules/$(uname -r)/updates/nvidia.ko
И посмотреть сам модуль:
modinfo -F version nvidia
cat /proc/driver/nvidia/version
Если modinfo отвечает — ядро видит модуль и он загружается. Если вылетает modprobe: FATAL: Module nvidia not found, возвращайся к разделу про обновление ядра. Ещё один косвенный признак: у dkms-системы в выводе pacman -Ql nvidia-dkms есть каталог /usr/lib/modules/.../build, у статической — нет.
Честный ответ: на скорости загрузки заметной разницы нет. Модуль в обоих случаях уже скомпилирован к моменту старта системы — dkms отрабатывает во время pacman -Syu, а не в момент загрузки.
Разница видна в другом месте — при установке и обновлении.
Статический пакет: модуль готов, pacman -S и mkinitcpio отрабатывают быстро. Но каждое обновление ядра требует ручной переустановки драйвера.
dkms: одна сборка на версию ядра занимает от десятков секунд до пары минут, на слабом ноутбуке — до пяти-десяти минут. Платишь один раз и не трогаешь руками ничего до следующего ядра.
Что ещё меняется: dkms тянет за собой base-devel и заголовки, а в /var/lib/dkms остаётся копия исходников и промежуточных объектов — ориентируйся на лишние 200–400 МБ на диске.
Бери dkms, если ты обновляешься регулярно, у тебя несколько ядер в меню загрузки (обычное дело, если стоят linux и linux-lts), ты ставишь нестандартное ядро типа zen или собираешь своё, либо просто не хочешь после каждого апдейта вспоминать про драйвер.
Бери статический nvidia, если ядро у тебя одно, оно из официальных репозиториев и ты ценишь предсказуемость: ничего не собирается, ничего не падает, состав системы полностью контролируемый. Это разумный выбор для сервера без компилятора, для быстрой установки на свежую машину и для случая, когда сборка из исходников невозможна из-за отсутствия сети или места на диске.
Нет, pacman запретит установку второго, пока не снесёшь первый. Это не конфликт файлов, а явная зависимость в метаданных: оба пакета забирают один и тот же nvidia.ko. Переход с одного на другой — это удаление старого и установка нового, придётся заново пересобрать initramfs.
Проверь dkms status — версии нового ядра в списке не будет. Чаще всего виноваты заголовки: для linux-lts нужен linux-lts-headers, а не linux-headers. Поставь нужный пакет, затем прогони сборку вручную:
sudo dkms autoinstall
sudo mkinitcpio -P
Если не помогло, посмотри лог в /var/lib/dkms/nvidia/<версия>/build/make.log — там прямо написано, на чём остановился компилятор.
Одинаково для обоих способов — через /etc/modprobe.d/nvidia.conf, а не через dkms.conf. Строка options nvidia NVreg_EnableGpuFirmware=0 читается ядром при загрузке независимо от того, кто собирал модуль. Если нужен параметр, которого нет в строке options, придётся пересобирать с опциями в PKGBUILD — и вот тут dkms заметно удобнее статического пакета. Как такие параметры влияют на нагрев, разбирает материал про перегрев и вентиляторы Coolbits.
Для обычной загрузки с GRUB достаточно, чтобы модуль лежал в каталоге ядра. В initramfs он нужен, если картинка рисуется до монтирования корня: у ноутбуков с гибридной графикой, при early KMS и для надёжного восстановления. mkinitcpio подхватывает модули из updates/ сам, но проверить результат стоит:
lsinitcpio /boot/linux-lts.img 2>/dev/null | grep nvidia
Разница между nvidia и nvidia-dkms не в драйвере, а в моменте компиляции: статический модуль готов сразу, но умирает при каждом смене ядра, dkms платит несколькими минутами сборки и зато живёт сам. Для рабочей машины с обновлениями и нестандартным ядром dkms удобнее; для одной стабильной системы из репозиториев статический пакет проще и предсказуемее. Проверь, что стоит у тебя, командой pacman -Q nvidia nvidia-dkms, — и дальше просто выбери сторону.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии