«command not found» для nvidia-smi — это не одна поломка, а три независимых слоя: бинарник из nvidia-utils, библиотека NVML и модуль ядра. Симптом «No devices were found» вообще про другой слой, чем ошибка загрузки общей библиотеки, а строка Driver/library version mismatch говорит о рассинхроне после частичного обновления. Ниже — маршрут от самого верха вниз, где каждый шаг проверяет ровно один слой.
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.Самая частая и самая безобидная история: пакет 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 в своём окружении.
Если файлов модуля под текущим ядром нет, ничего чинить в 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. Иногда после долгой возни проще снести драйвер целиком и поставить заново — процедура полной чистки снимает все хвосты разом.
Модуль загружен, утилита отвечает, а карты нет. Причин тут три, и различаются они по dmesg:
dmesg | grep -iE 'nvidia|NVRM'
NVRM: Xid или сообщение о нехватке ресурсов — карта занята или сбойнулась, помогает перезагрузка и проверка температуры. Отсутствие любых строк NVRM при загруженном модуле — модуль сидит, но не привязался к устройству: смотри вывод lspci -k | grep -A2 'VGA compatible', чтобы понять, какой драйвер ядро выбрало. Полный отказ идти в контейнер или в chroot с доступом к GPU — тоже штатный случай, там нужен проброс устройств.
Пакет 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 nvidia-utils в базе появилась новая версия драйвера, а установлен остался старый модуль ядра, получаешь ровно тот самый Driver/library version mismatch. Лечится sudo pacman -Syu, а не повторным -Sy.
Сначала посмотри, есть ли файл модуля под текущим ядром в /usr/lib/modules/$(uname -r)/updates/ или updates/dkms/. Нет файла — вопрос к сборке, проверь dkms status и заголовки. Файл есть, а modprobe молчит — смотри dmesg, там будет причина: неизвестный символ, нехватка версии модуля или конфликт с другим драйвером.
Для обычной работы nvidia-smi не нужно: модуль подтягивается по требованию, когда утилита стучится в /dev/nvidiactl. Прямое указание в MODULES=(nvidia nvidia_drm) оправдано, когда нужен ранний KMS — например, чтобы не было чёрного экрана или разрывов при переключении на внешний монитор.
Сравни две вещи: версию ядра из uname -r с полем -K в выводе dkms status, и наличие файлов в /usr/lib/modules/$(uname -r)/updates/. Если DKMS собирал модуль под версию, которой ты сейчас не загружен, — перезагрузись в то ядро или пересобери под текущее.
Диагностика nvidia-smi идёт сверху вниз: файл в /usr/bin, библиотека libnvidia-ml.so, модуль в /usr/lib/modules/$(uname -r). Первая неудача в диагностическом блоке и называет сломанный слой. Чаще всего виновато не ядро и не карта, а частичное обновление, поэтому лечение почти всегда одно: полный pacman -Syu с драйвером, nvidia-utils и, если нужен, nvidia-dkms в одной команде.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии