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 в одной команде.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии