2025, Dec 13 03:01
Как исправить NameError MNT_NOSUID при загрузке vmlinux-gdb.py в GDB
Разбираем ошибку NameError MNT_NOSUID при source vmlinux-gdb.py в GDB: почему не баг Python, как применить патч из LKML и вернуть удобства отладки ядра Linux.
Отладка ядра Linux в GDB часто начинается с загрузки вспомогательной логики из vmlinux-gdb.py. Иногда уже на старте это падает с исключением Python NameError о том, что MNT_NOSUID не определён. Если вы видите именно это, проблема не в вашей среде Python. Речь о флаге ядра, на котором скрипт спотыкается во время разбора.
Воспроизведение ошибки
Сбой возникает сразу после подключения помощника в GDB:
(gdb) source vmlinux-gdb.py
Python Exception <class 'NameError'>: name 'MNT_NOSUID' is not defined
Error occurred in Python: name 'MNT_NOSUID' is not defined
Что на самом деле происходит
MNT_NOSUID — это флаг ядра, означающий, что файловая система должна быть смонтирована с ограничением: программы setuid и setgid, на которые ссылаются через эту точку монтирования, не должны выполняться. Иными словами, это отражение поведения nosuid в представлении ядра о монтировании.
Это не символ Python и он не должен поступать из какого‑либо пакета Python. Ошибка возникает потому, что вспомогательный скрипт спотыкается об этот флаг при разборе, из‑за чего символ оказывается фактически непригодным для разбора в этом контексте. Проблема известна и обсуждалась публично; см. тред на LKML: https://lkml.org/lkml/2025/5/31/383.
Исправление, которое устраняет сбой
Решение — применить патч, упомянутый в обсуждении на LKML. После локального применения исправления помощник загружается как положено; например, его применили на установке v6.16, и всё сработало, после установки патча скрипт успешно загрузился.
После установки исправления та же команда GDB больше не вызывает исключение:
(gdb) source vmlinux-gdb.py
Зачем это важно для отладки ядра
Без помощника многие удобные функции при отладке ядра недоступны, а вы рискуете уйти по ложному следу, разыскивая несуществующие зависимости Python. Понимание того, что MNT_NOSUID — это флаг монтирования ядра, проясняет: проблема в логике разбора самого помощника, а не в вашем пользовательском окружении, дистрибутиве или VM.
Выводы
Если подключение vmlinux-gdb.py завершается с ошибкой “name 'MNT_NOSUID' is not defined”, воспринимайте MNT_NOSUID тем, чем он является: флагом монтирования ядра Linux, а не объектом Python. Откройте обсуждение на LKML, примените предложенный патч и снова загрузите помощник. После исправления скрипт должен загружаться без сбоев, и вы сможете продолжить отладку ядра без лишних обходных путей.