Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

nvidia-smi not found: полная диагностика по слоям

«command not found» для nvidia-smi — это не одна поломка, а три независимых слоя: бинарник из nvidia-utils, библиотека NVML и модуль ядра. Симптом «No devices were found» вообще про другой слой, чем ошибка загрузки общей библиотеки, а строка Driver/library version mismatch говорит о рассинхроне после частичного обновления. Ниже — маршрут от самого верха вниз, где каждый шаг проверяет ровно один слой.

Почему nvidia-smi не найдена: три слоя

nvidia-smi — тонкая консольная утилита, которая сама ничего не делает с GPU. Она лежит в /usr/bin/nvidia-smi из пакета nvidia-utils, подгружает libnvidia-ml.so (NVML) из того же пакета и через неё общается с модулем ядра nvidia. Сломаться может любой из трёх, и снаружи выглядит это одинаково — утилита не работает.

Верхний слой — файл утилиты. Если его нет, ты получишь command not found, и никакие права это не исправят. Средний — библиотека NVML: если она удалена или переехала, будет error while loading shared libraries. Нижний — модуль ядра: если он не загружен или собран под другое ядро, утилита и библиотека на месте, но видят пустоту.

Именно поэтому nvidia-settings может работать, а nvidia-smi нет, и наоборот: у них разные зависимости и разные точки отказа. Про типичные сбои nvidia-settings и почему там главный виновник — окружение, а не драйвер, я писал в отдельной статье. А про то, как драйвер соотносится с версией ядра и как подобрать совместимую пару, — в материале про драйвер NVIDIA на Arch.

Как читать сообщение об ошибке?

bash: nvidia-smi: command not found — сломан верхний слой, бинарника нет в системе. Проверяй пакет nvidia-utils, а не драйвер.

nvidia-smi: error while loading shared libraries: libnvidia-ml.so.1: cannot open shared object file — сломан средний слой: библиотека NVML отсутствует или лежит вне стандартных путей. Помогает sudo ldconfig после правки /etc/ld.so.conf.d/, но обычно проще вернуть пакет.

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver или No devices were found — утилита и библиотека на месте, сломан нижний слой: модуль ядра не загружен, загрузился не для этой карты или не под то ядро.

Failed to initialize NVML: Driver/library version mismatch — модуль загружен, но библиотека NVML из nvidia-utils собрана под другую версию драйвера. Это главный виновник после частичного обновления через pacman -Sy без -u, и лечится он в самом конце.

Разбор похожих ошибок в nvidia-settings и nvidia-smi различается именно этим делением на слои, поэтому не переустанавливай пакеты наугад: сначала пойми, какой именно слой молчит.

Полная диагностика одним блоком

Прогоняй команды сверху вниз и останавливайся на первой неудаче:

which nvidia-smi
pacman -Q nvidia nvidia-utils nvidia-dkms 2>/dev/null
ls -l /usr/bin/nvidia-smi
lsmod | grep nvidia
ls /usr/lib/modules/$(uname -r)/updates/dkms/ 2>/dev/null
ldconfig -p | grep libnvidia-ml
dmesg | grep -iE 'nvidia|NVRM' | tail -20

Что означают ответы:

  • which пуст — слой 1, утилиты нет.
  • pacman -Q не выводит nvidia-utils — слой 1, пакет не установлен вовсе.
  • ls /usr/lib/modules/$(uname -r)/updates/ пуст, а в подкаталоге dkms/ есть файлы — модуль собран не для текущего ядра, ты загрузился с другим.
  • lsmod пуст, хотя файлы на месте — модуль не загрузился, смотри dmesg на предмет version mismatch, unknown symbol или nvidia: module not found.
  • dmesg молчит про NVRM, а модуль в списке — смотри, не перехватил ли карту nouveau.

Слой 1: бинарника нет

Самая частая и самая безобидная история: пакет nvidia-utils не установлен, потому что ставился только nvidia-open без утилит или удалялся при чистке. Лечится одной командой, и ставить её лучше вместе с драйвером той же версии:

sudo pacman -Syu nvidia-utils
nvidia-smi

Если which nvidia-smi находит файл, но с ошибкой загрузки библиотеки, проверь кэш компоновщика:

ldconfig -p | grep libnvidia-ml

Пустой вывод при установленном пакете означает, что не хватает кэша, и его лечит sudo ldconfig. Если после этого путь появился, но смотрит не в тот каталог, проверь /etc/ld.so.conf.d/nvidia.conf и переменную LD_LIBRARY_PATH в своём окружении.

Слой 2: модуль ядра не собран или не загружен

Если файлов модуля под текущим ядром нет, ничего чинить в userspace бесполезно. Для начала попробуй загрузить модуль руками и посмотреть реакцию:

sudo modprobe nvidia
lsmod | grep nvidia

Ошибка modprobe: FATAL: Module nvidia not found in directory /lib/modules/... говорит прямо: под это ядро модуль не собран. Тогда проверь версию драйвера под своё ядро и пересобери initramfs, если модуль в системе есть, но не попал в ramdisk:

sudo mkinitcpio -P

Если после этого nvidia-smi всё ещё не видит карту, велик шанс, что модуль заблокирован или перехвачен: посмотри, нет ли blacklist в /etc/modprobe.d/, и не подключился ли к карте nouveau вместо NVIDIA. Иногда после долгой возни проще снести драйвер целиком и поставить заново — процедура полной чистки снимает все хвосты разом.

Слой 3: NVML есть, но карту не видит

Модуль загружен, утилита отвечает, а карты нет. Причин тут три, и различаются они по dmesg:

dmesg | grep -iE 'nvidia|NVRM'

NVRM: Xid или сообщение о нехватке ресурсов — карта занята или сбойнулась, помогает перезагрузка и проверка температуры. Отсутствие любых строк NVRM при загруженном модуле — модуль сидит, но не привязался к устройству: смотри вывод lspci -k | grep -A2 'VGA compatible', чтобы понять, какой драйвер ядро выбрало. Полный отказ идти в контейнер или в chroot с доступом к GPU — тоже штатный случай, там нужен проброс устройств.

Где появляется DKMS и почему он ломается чаще всех

Пакет nvidia приносит модуль, собранный под конкретную версию ядра, и после каждого обновления ядра требует ручной переустановки. nvidia-dkms решает это: модуль собирается автоматически при установке каждого нового ядра, а лежит уже в /usr/lib/modules/$(uname -r)/updates/dkms/. Плата за это — необходимость заголовков ядра и рабочего компилятора, а также гораздо больше мест, где что-то может разъехаться.

Состояние DKMS показывает одна команда:

dkms status

Строки вида nvidia/615.71.09 -K 7.2.6.arch2-1: added показывают версию драйвера и версию ядра, под которую модуль собран. Если по умолчанию стоит installed (модуль есть) — всё в порядке; added без installed означает, что сборка не завершилась; отсутствие строк — DKMS про модуль ничего не знает.

Если сборка падает, проверяй заголовки: для запущенного linux нужен пакет linux-headers той же версии, что и ядро, для других дистрибутивов ядра — свои вроде linux-lts-headers. Заголовки другой версии компиляцию модуля не спасут.

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

sudo dkms autoinstall
dkms status

Если dkms autoinstall не помогает, удали модуль и собери заново: sudo dkms remove -m nvidia -v <версия>, затем sudo dkms install -m nvidia -v <версия>. Версию подставь ту, что показывает dkms status.

Но в большинстве случаев лечить DKMS не нужно вообще. Если сломался именно nvidia-utils или модуль, проще сделать полное обновление: sudo pacman -Syu nvidia nvidia-utils nvidia-dkms одной командой, пересобрать initramfs и загрузиться заново. Полный апгрейд выравнивает версии всех трёх слоёв, а любая ручная комбинация пакетов рано или поздно их разъедет снова.

Частые вопросы

Чем плох частичный апгрейд через pacman -Sy?

Команда обновляет базу пакетов, но не трогает уже установленное. Если после pacman -Sy nvidia-utils в базе появилась новая версия драйвера, а установлен остался старый модуль ядра, получаешь ровно тот самый Driver/library version mismatch. Лечится sudo pacman -Syu, а не повторным -Sy.

modprobe не находит модуль nvidia — что делать?

Сначала посмотри, есть ли файл модуля под текущим ядром в /usr/lib/modules/$(uname -r)/updates/ или updates/dkms/. Нет файла — вопрос к сборке, проверь dkms status и заголовки. Файл есть, а modprobe молчит — смотри dmesg, там будет причина: неизвестный символ, нехватка версии модуля или конфликт с другим драйвером.

Нужно ли добавлять nvidia в MODULES в mkinitcpio.conf?

Для обычной работы nvidia-smi не нужно: модуль подтягивается по требованию, когда утилита стучится в /dev/nvidiactl. Прямое указание в MODULES=(nvidia nvidia_drm) оправдано, когда нужен ранний KMS — например, чтобы не было чёрного экрана или разрывов при переключении на внешний монитор.

Как понять, модуль под то ядро или нет?

Сравни две вещи: версию ядра из uname -r с полем -K в выводе dkms status, и наличие файлов в /usr/lib/modules/$(uname -r)/updates/. Если DKMS собирал модуль под версию, которой ты сейчас не загружен, — перезагрузись в то ядро или пересобери под текущее.

Полезные ресурсы

  • NVIDIA (ArchWiki) — установка драйвера, DKMS против обычного пакета, разбор ошибок NVML.
  • DKMS (ArchWiki) — как работает пересборка модулей и чего ей нужно для успеха.

Заключение

Диагностика nvidia-smi идёт сверху вниз: файл в /usr/bin, библиотека libnvidia-ml.so, модуль в /usr/lib/modules/$(uname -r). Первая неудача в диагностическом блоке и называет сломанный слой. Чаще всего виновато не ядро и не карта, а частичное обновление, поэтому лечение почти всегда одно: полный pacman -Syu с драйвером, nvidia-utils и, если нужен, nvidia-dkms в одной команде.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max