Depmod linux что это
Модули ядра Linux могут предоставлять службы (называемые "символами") для использования другими модулями (при помощи одного из вариантов EXPORT_SYMBOL в коде). Если другой модуль использует этот "символ", то этот модуль непосредственно зависит от первого модуля. Такие зависимости могут быть весьма сложными.
depmod создает список зависимостей модулей, прочитывая каждый модуль в каталоге /lib/modules/версия и определяя, какие символы они экспортируют, а какие символы им нужны. По умолчанию этот список записывается в файл modules.dep, а в том же каталоге создаётся его двоичная версия под именем modules.dep.bin. Если в командной строке заданы имена_файлов, то проверяются только эти модули (что иногда может быть полезно, если перечислены не все модули). depmod также создаёт список предоставляемых модулем символов в файле с именем modules.symbols, а его двоичная версия сохраняется под именем modules.symbols.bin. Наконец, depmod записывает в файл modules.devname предоставляемые модулем имена специальных устройств (devname), которые нужно создать в каталоге /dev в процессе загрузки (утилитой вроде systemd−tmpfiles).
Если указана версия, то используется каталог модулей указанной версии ядра, а не версии текущего ядра (возвращаемой командой "uname −r").
ОПЦИИ
−a, −−all
Проверять все модули. Опция включена по умолчанию, если в командной строке не указаны имена файлов.
−A, −−quick
Эта опция проверяет, не является ли какой−либо модуль более новым, чем файл modules.dep, прежде чем приступить к работе. Если файл modules.dep свежее модулей, то программа не будет повторно генерировать файлы, а без предупреждений завершит работу.
−b основной_каталог, −−basedir основной_каталог
Если ваши модули находятся не в (обычном) каталоге /lib/modules/версия, а в другом месте, можно указать основной_каталог, который будет предпочтён обычному каталогу. Этот основной_каталог будет вырезан из результирующего файла modules.dep, так что файл будет готов к перемещению в обычное место расположения. Используйте эту опцию если вам нужно изготовить дистрибутив, содержащий заранее сгенерированые файлы мета−данных, что позволит обойтись без повторного запуска depmod.
−C, −−config файл или каталог
Эта опция заменяет каталог конфигурации по умолчанию /etc/depmod.d/.
−e, −−errsyms
В сочетании с опцией −F, эта опция докладывает обо всех символах, которые требуются модулю, но не предоставляются другими модулями или ядром. Обычно предполагается, что любые символы не предоставляемые модулями, предоставляются ядром (что должно быть верно в идеальном мире), но это предположение может может не соблюдаться, особенно в случае сторонних драйверов, которые не были корректно установлены или были некорректно собраны.
−E, −−symvers
При указании вместе с опцией −e, вывести версии символов из модулей, не совпадающие с версиями символов, предоставляемых ядром в файле Module.symvers. Эта опция взаимно не совместима с опцией −F.
−F, −−filesyms System.map
Указать файл System.map, созданный при сборке ядра, который позволяет опции −e сообщать обо всех неразрешённых символах. Эта опция взаимно несовместима с опцией −E.
−h, −−help
Вывести краткую справку и завершить работу.
−n, −−show, −−dry−run
Эта опция отправит получившийся modules.dep, а затем и различные map−файлы на стандартный вывод, а не запишет их в каталог модулей.
На некоторых архитектурах к символам добавляется символ−префикс. Эта опция позволяет указать символ−префикс (например, _) чтобы он не учитывался.
−v, −−verbose
В подробном режиме depmod будет выводить (на стандартный вывод) символы, от которых зависит каждый модуль и имена файлов модулей, которые предоставляют эти символы.
−V, −−version
Отобразить версию программы и завершить работу. Обратите внимание на предостережения, описанные ниже, о запуске на старых ядрах.
Предупреждать о дублирующихся зависимостях, псевдонимах, версиях символов и т.п.
АВТОРСКОЕ ПРАВО
Эта страница руководства первоначально написана Copyright 2002, Расти Расселом (Rusty Russell), корпорация IBM. Часть авторства принадлежит Джону Мастерсу (Jon Masters) и другим авторам.
Depmod обрабатывает описания зависимостей для загружаемых модулей ядра.
конспект
Описание
Утилиты depmod и modprobe предназначены для того, чтобы сделать модульное ядро Linux управляемым для всех пользователей, администраторов и сопровождающих.
Depmod создает файл зависимостей, подобный Makefile, на основе символов, которые он находит в наборе модулей, указанных в командной строке, или в каталогах, указанных в файле конфигурации. Этот файл зависимостей позже используется modprobe для автоматической загрузки нужного модуля или стека модулей.
Обычно depmod используется для добавления строки
где-то в rc-файлах в /etc/rc.d , так что правильные зависимости модуля будут доступны сразу после загрузки системы. Обратите внимание, что опция -a теперь является необязательной. Для загрузки может подойти опция -q , так как это заставляет depmod молчать о неразрешенных символах.
При построении взаимосвязи между модулями и символами, экспортируемыми другими модулями, depmod не учитывает состояние GPL модулей и экспортируемых символов. То есть depmod не будет отмечать ошибку, если модуль без лицензии, совместимой с GPL, ссылается на символ только GPL (EXPORT_SYMBOL_GPL в ядре). Однако insmod откажется разрешать символы GPL только для модулей не-GPL, поэтому фактическая загрузка не удастся.
Опции
Поиск модулей во всех каталогах, указанных в (необязательном) файле конфигурации /etc/modules.conf .
Сравните временные метки файлов и, если необходимо, действуйте как depmod -a . Эта опция обновляет файл зависимостей, только если что-то изменилось.
Показать все неразрешенные символы для каждого модуля.
Показать сводку опций и сразу выйти.
Записать файл зависимости на стандартный вывод, а не в дерево /lib/modules .
Скажите depmod, чтобы он молчал и не жаловался на пропущенные символы.
Некоторые пользователи компилируют модули под ИД пользователя без полномочий root, а затем устанавливают модули как root. Этот процесс может оставить модули, принадлежащие ИД пользователя без полномочий root, даже если каталог модулей принадлежит пользователю root. Если идентификатор пользователя без полномочий root скомпрометирован, злоумышленник может перезаписать существующие модули, принадлежащие этому идентификатору пользователя, и использовать это воздействие для начальной загрузки до доступа root.
По умолчанию modutils отклоняет попытки использовать модуль, который не принадлежит root. Указание -r подавит ошибку и позволит root загружать модули, которые не принадлежат root.
Использование -r является серьезной угрозой безопасности и не рекомендуется.
depmod 2.4 не устанавливает код возврата при наличии неразрешенных символов. В некоторых дистрибутивах требуется ненулевой код возврата в modutils 2.4, но это изменение может вызвать проблемы у пользователей, которые ожидают старого поведения. Если вы хотите получить ненулевой код возврата в depmod 2.4, укажите -u . depmod 2.5 автоматически игнорирует флаг -u и всегда дает ненулевой код возврата для неразрешенных символов.
Показать название каждого модуля в процессе его обработки.
Показать версию depmod .
Управление дистрибутивами
Следующие параметры полезны для людей, управляющих дистрибутивами:
Если дерево каталогов/lib/modules , содержащее поддеревья модулей, перемещено куда-то еще для обработки модулей для другой среды, опция -b сообщает depmod где найти перемещенное изображение дерева /lib/modules . Ссылки на файл в созданном выходном файле depmod, modules.dep , не будут содержать путь basedirectory . Это означает, что при перемещении дерева файлов из basedirectory/lib/modules в /lib/modules в окончательном выпуске все ссылки будут правильными.
Используйте файл configfile вместо /etc/modules.conf . Переменная среды MODULECONF также может использоваться для выбора другого файла конфигурации из /etc/modules.conf (или /etc/conf.modules по умолчанию . EM> (устаревшее)).
Когда установлена переменная среды UNAME_MACHINE , modutils будет использовать ее значение вместо машинного поля из системного вызова uname (). Это в основном используется, когда вы компилируете 64-битные модули в 32-битном пользовательском пространстве или наоборот, установите UNAME_MACHINE в качестве типа создаваемых модулей. Текущие модули не поддерживают режим полного кросс-сборки для модулей, он ограничен выбором между 32- и 64-битными версиями архитектуры хоста.
При создании файлов зависимостей для ядра, отличного от текущего запущенного ядра, важно, чтобы depmod использовал правильный набор символов ядра для разрешения ссылок на ядра в каждом модуле. Эти символы могут быть либо копией System.map из другого ядра, либо копией вывода из /proc/ksyms . Если в вашем ядре используются версионные символы, лучше всего использовать копию вывода /proc/ksyms , поскольку этот файл содержит символьные версии символов ядра. Однако вы можете использовать System.map даже с версионными символами.
конфигурация
Поведение depmod и modprobe можно настроить с помощью (необязательного) файла конфигурации /etc/modules.conf . См. modprobe (8) и modules.conf (5) для полного описания.
стратегия
Когда вы получаете модуль, не связанный с дистрибутивом ядра, вы должны поместить его в один из независимых от версии каталогов в /lib/modules .
Это стратегия по умолчанию, которую можно изменить в /etc/modules.conf .
Используйте команду man (% man ), чтобы увидеть, как команда используется на вашем конкретном компьютере.
Модули ядра Linux могут предоставлять службы (называемые "символами") для использования другими модулями (при помощи EXPORT_SYMBOL в коде). Если другой модуль использует этот "символ", то этот модуль непосредственно зависит от первого модуля. Такие зависимости могут быть весьма сложными.
depmod создает список зависимостей модулей, прочитывая каждый модуль в каталоге /lib/modules/версия и определяя, какие символы они экспортируют, а какие символы им нужны. По умолчанию этот список записывается в файл modules.dep в том же каталоге. Если в командной строке задано имя_файла, то проверяются только эти модули (что иногда может быть полезно, если перечислены не все модули).
Если указана версия, то используется каталог модулей указанной версии ядра, а не версии текущего ядра (возвращаемой командой "uname -r").
depmod в том же каталоге так же генерирует различные map-файлы, которые используются инфраструктурой горячего подключения (hotplug).
ОПЦИИ
-a --all Проверять все модули. Опция включена по умолчанию, если в командной строке не указаны имена файлов. -A --quick Эта опция проверяет, не является ли какой-либо модуль более новым, чем файл modules.dep, прежде чем приступить к работе. Если файл modules.dep свежее модулей, то программа не будет повторно генерировать файлы, а без предупреждений завершит работу. -b основной_каталог --basedir основной_каталог Если ваши модули находятся не в (обычном) каталоге /lib/modules/версия, а в другом месте, можно указать основной_каталог, который будет предпочтён обычному каталогу. Этот основной_каталог будет вырезан из результирующего файла modules.dep, так что файл будет готов к перемещению в обычное место расположения. -C --config файл или каталог Эта опция заменяет файл конфигурации по умолчанию (/etc/depmod.conf или /etc/depmod.d/), если он не был найден. -e --errsyms В сочетании с опцией -F, эта опция докладывает обо всех символах, которые требуются необходимому модулю, но не предоставляются другими модулями или ядром. Обычно предполагается, что любые символы не предоставляемые модулями, предоставляются ядром (что должно быть верно в идеальном мире). -F --filesyms System.map Указать файл System.map, созданный при сборке ядра, который позволяет опции -e сообщать обо всех неразрешённых символах. -h --help Вывести краткую справку и завершить работу. -n --dry-run Эта опция отправит получившийся modules.dep, а затем и различные map-файлы на стандартный вывод, а не запишет их в каталог модулей. -v --verbose В подробном режиме depmod будет выводить (на стандартный вывод) все символы-зависимости каждого модуля и имена файлов модулей, которые предоставляют эти символы. -V --version Отобразить версию программы и завершить работу. Обратите внимание на следующие предостережения о запуске на старых ядрах.
ОБРАТНАЯ СОВМЕСТИМОСТЬ
Эта версия depmod предназначена для ядер версий 2.5.48 и выше. Если обнаружено ядро, поддерживающее модули в старом стиле или указана версия ниже 2.5.48, то программа попытается запустить depmod.old, что приводит к полной прозрачности поведения программы для пользователя.
АВТОРСКОЕ ПРАВО
Эта страница руководства: Copyright 2002, Расти Рассел (Rusty Russell), корпорация IBM.
В заключительном отрывке второй части описаны основы управление модулями ядра Linux. Этот минимум неплохо знать всякому пользователю, однако, не стоит надеяться обнаружить в этом руководстве для начинающих информацию по сборке и конфигурированию модулей ядра.
Навигация по основам Linux от основателя Gentoo:
Часть I
Часть II
-
(вступление)
- Модули ядра (итоги и ссылки)
Часть III: 1, 2, 3, 4
Модули ядра
Знакомьтесь, «uname»
Команда uname дает множество интересной информации о вашей системе. Вот пример вывода на моей рабочей машине, после того, как я набрал uname -a, что говорит команде uname напечатать всю имеющуюся информацию:
Подробнее о uname
Теперь, давайте посмотрим, какую же информацию о системе может дать uname
Интригующе! А что напечатает uname -a у вас?
Релиз ядра
А теперь небольшой трюк. Для начала выполните uname -r чтобы программа напечатала релиз ядра, которое работает в данный момент.
Теперь посмотрите в директорию /lib/modules и — опа! — Я уверен, что вы обнаружили каталог с точно таким же именем! OK, никакой магии, теперь самое время поговорить о значении каталогов в /lib/modules, а также объяснить, что такое модули ядра.
Ядро Linux это сердце того, что обычно называют «Linux» — это кусок кода, который напрямую взаимодействует с вашим железом и абстрагирует от него обычные программы. Благодаря ядру, вашему текстовому редактору не нужно беспокоиться на какой диск, SCSI или IDE, а может даже в RAM, он производит запись. Редактор просто записывает в файловую систему, а ядро заботится обо всем остальном.
Введение в модули ядра
Итак, что такое модули ядра? Они представляют собой часть ядра, которая сохраняется на диске в специальном формате. По вашей команде, они подгружаются в работающее ядро и добавляют в него новую функциональность.
Поскольку модули ядра загружаются по требованию, вы можете иметь ядро поддерживающее дополнительную функциональность, которая в обычном состоянии будет выключена и недоступна.
Но «раз в сто лет», эти модули окажутся очень полезными и смогут быть загружены — часто автоматически — для поддержки диковинной файловой системы или устройства, которое вы редко используете.
Модули ядра вкратце
В общем, модули ядра позволяют по требованию добавить возможностей в работающее ядро. Без модулей, вам бы пришлось компилировать новое ядро и перезагружаться для того, чтобы добавить поддержку чего-нибудь нового.
lsmod
Для просмотра загруженных модулей на вашей системе используйте команду lsmod:
Список модулей
Как видите, на моей системе загружено достаточно немного модулей. vmnet и vmmon модули, обеспечиваю необходимую функциональность для VMWare Workstation, которая позволяет мне запускать виртуальные машины в окне рабочего стола. Модуль nvidia выпущен NVIDIA corporation и позволяет использовать 3D-ускорение в Linux.
Дальше у меня есть набор модулей, которые используются для поддержки USB устройств ввода — mousedev, hid, usbmouse, input, usb-ohci, ehci-hcd и usbcore. Имеет смысл сконфигурировать ваше ядро для поддержки USB модулей. Почему? Потому что USB девайсы это «plug and play» (подключай и работай) девайсы и если у вас есть поддержка USB в модулях, вы можете спокойно пойти и купить новое USB устройство, подключить его, и ваша система автоматически загрузит соответствующие модули для этого устройства. Это удобный способ сделать что-то.
Сторонние модули
Завершают этот список модули: emu10k1, ac97_codec и sound, которые вместе обеспечиваю поддержку моей звуковой карты Audigy.
Следует отметить, некоторые из моих модулей доступны прямо в исходниках ядра. Например, все USB-модули были скомпилированы из стандартных исходных текстов ядра Linux. Однако, nvidia, emu10k1 и VMWare-модули были получены из других источников. Это подчеркивает другую важную особенность модулей ядра — возможность сторонних производителей добавлять необходимую функциональность в ядро и включать ее прямо в запущенное ядро. Без перезагрузки.
depmod и компания
В моей папке /lib/modules/2.4.20-gaming-r1/, есть несколько
файлов которые начинаются со строки «modules.»:
Эти файлы содержат множество информации о различных зависимостях. В том числе, они содержат информацию о зависимостях для модулей — некоторые модули требуют загрузки других модулей перед тем как быть запущенными.
Как получить модули
Некоторые модули ядра разработаны для работы со специальными устройствами, как например emu10k1 — модуль для поддержки моей звуковой карты. Для этого типа модулей, приведенные выше файлы включают также информацию о PCI IDs и прочие идентификационные метки оборудования, которое они поддерживают. Эта информация может быть использована различными скриптами, например «hotplug» (который мы рассмотрим в следующих руководствах) для автоматического определения оборудования и загрузки соответствующих модулей.
Использование depmod
Информация о зависимостях может становиться не актуальной, особенно в случае установки новых модулей. Чтобы ее обновить, просто введите depmod -a. Программа depmod просканирует модули из вашей папки /lib/modules и обновит информацию о зависимостях. Она делает это сканируя модули в /lib/modules и проверяя так называемые «symbols» внутри модулей.
Расположение модулей ядра
Итак, как выглядят модули ядра? Для ядра 2.4, все файлы модулей обычно находятся в /lib/modules и имеют имя оканчивающееся на ".o" (для 2.6 ".ko" — прим. ред.). Чтобы увидеть все модули из /lib/modules, введите следующее:
insmod vs. modprobe
Итак, как же подгрузить модуль в работающее ядро? Один из вариантов, использовать команду
insmod и указать ей полный путь к модулю, который вы хотите загрузить:
Хотя, обычно модули загружают используя команду modprobe. Одна из приятных вещей, которую делает modprobe это автоматическая загрузка всех необходимых зависимостей для данного модуля. Кроме того, вам не нужно указывать полный путь и расширение загружаемого модуля.
rmmod и modprobe в действии
Давайте выгрузим наш модуль fat.o и загрузим его обратно используя modprobe:
Как видите, работа команды rmmod очень похожа на работу modprobe, но имеет противоположный эффект — она выгружает указанный модуль.
Ваши помощники modinfo и modules.conf
Можете воспользоваться командой modinfo, чтобы узнать пару интересных вещей о своих любимых модулях:
Также обратите внимание на файл /etc/modules.conf. Он содержит настройки для modprobe и позволяет изменять поведение modprobe. Например, указывать какие модули загруть до/после загрузки остальных, запускать скрипты до и после загрузки модуля, и многое другое.
Структура modules.conf
Синтаксис и функциональность modules.conf достаточно сложны, и мы не будем в них сейчас углубляться (наберите man modules.conf чтобы узнать все подробности), но есть несколько вещей, которые вы должны знать об этом файле.
Во-первых, многие дистрибутивы генерируют этот файл автоматически из набора файлов в других директориях, таких как /etc/modules.d/. Например, в Gentoo Linux есть такая папка, и запуск команды update-modules прочитает все файлы из /etc/modules.d/ и объединит их в новый /etc/modules.conf. Поэтому, сделав свои изменения в файлах из /etc/modules.d/ запустите update-modules, если вы используете Gentoo. В Debian, процедура очень похожа, за исключением того, что папка называется /etc/modutils/.
Для ядер версии 2.6 аналогичные по функциональности файл и папка из каталога etc называются modprobe.conf и modprobe.d соответственно. Синтаксис там упрощен, смотрите man modprobe.conf
— Примечание редактора.
Итоги и ресурсы
Итоги
Ресурсы
Говоря о сертификации LPIC, если вы действительно в ней заинтересованы, то я настоятельно рекомендую вам изучить следующие источники, которые были тщательно выбраны для расширения знаний полученных в этом руководстве.
В сети есть множество хороших руководств по регулярным выражениям. Вот парочка:
В серии Bash в примерах (будет перевод), я покажу вам как использовать инструкции bash для написания ваших собственных скриптов. Это серия (особенно первая и вторая части) будет хорошей подготовкой к экзамену LPIC Level 1:
Вы можете узнать больше о sed в серии руководств Sed в примерах (будет переведено). Если вы планируете сдавать LPI экзамен, убедитесь что прочитали первые две части этой серии.
Чтобы узнать больше об awk, обратитесь к серии Awk в примерах (перевод будет).
Если вы не знакомы с редактором vi, Я настоятельно рекомендую вам посмотреть мое руководство Vi - the cheat sheet method. Этот учебник станет легким, но и стремительным введением в этот мощный текстовый редактор. Считайте, что это материал необходимый к прочтению, если вы не знаете как пользоваться vi.
Об авторах
Daniel Robbins
Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.
Chris Houser
Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.
Aron Griffis
Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».
Читайте также: