При помощи какой утилиты можно просмотреть загруженные модули ядра ос linux
Перейти к содержимому

При помощи какой утилиты можно просмотреть загруженные модули ядра ос linux

  • автор:

Kernel module (Русский)

Модули ядра — это отдельные кусочки кода, которые могут быть загружены и выгружены из ядра по мере необходимости. Они расширяют функциональность ядра без необходимости перезагрузки системы.

Чтобы создать модуль ядра, вы можете прочитать The Linux Kernel Module Programming Guide. Модуль можно сконфигурировать как вкомпилированный, а можно как загружаемый. Чтобы иметь возможность динамически загружать или выгружать модуль, его необходимо сконфигурировать как загружаемый модуль в настройке ядра (в этом случае строка, относящаяся к модулю должна быть отмечена буквой M ).

Получение информации

Модули хранятся в /usr/lib/modules/kernel_release . Чтобы узнать текущую версию вашего ядра, используйте команду uname -r .

Чтобы узнать, какие модули ядра загружены в настоящий момент:

Чтобы показать информацию о модуле:

Чтобы вывести список опций, с которыми загружен модуль:

Чтобы отобразить настройки для всех модулей:

Чтобы отобразить настройки для отдельного модуля:

Чтобы узнать зависимости модуля (или его псевдонима), включая сам модуль:

Автоматическая загрузка модулей с помощью systemd

Сегодня все необходимые загрузки модулей делаются автоматически с помощью udev, поэтому если вам не нужно загружать какие-либо модули, не входящие в стандартное ядро, вам не придётся прописывать модули, требующиеся для загрузки в каком-либо конфигурационном файле. Однако, бывают случаи, когда вам необходимо загружать свой модуль в процессе загрузки или наоборот не загружать какой-то стандартный модуль, чтобы ваш компьютер правильно функционировал.

Чтобы дополнительные модули ядра загружались автоматически в процессе загрузки, создаются статические списки в конфигурационных файлах в директории /etc/modules-load.d/ . Каждый конфигурационный файл называется по схеме /etc/modules-load.d/program.conf . Эти файлы просто содержат список названий модулей ядра, которые необходимо грузить, разделённых переносом строки. Пустые строки и строки, в которых первым непробельным символом является # или ; , игнорируются.

Смотрите modules-load.d(5) для дополнительной информации.

Управление модулями вручную

Управление модулями ядра производится с помощью утилит, предоставляемых пакетом kmod . Вы можете использовать эти утилиты вручную.

Загрузка модуля из другого места (для тех модулей, которых нет в /usr/lib/modules/$(uname -r)/ ):

Альтернативный вариант выгрузки модуля:

Настройка параметров модуля

Чтобы передать параметр модулю ядра, вы можете прописать их вручную для команды modprobe, создать файл конфигурации modprobe, который будет гарантировать, что параметры будут применяться всегда, или использовать командную строку ядра.

Вручную при загрузке с помощью modprobe

Основной способ передать параметры модулю — использовать команду modprobe. Параметры указываются с помощью простых присваиваний ключ=значение :

С помощью файлов в /etc/modprobe.d/

Файлы в директории /etc/modprobe.d/ можно использовать для передачи настроек модуля в udev, который через modprobe управляет загрузкой модулей во время загрузки системы. Конфигурационные файлы в этой директории могут иметь любое имя, оканчивающееся расширением .conf . Синтаксис следующий:

С помощью командной строки ядра

Если модуль вкомпилирован в ядро, вы также можете передать параметры модулю с помощью командной строки ядра. Для всех стандартных загрузчиков, подойдёт следующий синтаксис:

Просто добавьте это в загрузчике в строку с ядром, как описано в статье Параметры ядра.

Создание псевдонимов

Псевдонимы (алиасы) — это альтернативные названия для модуля. Например: alias my-mod really_long_modulename означает, что вы можете использовать modprobe my-mod вместо modprobe really_long_modulename . Вы также можете использовать звёздочки в стиле shell, то есть alias my-mod* really_long_modulename будет иметь тот же эффект, что и modprobe my-mod-something . Создайте алиас:

У некоторых модулей есть алиасы, которые используются для их автоматической загрузки, когда они потребуются определённой программе. Отключение этих алиасов может предотвратить их автоматическую загрузку, при этом остаётся возможность из загрузки вручную.

Запрет загрузки

В терминах модулей ядра blacklisting означает механизм, предотвращающий загрузку какого-то модуля. Это может понадобиться, например если вам не нужна работа какого-то оборудования или если загрузка данного модуля вызывает проблемы: например, могут быть два модуля ядра, которые пытаются управлять одним и тем же оборудованием, и их совместная загрузка приводит к конфликту.

Некоторые модули загружаются как часть initramfs. Команда mkinitcpio -M напечатает все автоматически обнаруженные модули: для предотвращения initramfs от загрузки каких-то из этих модулей, занесите их в чёрный список в файле .conf в каталоге /etc/modprobe.d/ , и хук modconf добавит этот файл в образ initramfs при его генерации. Команда mkinitcpio -v отобразит все модули, которые необходимы некоторым хукам (например, filesystems хук, block хук и т.д.). Если вы не используете хук modconf , то не забудьте добавить нужный вам .conf файл в секцию FILES в /etc/mkinitcpio.conf . После того, как вы запретили загрузку модулей, пересоберите initramfs, а затем перезагрузитесь.

С помощью файлов в /etc/modprobe.d/

Создайте .conf файл в /etc/modprobe.d/ и добавьте строку для каждого модуля, который вы хотите запретить, используя ключевое слово blacklist . Например, если вы хотите запретить загружать модуль pcspkr :

Можно изменить такое поведение. Команда install заставляет modprobe запускать вашу собственную команду вместо вставки модуля в ядро как обычно. Поэтому вы можете насильно сделать так, чтобы модуль никогда не загружался:

Это запретит данный модуль и все модули, зависящие от него.

С помощью командной строки ядра

Вы также можете запрещать модули из загрузчика.

Просто добавьте module_blacklist=модуль1,модуль2,модуль3 в вашем загрузчике в строку ядра, как описано в статье Параметры ядра.

Решение проблем

Модули не загружаются

В случае, если конкретный модуль не загружается и журнал загрузки (доступный с помощью journalctl -b ) говорит, что модуль в чёрном списке, но в директории /etc/modprobe.d/ нет соответствующей записи, проверьте другую папку-источник modprobe в /usr/lib/modprobe.d/ на записи в чёрном списке.

Модуль не будет загружен, если строка «vermagic», содержащаяся в модуле ядра, не соответствует значению текущего запущенного ядра. Если достоверно известно, что модуль совместим с текущим запущенным ядром, проверку «vermagic» можно отключить с помощью modprobe —force-vermagic .

HackWare.ru

Этичный хакинг и тестирование на проникновение, информационная безопасность

Модули ядра Linux

Оглавление

Что такое модули ядра

Модули ядра — это фрагменты кода, которые могут быть загружены и выгружены в ядро по требованию. Они расширяют функциональность ядра без необходимости перезагрузки системы. Модуль может быть настроен как встроенный в ядро или загружаемый во время работы операционной системы.

Примеры модулей ядра — это драйверы различных устройств.

В этой статье вы узнаете:

  • как узнать, какие модули ядра запущены (загружены)
  • как узнать, какой используется драйвер для указанного устройства и как получить информацию о данном драйвере
  • как надёжно отключит устройства (например, сетевые карты, веб камеры и другие), чтобы их невозможно было включить и использовать
  • как попробовать новый драйвер без его установки в систему

Получение информации о модулях

Модули храняться в директории /usr/lib/modules/ВЫПУСК_ЯДРА. Текущую папку с модулями можно узнать командой:

Имена модулей часто содержат символы подчёркивания (_) или дефисы (); при этом данные символы являются взаимозаменяемыми в командах modprobe и в конфигурационных файлах в директории /etc/modprobe.d/.

Команда lsmod показывает драйверы и другие модули, которые загружены в данный момент. Чтобы увидеть, какие модули загружены в данный момент, выполните:

На самом деле, это одно и то же. Информация считывается из /proc/modules и данные команды только выводят её в более понятном для восприятия виде.

Для показа информации о модуле используется команда modinfo:

Если вы получили ошибку:

То запустите modinfo с sudo.

К примеру, чтобы узнать информацию о модуле iwlwifi:

Как понять вывод modinfo

Вывод modinfo обширен и содержит много информации.

Строка «filename» показывает полный путь до файла модуля.

В строке «author» содержится информация о создателе модуля, например, «Copyright(c) 2003- 2015 Intel Corporation <linuxwifi@intel.com>»

В строке «description» описание модуля, например, «Intel(R) Wireless WiFi driver for Linux».

Рассмотрим, как интерпретировать строки

  • firmware
  • alias
  • intree
  • vermagic

на примере модуля i915

firmware:

Многим устройствам для правильной работы нужны две вещи: драйвер и прошивка. Драйвер запрашивает прошивку из файловой системы в /lib/firmware. Это специальный файл, необходимый для аппаратного обеспечения, это не бинарный файл. Затем дайвер делает всё, что нужно для загрузки прошивки в устройство. Прошивка выполняет программирование оборудования внутри устройства.

alias:

Эту запись можно разделить на части символами двоеточия (:)

  • pci: тип устройства, pci или usb
  • v00008086: v обозначает идентификатор поставщика, он идентифицирует производителя оборудования. Этот список поддерживается Специальной группой интересов PCI (PCI Special Interest Group). Номер 0x8086 означает «Корпорация Intel».
  • d00005A84: d обозначает идентификатор устройства, выбранный производителем. Этот идентификатор обычно соединяется с идентификатором поставщика, чтобы создать уникальный 32-битный идентификатор для аппаратного устройства. Официального списка нет.
  • sv*, sd*: версия поставщика подсистемы и версия устройства подсистемы для дальнейшей идентификации устройства (* указывает, что оно будет соответствовать чему угодно)
  • bc03: базовый класс. Это определяет, что это за устройство; Интерфейс IDE, контроллер Ethernet, контроллер USB, … bc03 означает контроллер дисплея. Вы можете заметить их из вывода lspci, потому что lspci сопоставляет число и класс устройства.
  • sc*: подкласс базового класса.
  • i*: интерфейс

intree:

Все модули ядра начинают свои разработки как вне дерева. Как только модуль принимается для включения, он становится модулем внутри дерева. Модули без этого флага (установленного в N) могут испортить ядро.

vermagic:

При загрузке модуля строка vermagic проверяются на совпадение с текущей версией ядра. Если они не совпадают, вы получите ошибку, и ядро откажется загружать модуль. Вы можете преодолеть это, используя в modprobe флаг —force. Естественно, эти проверки существуют для вашей защиты, поэтому использование этой опции опасно.

Для вывода списка опций, установленных для загруженного модуля:

Если вы получили ошибку:

То установите пакет sysfsutils.

Пример вывода для модуля iwlwifi:

Для отображения полной конфигурации всех модулей:

Чтобы отобразить конфигурацию определённого модуля:

Чтобы перечислить зависимости модуля (или псевдонима), включая сам модуль:

Автоматическая загрузка модуля с помощью systemd

Сегодня загрузка всех необходимых модулей выполняется udev автоматически, поэтому нет необходимости помещать модули в какой-либо файл конфигурации. Однако в некоторых случаях вам может потребоваться загрузить дополнительный модуль во время процесса загрузки компьютера или добавить в чёрный список другой модуль для правильной работы компьютера.

Модули ядра могут быть явно перечислены в файлах в /etc/modules-load.d/ для systemd, чтобы загрузить их во время включения компьютера. Каждый файл конфигурации имеет имя в стиле /etc/modules-load.d/<program>.conf. Файлы конфигурации просто содержат список имён модулей ядра для загрузки, разделённых символами новой строки. Пустые строки и строки, чей первый непробельный символ — # (решётка) или ; (точка с запятой) игнорируются

Пример файла /etc/modules-load.d/virtio-net.conf

Кроме указанной директории, также считываются файлы конфигурации из /run/modules-load.d/*.conf и /usr/lib/modules-load.d/*.conf.

Обратите внимание, что обычно лучше полагаться на автоматическую загрузку модулей с помощью идентификаторов PCI, USB-идентификаторов, идентификаторов DMI или аналогичных триггеров, закодированных в самих модулях ядра, вместо статической конфигурации, подобной этой. Фактически, большинство современных модулей ядра уже подготовлены для автоматической загрузки.

Ручная обработка модуля (включение и отключение модулей и драйверов)

Модули ядра обрабатываются инструментами, предоставляемыми пакетом kmod. Вы можете использовать эти инструменты вручную.

Примечание. Если вы обновили ядро, но ещё не перезагрузили компьютер, modprobe завершится с ошибкой без сообщения об ошибке и выйдет с кодом 1, поскольку путь /usr/lib/modules/$(uname -r)/ больше не существует.

Чтобы загрузить модуль применяется команда вида:

Чтобы загрузить модуль по имени файла (то есть, тот, который не установлен в /usr/lib/modules/$(uname -r)/):

Для выгрузки (выключения) модуля:

Или альтернативная команда:

Как задействовать драйвер без его установки

Рассмотрим реальный пример, когда может пригодиться запуск драйвера из файла.

Эти драйвера предназначены для работы таких современных карт с поддержкой стандарта Wi-Fi AC как:

  • Alfa AWUS1900 (чипсет: Realtek RTL8814AU)
  • TRENDnet TEW-809UB (чипсет: Realtek RTL8814AU)
  • ASUS USB-AC68 (чипсет: Realtek RTL8814AU)
  • Alfa AWUS036ACH (чипсет: Realtek RTL8812AU)
  • Alfa AWUS036AC (чипсет: Realtek RTL8812AU)
  • ASUS USB-AC56 (чипсет: Realtek RTL8812AU)

Эти драйвера поддерживают режим монитора и беспроводную инъекцию, то есть подходят для аудита безопасности Wi-Fi сетей на 2.4 и 5 Ghz, в том числе с поддержкой Wi-Fi стандарта AC.

В принципе, в репозиториях Kali Linux уже имеется данный драйвер:

Но его версия 5.6.4. Но уже доступна версия 5.7.0. Предположим, мы хотим попробовать версию 5.7.0 без установки её в систему.

Итак, удаляем версию из репозитория (если она была установлена)

Проверим, что модуль не загружен:

И при попытке его загрузить возникает ошибка:

модуль не найден:

Или такая ошибка:

То есть, неизвестный символ в модуле. Суть такая же — модуль не найден, но ранее существовал, поэтому от него остались упоминания в списках зависимостей.

Установим зависимости, необходимые для компиляции данного драйвера:

Клонируем репозиторий — обратите внимание на использование опции -b с которой указана интересующая нас ветка (в данном случае название ветки совпадает с версией драйвера):

Компилируем, но не делаем установку, поскольку мы в принципе не хотим устанавливать этот модуль:

У нас есть два способа загрузить (включить) модуль — с помощью insmod или с помощью команды modprobe. Команда insmod удобнее, т. к. можно указать скомпилированный файл драйвера, а команда modprobe лучше обрабатывает зависимости, поэтому рассмотрим оба варианта.

Загрузка модуля без установки (используя insmod)

Для включения модуля из файла используйте команду вида:

Файлы модулей имеют расширение .ko, в нашем случае имя файла 88XXau.ko, поэтому команда следующая:

Проверяем, был ли загружен модуль:

Первая строка показывается, что модуль 88XXau загружен, а в последующих строках показаны модули, которые использует 88XXau (то есть которые являются для него зависимостями).

Загрузка модуля без установки (используя modprobe)

Второй вариант чуть более сложный в настройке, но для загрузки модуля не нужно указывать полный путь до файла драйвера.

Выгрузим модуль, если он был загружен ранее:

Теперь мы сделаем так, что система будет думать, что модуль установлен, хотя на самом это не так. Для этого мы создадим символическую ссылку от файла .ko в папку /lib/modules/`uname -r`:

В нашем случае для этого нужно выполнить такую команду:

Обновим список зависимостей всех модулей (кстати, ключ -a в следующей команде можно пропускать, т.к. он предполагается по умолчанию):

Теперь для загрузки модуля можно использовать обычную команду modprobe:

Проверим версию модуля:

Обратите внимание на строки:

Используется версия v5.7.0 — именно этого мы и добивались.

Описанные методы запуска модулей подходят для единоразового или эпизодического запуска драйверов. Для постоянного использования рекомендуется выполнить нормальную установку модуля, в этом случае он будет поддерживать DKMS.

Драйверы можно установить с помощью DKMS. Это система, которая автоматически перекомпилирует и устанавливает модуль ядра при установке или обновлении нового ядра. Чтобы использовать DKMS, установите пакет dkms.

С помощью DKMS устанавливаются драйверы из официальных репозиториев. Также с помощью DKMS можно установить и драйверы из прочих репозиториев (например, rtl8812au, который чуть выше был взять в качестве примера, это поддерживает) — для этого следуйте официальным инструкциям по установке от разработчиков, а описанный чуть выше метод запуска драйвера без установки предназначен для тестирования.

Запрет на включение модулей (чёрный список модулей)

Чёрный список в контексте модулей ядра — это механизм, предотвращающий загрузку модуля ядра. Это может быть полезно, если, например, связанное оборудование не требуется или если загрузка этого модуля вызывает проблемы: например, могут быть два модуля ядра, которые пытаются управлять одним и тем же компонентом оборудования, и загрузка их вместе приведёт к конфликту.

Использование файлов в /etc/modprobe.d/

Создайте файл .conf внутри /etc/modprobe.d/ и добавьте строку для каждого модуля, который вы хотите добавить в черный список, используя ключевое слово blacklist. Например, если вы хотите запретить загрузку модуля pcspkr, создайте файл /etc/modprobe.d/nobeep.conf и добавьте в него строку:

Некоторые модули загружаются как часть initramfs. То есть можно выделить модули, которые:

  • загружаются из файлов .ko
  • загружаются как часть initramfs (initial ramdisk)

Для запрета загрузки модулей первого типа (загружаемые из файлов .ko) достаточно внести запись об этом модуле в файл /etc/modprobe.d/*.conf с директивой blacklist.

Для модулей второго типа (загружаемые как часть initramfs), кроме создания конфигурационного файла, также необходимо пересоздать initramfs.

Примечание: initramfs (initial ramdisk) — это начальная среда ramdisk для загрузки ядра Linux. Начальный ramdisk — это, по сути, очень маленькая среда (раннее пользовательское пространство), которая загружает различные модули ядра и настраивает необходимые вещи перед передачей управления init. Это позволяет, например, иметь зашифрованные корневые файловые системы и корневые файловые системы на программном массиве RAID.

Примечание. Команда blacklist внесёт модуль в чёрный список, чтобы он не загружался автоматически. Но при этом модуль может быть загружен, если от него зависит другой модуль, не включенный в чёрный список, а также по прежнему можно загрузить модуль вручную. Тем не менее есть обходной путь для этого поведения; Команда install указывает modprobe запускать пользовательскую команду вместо того, чтобы как обычно вставлять модуль в ядро, поэтому вы можете принудительно заставить модуль всегда не загружаться с помощью рассмотренной далее конструкции. Допустим, вы создали файл /etc/modprobe.d/blacklist.conf чтобы заблокировать загрузку модуля ИМЯ_МОДУЛЯ. Чтобы это сделать надёжно, добавьте в этот файл:

Это надёжно заблокирует загрузку указанного модуля, а также любого другого, зависящего от него.

Как пересоздать initramfs для блокировки модулей

Если вы блокируете модули, которые загружаются из initramfs, то после их добавления в файл /etc/modprobe.d/*.conf, необходимо пересоздать initramfs.

На Debian, Kali Linux, Linux Mint, Ubuntu и их производных это делается так:

В Arch Linux, BlackArch и их производных это делается так:

В Arch Linux команда

распечатает все автоматически обнаруженные модули: чтобы предотвратить загрузку некоторых из этих модулей initramfs, внесите их в чёрный список в файле .conf в /etc/modprobe.d, и он будет добавлен хуком modconf во время генерации образа. Запуск

выведет список всех модулей, задействованных различными хуками (например, хук filesystems, хук block и т. д.).

Блокировка модулей в начале загрузки Linux (отключение модулей в командной строке ядра)

Это может быть очень полезно, если неисправный модуль делает невозможным загрузку вашей системы. Вы можете занести в чёрный список модули в меню загрузчика. Просто добавьте

в строку с параметрами загрузки ядра.

Примеры редактирования параметров загрузки ядра для популярных дистрибутивов вы найдёте в статье «Как в Linux сбросить забытый пароль входа». Также смотрите статью «Как изменить параметры загрузки Linux в UEFI».

Примечание. Если вы заносите в чёрный список более одного модуля, имейте в виду, что они разделены только запятыми. Пробелы или что-либо ещё могут нарушить синтаксис.

Рассмотрим практические примеры, когда пользователю может понадобиться блокировать загрузку модулей ядра.

Как заблокировать все сетевые интерфейсы на компьютере

Предположим, необходимо, чтобы на компьютере была заблокирована любая сетевая активность, то есть и проводные, и беспроводные сети. Существует команда rfkill, но она предназначена для блокировки только беспроводных сетей. Поэтому найдём другой способ.

Алгоритм действий следующий:

  1. Мы определим, какие драйверы используются сетевыми устройствами
  2. Заблокируем эти драйверы

Чтобы узнать, какие драйверы задействованы в Linux для работы сетевых карт, выполните команду:

Строки «configuration:» содержат информацию о драйверах. Для беспроводной карты это «driver=iwlwifi», а для проводного сетевого интерфейса это «driver=r8169».

Создаём файл /etc/modprobe.d/block-network.conf и добавляем в него:

Так выглядит настройка сети в нормальном состоянии, виден проводной и беспроводной адаптеры:

После перезагрузки невозможно будет включить сеть, поскольку компьютер не сможет использовать сетевые интерфейсы без драйверов:

При попытке загрузить модули вручную, например:

Эти модули не будут загружаться благодаря команде install.

Вы не сможете включить любую сеть вплоть до удаления файла /etc/modprobe.d/block-network.conf и перезагрузки. Тем не менее при подключении других сетевых адаптеров, они будут использоваться. Данный способ надёжно защитит от случайного использования сети при условии, что вы контролируете подключение новых физических устройств к компьютеру.

Как надёжно выключить веб камеру

На некоторых новых моделях ноутбуков веб камеру можно закрыть шторкой — на тот случай, если вы опасаетесь, что хакер может взломать ваш компьютер и следить за вами.

Сейчас мы научимся отключать драйвер веб камеры, чтобы её невозможно было использовать.

Даже если у вас ноутбук, скорее всего, веб камера подключена внутри корпуса к USB хабу, то есть это USB устройство. Вывести список USB устройств в системе можно командой:

Обратите внимание на IMC Networks USB2.0 HD UVC WebCam в приведённом списке — это и есть веб камера ноутбука.

Чтобы определить драйверы, которые нужны для работы любого USB или с PCI устройства в вашей системе, обратитесь к статье «Как узнать, какие модули (драйверы) связаны с USB и PCI устройствами».

Воспользуемся следующей командой:

Видим, что для устройства USB2.0 HD UVC WebCam используется драйвер uvcvideo.

Создаём файл /etc/modprobe.d/block-webcam.conf и блокируем в нём запуск модуля ядра uvcvideo:

После перезагрузки система не сможет использовать вебкамеру, пока не будет удалён файл block-webcam.conf и выполнена перезагрузка.

Как отключить Bluetooth без возможности подключения

Модуль ядра bluetooth включён в ядро, поэтому удалением каких-то пакетов вроде bluez и blueman задачу отключения Bluetooth не решить — если удалить указанные пакеты у нас не будет инструментов и графических апплетов для наблюдением за Bluetooth, но это не означает, что на уровне ядра не будет выполнятся подключение Bluetooth устройств (например, USB адаптера Bluetooth), либо периферийные устройства не будут сопрягаться.

Как можно убедиться, апплет blueman, а следовательно и Bluetooth работают.

Для отключения модуля bluetooth создайте файл /etc/modprobe.d/blacklist.conf:

и копируйте в него следующее:

Чтобы изменения вступили в силу, перезагрузите компьютер.

Как можно убедиться, Bluetooth больше не работает:

Настройка параметров модуля

Чтобы передать параметр в модуль ядра, вы можете передать их вручную с помощью modprobe или убедиться, что определённые параметры всегда применяются с помощью файла конфигурации modprobe или с помощью командной строки ядра.

Вручную во время загрузки, используя modprobe

Основной способ передачи параметров в модуль — использование команды modprobe. Параметры указываются в командной строке с использованием простых назначений ключ=значение:

Используя файлы в /etc/modprobe.d/

Файлы в каталоге /etc/modprobe.d/ можно использовать для передачи настроек модуля в udev, который будет использовать modprobe для управления загрузкой модулей во время загрузки системы. Файлы конфигурации в этом каталоге могут иметь любое имя, если они заканчиваются расширением .conf, например /etc/modprobe.d/myfilename.conf. Синтаксис:

Например, содержимое файла /etc/modprobe.d/thinkfan.conf:

Добавление опций модуля во время загрузки системы (ииспользование командной строки ядра)

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

Псевдонимы

Псевдонимы — это альтернативные имена для модуля. Например:

означает, что вы можете использовать

Вы также можете использовать подстановочные знаки в стиле оболочки, поэтому

имеет тот же эффект.

Чтобы создать псевдоним в конфигурационном файле /etc/modprobe.d/myalias.conf:

Некоторые модули имеют псевдонимы, которые используются для автоматической их загрузки, когда они нужны приложению. Отключение этих псевдонимов может предотвратить автоматическую загрузку, но все равно позволит загружать модули вручную.

Пример файла /etc/modprobe.d/modprobe.conf

Ошибки при работе с модулями

Модули не загружаются

Если определённый модуль не загружается и в журнале загрузки

говорится, что модуль находится в чёрном списке, но в каталоге /etc/modprobe.d/ нет соответствующей записи, проверьте другую папку modprobe на наличие записи о занесении в чёрный список: /usr/lib/modprobe.d/.

Модуль не будет загружен, если строка «vermagic», содержащаяся в модуле ядра, не соответствует значению текущего запущенного ядра. Если известно, что модуль совместим с текущим работающим ядром, проверку "vermagic" можно игнорировать с помощью modprobe —force-vermagic.

Предупреждение. Игнорирование проверок версий для модуля ядра может привести к сбою ядра или непредсказуемому поведению системы из-за несовместимости. Используйте —force-vermagic только с максимальной осторожностью.

modprobe: ERROR: could not insert '…': Unknown symbol in module, or unknown parameter (see dmesg)

Ошибка вызвана тем, что ранее модуль присутствовал в системе и о нём оставлена запись в списке зависимостей, но на момент ошибки модуль отсутствует (удалён).

Для обновления списка зависимостей выполните команду:

Ещё одна возможная причина ошибки — не загружена зависимость, требуемая для модуля. Например, для Wi-Fi адаптеров обязательной зависимостью является cfg80211, чтобы загрузить этот модуль, выполните команду:

modprobe: FATAL: Module … not found in directory /lib/modules/…

Означает, что модуль, который вы пытаетесь запустить, не существует.

  • описка в названии модуля
  • не установлен или удалён содержащий указанный модуль пакет

Если ранее модуль (драйвер) запускался, но затем появилась указанная ошибка, то она может быть связана с тем, что было обновлено ядро, а модуль для новой версии ядра не был скомпилирован.

Модули ядра Linux

Как вы знаете из статьи что такое ядро Linux, ядро является монолитным. Это значит, что весь исполняемый код сосредоточен в одном файле. Такая архитектура имеет некоторые недостатки, например, невозможность установки новых драйверов без пересборки ядра. Но разработчики нашли решение и этой проблеме, добавив систему модулей.

Ядро Linux позволяет драйверам оборудования, файловых систем, и некоторым другим компонентам быть скомпилированными отдельно — как модули, а не как часть самого ядра. Таким образом, вы можете обновлять драйвера не пересобирая ядро, а также динамически расширять его функциональность. А еще это значит, что вы можете включить в ядре только самое необходимое, а все остальное подключать с помощью модулей. Это очень просто.

Модули ядра Linux

В этой статье мы рассмотрим модули ядра Linux, основы работы с ними, просмотр уже загруженных модулей, загрузку, установку и отключение модулей. А также полное отключение, добавление в черный список и добавление новых модулей ядра.

Модули ядра Linux собираются только под определенную версию ядра, есть способ запуска модуля независимо от версии ядра, если они совместимы с помощью dkms, но об этом мы поговорим позже.

Находятся все модули в папке /lib/modules/. Учитывая, что модули рассчитаны только для определенной версии ядра, то в этой папке создается отдельная подпапка, для каждой установленной в системе версии ядра. В этой папке находятся сами модули и дополнительные конфигурационные файлы, модули отсортированы по категориям, в зависимости от назначения например:

Перед тем как переходить к практике, давайте коротко рассмотрим основные команды для управления модулями.

  • lsmod — посмотреть загруженные модули
  • modinfo — информация о модуле
  • insmod — загрузить модуль
  • rmmod — удалить модуль

Работа с модулями ядра Linux выполняется, в основном, с помощью этих команд, но могут использовать и другие.

Все модули

Такая задача возникает нечасто, но если вы хотите посмотреть все установленные модули ядра Linux в системе, делается очень просто. Все модули расположены в папке /lib/modules, а поэтому очень просто вычислить их все одной командой, или даже просто зайти в папку файловым менеджером и посмотреть.

В Ubuntu команда будет выглядеть вот так:

dpkg -S *.ko | grep /lib/modules

Можно смастерить такую конструкцию с помощью find:

find /lib/modules -name *.ko

Можем искать только для текущего ядра:

find /lib/modules/$(uname -r) -name *.ko

Также, все модули записаны в конфигурационном файле /lib/modules/modules.aliases, поэтому мы можем просто посмотреть его содержимое:

Если хотим проверить установлен ли определенный модуль ядра Linux, отфильтруем вывод любой из команд с помощью grep:

find /lib/modules -name *.ko | grep vbox

Что загружено?

Все информация о загруженных модулях хранится в файле /proc/modules, мы можем ее вывести командой:

Но для этого дела есть более цивилизованные методы. Это утилита lsmod и modinfo. Чтобы посмотреть загруженные модули ядра linux выполните:

Удобно проверять загружен ли модуль с помощью grep:

sudo lsmod | grep vbox

А более подробную информацию о каждом модуле можно получить с помощью утилиты modinfo:

Здесь вы можете увидеть файл модуля, его лицензию, автора и зависимости. Зависимости — это те модули, которые должны быть загружены для его нормальной работы. К сожалению, не для всех модулей доступно нормальное описание, но вы можете попробовать посмотреть описание зависимостей модуля.

Запуск модулей ядра

Загрузить модуль ядра Linux можно с помощью команд modprobe или insmod. Например, загрузим модуль vboxdrv

sudo modprobe vboxdrv

Чтобы загрузить модуль ядра linux с помощью insmod необходимо передать адрес файла модуля:

sudo insmod /lib/modules/4.1.20-11-default/weak-updates/misc/vboxdrv.ko

Напоминаю, что его можно узнать с помощью команды modinfo. Запуск модуля ядра Linux предпочтительно выполнять с помощью modprobe, поскольку эта команда не только находит файл модуля в файловой системе, но и загружает все его зависимости.

Удаление модулей ядра

Здесь аналогично две команды — modprobe, позволяет удалить модуль если ей передать опцию -r, а также есть команда rmmod. Начнем с modprobe:

sudo modprobe -r vboxdrv

Другая команда в этом случае выглядит немного проще:

sudo rmmod vboxdrv

Если вы получили ошибку во время выгрузки модуля, например: rmmod: ERROR: Module vboxdrv is in use by: vboxnetadp vboxnetflt, значит он еще используется другими модулями, и сначала нужно выгрузить их. В данном случае это vboxnetadp и vboxnetflt. Правильно отработавшая команда не должна ничего возвращать.

rmmod vboxnetadp vboxnetflt

Блокирование загрузки модулей

Иногда, во время загрузки системы для используемых нами устройств, загружаются не те модули ядра Linux, они либо не поддерживают нужную функциональность либо конфликтуют с другими модулями. Ярким примером можно назвать загрузку драйвера b43 вместо brcmsmac для беспроводных адаптеров Broadcom. Чтобы решить эту проблему вы можете добавлять модули в черный список. Для этого достаточно добавить одну строчку в файл /etc/modprobe.d/blacklist.conf:

sudo vi /etc/modprobe.d/blacklist.conf

Этот код добавит в черный список модуль b43.

Автозагрузка модулей

Кроме чёрного списка существует отдельный каталог, в котором можно настроить автоматическую загрузку модулей при старте системы. Это /etc/modules.load.d/. Этот каталог тоже содержит конфигурационные файлы с расширением *.conf, в которых перечислены все модули, которые надо загружать при старте системы. Для добавления своего модуля можно воспользоваться файлом /etc/modules.load.d/modules.conf. Например, добавим brcmsmac:

sudo vi /etc/modules.load.d/modules.conf

Установка модулей ядра Linux

Собранные для этой версии ядра модули вы можете просто скопировать в нужную папку, собственно, мы так и поступаем, когда собираем ядро из исходников. Но с проприетарными драйверами и другими внешними драйверами, не поставляемыми в комплекте с ядром дело обстоит иначе. Эти модули поддерживают несколько версий ядра, но для их установки используется специальная технология — DKMS (Dynamic Kernel Module Support). Причем модуль, установленный таким образом один раз, будет пересобираться для каждой новой версии ядра автоматически. Обычно такие модули поставляются в виде пакетов, которые устанавливаются как и все другие приложения пакетным менеджером. Ручная установка модулей с помощью dkms выходит за рамки данной статьи.

Выводы

Скорее всего, вам редко придется возиться с этими модулями. Но работа с модулями ядра будет необходима, если ваш дистрибутив не поддерживает аппаратное обеспечение вашего устройства из коробки, а также когда вы работаете со сторонним программным обеспечением, таким как VirtualBox, Vmware и т д. Но очень полезно знать как обращаться с модулями, когда вам нужно добавить или удалить их. Даже если у вас нет необходимости в этом сейчас, вы можете протестировать, как все работает, чтобы быть вооруженным потом.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

При помощи какой утилиты можно просмотреть загруженные модули ядра ос linux

Команда lsmod позволяет использовать утилиту с соответствующим именем для получения информации о загруженных модулях ядра Linux. Ядро Linux является монолитным, но поддерживает модули, в рамках которых содержится код для реализации ряда его функций и драйверов устройств. В процессе компиляции ядра определенный машинный код может либо включаться в состав самого ядра, либо включаться в состав модулей, которые подгружаются ядром при необходимости без перезагрузки системы. Пользователь также может загрузить любой модуль с помощью команды insmod или modprobe или получить информацию о нем с помощью команды modinfo. Сами файлы модулей обычно расположены в директории /lib/modules/<версия ядра>. Что касается списка загруженных модулей, то он экспортируется ядром посредством виртуального файла /proc/modules, а утилита lsmod просто форматирует содержимое этого файла и не выполняет каких-либо сложных манипуляций. Тем не менее, она полезна для диагностики проблем с оборудованием.

Базовый синтаксис команды выглядит следующим образом:

Утилита не поддерживает каких-либо параметров и выводит информацию в формате таблицы с тремя столбцами:

  • Module — имя модуля
  • Size — размер модуля в байтах
  • Used by — количество использующихся экземпляров модуля со списком использующих его модулей (значение 0 означает, что модуль не используется).

Примеры использования

Вывод информации обо всех загруженных модулях ядра

Для вывода информации обо всех загруженных модулях ядра достаточно использовать утилиту lsmod без каких-либо параметров:

$ lsmod
Module Size Used by
xfs 1277952 0
cpuid 16384 0
nls_iso8859_1 16384 1
option 61440 0
usb_wwan 24576 1 option
cdc_ether 20480 0
usbserial 53248 2 usb_wwan,option
usbnet 45056 1 cdc_ether
mii 20480 1 usbnet
binfmt_misc 24576 1
mt7601u 110592 0
mac80211 843776 1 mt7601u
cx24116 24576 1
cfg80211 704512 2 mt7601u,mac80211
.

Такой режим работы утилиты не всегда удобен, ведь нередко требуется получить информацию о определенном драйвере.

Вывод информации об определенных модулях ядра

Для вывода информации об определенных модулях ядра следует использовать утилиту grep по отношению к выводу утилиты lsmod:

$ lsmod | grep dvb_core
dvb_core 139264 2 cx88_dvb,videobuf2_dvb
mc 53248 4 videodev,videobuf2_v4l2,dvb_core,videobuf2_common

Очевидно, что в данном случае была выведена информация лишь об интересующем нас модуле dvb_core: этот модуль как использует модули cx88_dvb и videobuf2_dvb, так и используется модулем mc.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *