Напишите команду как можно вывести описание модуля aesni intel description

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

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

Они расширяют функциональность ядра во время его выполнения.

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

Модули ядра загружаются либо автоматически (с помощью udev), либо вручную. Вы можете загрузить модули вручную с помощью команды modprobe. Модули, явно перечисленные в /etc/modules-load.d/<program>.conf для загрузки при загрузке.

Пакет kmod предоставляет инструменты для ручной работы с модулями ядра.

Модули ядра хранятся в каталоге /lib/modules/<kernel_version>.

Для поиска версии ядра используйте команду uname -r.

Команда lsmod

Команда lsmod выводит содержимое папки /proc/modules.

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

$ lsmod

Вывод:

Module                  Size  Used by
 vboxvideo              49152  0
 rfkill                 28672  3
 intel_rapl_msr         20480  0
 intel_rapl_common      28672  1 intel_rapl_msr
 intel_pmc_core_pltdrv    16384  0
 intel_pmc_core         45056  0
 intel_powerclamp       20480  0
 ghash_clmulni_intel    16384  0
 joydev                 28672  0
 hid_generic            16384  0
 snd_intel8x0           49152  2
 snd_ac97_codec        180224  1 snd_intel8x0
 aesni_intel           368640  0
 ac97_bus               16384  1 snd_ac97_codec
 usbhid                 65536  0
 hid                   147456  2 usbhid,hid_generic
 libaes                 16384  1 aesni_intel
 crypto_simd            16384  1 aesni_intel
 snd_pcm               135168  2 snd_intel8x0,snd_ac97_codec
 snd_timer              49152  1 snd_pcm
 cryptd                 24576  2 crypto_simd,ghash_clmulni_intel

Вывод показывает три колонки: Module, Size и Used by.

  • 1-й столбец – имена загруженных в данный момент модулей.
  • 2-й столбец – объем памяти для каждого модуля в килобайтах.
  • 3-я колонка – показывает общее количество использованной памяти, а также имена модулей.

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

Например:

$ lsmod | grep e1000

Вывод:

e1000                 155648  0

Используйте команду modinfo для получения дополнительной информации о модулях ядра, такой как абсолютный путь к объектному файлу ядра .ko, зависимость, автор, описание и лицензия.

$ sudo modinfo e1000

Заключение

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

Intel Advanced Encryption Standard (AES) или новые инструкции (AES-NI) включают  быстро аппаратное шифрование и дешифрование для OpenSSL, SSH, VPN Linux / Unix / OSX полное шифрование диска и многое другое. Как проверить поддержку Intel или AMD AES-NI моей Linux системе и включена ли она, в Linux, включая OpenSSL?

Расширенный стандарт шифрования Набор команд (или Intel Advanced Encryption Standard New Instructions — «AES-NI») позволяет Intel / AMD и другим процессорам, выполнять быстрое аппаратное шифрование и дешифрование.»AES-NI» является расширением множества архитектуры инструкций x86 для микропроцессоров Intel и от AMD. Это увеличивает скорость приложений, выполняющих шифрование и дешифрование с использованием AES. Несколько серверов и ноутбуков производители поставили с конфигурацией в BIOS AES-NI — отключено. Возможно, потребуется обновление BIOS , чтобы включить или изменить данную настройку BIOS. Поддерживаются следующие процессоры:

  • Intel Westmere / Westmere-EP (Xeon 56xx) / Clarkdale (за исключением Core i3, Pentium и Celeron) / Arrandale (за исключением Celeron, Pentium, Core i3, Core i5-4XXM).
  • Intel Sandy Bridge процессоры (кроме Pentium, Celeron, Core i3).
  • Мобильный Intel Core i7 и Core i5.
  • Intel Ivy Bridge процессоры i5, все i7, Xeon и i3-2115C только.
  • Процессоры Intel Haswell (все, кроме i3-4000m, Pentium и Celeron).
    AMD Bulldozer / Piledriver / каток / Jaguar / Puma, основанные процессоры.
  • Процессоры Geode LX AMD.
  • VIA PadLock (другой набор команд, чем Intel AES-NI, но делает то же самое).
  • ARM — выбран ALLWINNER и Broadcom с помощью процессора безопасности.

Пожалуйста, обратите внимание, что поддержка AES-NI включается автоматически, если обнаруженный процессор из списка поддерживаемых, описано выше.

Для получения списка процессоров, поддерживающих  AES-NI, см Intel / AMD АРК / ARM / VIA официальные сайты и документацию.

Как я узнать, что процессор имеет набор команд AES / AES-NI?

Чтобы узнать тип процессора и тип архитектуры:

Введите следующую команду, чтобы убедиться, что в процессор установлена инструкция AES и включена в BIOS:

# grep -o aes /proc/cpuinfo

ИЛИ

# grep -m1 -o aes /proc/cpuinfo

Примеры:

verify-that-processor-has-the-AES-instruction-flag

Вывод команды aes  означает, что у меня  поддержка AES-NI включена на Linux.

# grep -m1 -o aes /proc/cpuinfo

результат

Пустой вывод означает, что поддержка AES отключена

Как я могу проверить, что все мои процессоры поддерживают AES NI?

Результат выполнения следующих двух команд должен быть такой же:

# lscpu | grep ‘^CPU(s):’

32

или

# grep -o aes /proc/cpuinfo | wc -l 

32

или

# sort -u /proc/crypto | grep module

Результат

module       : aesni_intel

module       : aes_x86_64

module       : crc32_pclmul

module       : crct10dif_pclmul

module       : ghash_clmulni_intel

module       : kernel

Включен Intel AES-NI для OpenSSL?

Результат команды для VIA, если AES поддерживается

(padlock) VIA PadLock (noRNG, noACE)

(dynamic) Dynamic engine loading support

Результат команды на Intel, с поддержкой AES-NI

$ openssl engine

(aesni) Intel AESNI engine

(dynamic) Dynamic engine loading support

Тест: AES-NI процессоров против процессора без поддержки AES-NI / Packlock

В этом примере, SERVERA имеет AES-NI и SERVERB не имеет поддержку аппаратного шифрования:

$ dd if=/dev/zero count=1000 bs=1M | ssh l user c aes128cbc serverA «cat &gt;/dev/null»

Password:

1000+0 records in

1000+0 records out

1048576000 bytes (1.0 GB) copied, 10.6691 s, 98.3 MB/s

и

$ dd if=/dev/zero count=1000 bs=1M | ssh l user c aes128cbc serverB «cat &gt;/dev/null»

user@localhosts password:

1000+0 records in

1000+0 records out

1048576000 bytes (1.0 GB) copied, 31.6675 s, 33.1 MB/s

Тест: Производительность OpenSSL?

Опять выполните следующие команды на обоих системах:

ИЛИ

# openssl speed aes-128-cbc

Популярные Linux или Unix / BSD приложения, которые лучше работают с AES-NI с высокой скоростью шифрования / дешифрования:

  • dm-crypt шифрование диска
  • 7-Zip приложение.
  • Chrome Google и Firefox браузеров
  • Во FreeBSD OpenCrypto API т.е. AESNI драйвер ZFS и других файловых систем.
  • OpenSSL 1.0.1 и выше.
  • TrueCrypt 7.0 и выше или VeraCrypt.
  • Citrix XenClient 1.0 и выше.
  • GCC 4.4+, Intel C / C ++ компилятор 11.1+, Clang 3.3+ и более.
  • Библиотеки для golang, Java, СНБ, OpenSSL и более.
  • Linux и BSD брандмауэры и VPN особенно легко использовать pfsense, IPCop и более.
  • Операционная система на базе Linux, * BSD, Unix, Microsoft, Android, IOS, Apple OS X и более.

Администрирование серверов Unix-ОС, подробнее [email protected]

Нет похожих статей.

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

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

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

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

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

ls /lib/modules/5.4.0.45-generic/kernel/

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

  • 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, поэтому мы можем просто посмотреть его содержимое:

modprobe -c

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

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

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

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

cat /proc/modules

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

sudo lsmod

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

sudo lsmod | grep vbox

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

modinfo fuse

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

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

Загрузить модуль ядра 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 

blacklist b43

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

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

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

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

brcmsmac

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

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

Выводы

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

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Утилита modprobe используется для добавления загружаемых модулей в ядро ​​Linux. Вы также можете просматривать и удалять модули с помощью команды modprobe.

Linux поддерживает каталог /lib/modules/$ (uname-r) для модулей и его файлов конфигурации (кроме /etc/modprobe.conf и /etc/modprobe.d).

В ядре Linux 2.6 вместо файлов .o используются модули .ko, поскольку в них содержится дополнительная информация, которую ядро ​​использует для загрузки модулей. Пример в этой статье сделан с использованием modprobe на Ubuntu.

1. Перечислите доступные модули ядра

modprobe -l отобразит все доступные модули, как показано ниже.

$ modprobe -l | less
kernel/arch/x86/kernel/cpu/mcheck/mce-inject.ko
kernel/arch/x86/kernel/cpu/cpufreq/e_powersaver.ko
kernel/arch/x86/kernel/cpu/cpufreq/p4-clockmod.ko
kernel/arch/x86/kernel/msr.ko
kernel/arch/x86/kernel/cpuid.ko
kernel/arch/x86/kernel/apm.ko
kernel/arch/x86/kernel/scx200.ko
kernel/arch/x86/kernel/microcode.ko
kernel/arch/x86/crypto/aes-i586.ko
kernel/arch/x86/crypto/twofish-i586.ko

2. Список текущих загруженных модулей

Хотя приведенная выше команда modprobe отображает все доступные модули, команда lsmod отображает все модули, которые в данный момент загружены в ядро ​​Linux.

$ lsmod | less
soundcore          7264   1 snd
ppdev                6688   0
snd_page_alloc   9156    1 snd_pcm
psmouse            56180  0
lp                     8964    0

3. Установите новые модули в ядро ​​Linux

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

Следующий пример загружает модуль vmhgfs в ядро ​​Linux на Ubuntu.

  $ sudo modprobe vmhgfs

После загрузки модуля проверьте его с помощью команды lsmod, как показано ниже.

  $ lsmod |  grep vmhgfs
 vmhgfs 50772 0

Файлы модуля имеют расширение .ko. Если вы хотите узнать полное местоположение файла определенного модуля ядра Linux, используйте команду modprobe и выполните grep имени модуля, как показано ниже.

$ modprobe | grep vmhgfs
misc/vmhgfs.ko

$ cd /lib/modules/2.6.31-14-generic/misc

$ ls vmhgfs*
vmhgfs.ko

Примечание: вы также можете использовать insmod для установки новых модулей в ядро ​​Linux.

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

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

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

Чтобы загрузить модуль с другим именем, используйте опцию modprobe -o, как показано ниже.

  $ sudo modprobe vmhgfs -o vm_hgfs

 $ lsmod |  grep vm_hgfs
 vm_hgfs 50772 0

5. Удалить загруженный модуль

Если вы загрузили модуль в ядро ​​Linux для тестирования, вы можете выгрузить (удалить) его из ядра.

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

  modprobe -r vmhgfs

Сейчас каждая операционная система имеет разделение на пользовательский режим и режим ядра, в этой статье разбирается ядро Linux и его модули.

Ядро операционной системы

Все процессы, работающие в системе, работают либо в режиме ядра, либо в пользовательском режиме. Процессы, работающие в режиме ядра получают больше прав, чем в пользовательском режиме. В режиме ядра работает само ядро и могут работать другие подсистемы.

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

  • связь с оборудованием, и предоставление ресурсов компьютера всем процессам в системе;
  • управление всеми процессами в системе;
  • в зависимости от типа ядра, у него могут быть и другие функции. Либо эти функции могут быть вынесены из ядра, но работать в режиме ядра. Или могут вообще быть вынесены из режима ядра в пользовательский режим.

Вообще, ядро можно рассматривать как главную программу, которая устанавливает правила, по которым работают остальные программы. Все в системе должно работать по правилам ядра. А ядро подчиняется правилам, которые диктует оборудование (архитектура процессора, оперативная память, системная плата).

Типы ядер

Существуют следующие типы ядер:

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

Особенность ядра Linux

В Linux все является файлом (файл, каталог, сокет, оборудование). Об этом я уже писал здесь.

Ядро написано на языке C и является переносимым. Оно реализует многозадачность и многопоточность, виртуальную память и многое другое. Также оно соответствует стандартам POSIX, это означает что программа написанная по стандартам POSIX будет работать на всех дистрибутивах Linux.

Официальный сайт ядра Linux: https://www.kernel.org/. Здесь можно найти исходники и списки изменений разных версий ядра.

Создатель и основной руководитель ядра Linux – Линус Торвальдс:

Линус Торвальдс

Линус Торвальдс

Файлы ядра

Файл ядра находится в каталоге /boot и начинается со слова vmlinuz, а дальше идет версия:

alex@deb-11:~$ ls -l /boot/vmlinuz*
-rw-r--r-- 1 root root 6962816 авг 13 16:25 /boot/vmlinuz-5.10.0-17-amd64
-rw-r--r-- 1 root root 6962016 сен  2 16:54 /boot/vmlinuz-5.10.0-18-amd64

alex@ubu-22:~$ ls -l /boot/vmlinuz*
lrwxrwxrwx 1 root root       25 ноя 16 07:00 /boot/vmlinuz -> vmlinuz-5.15.0-53-generic
-rw------- 1 root root 11543392 окт 13 07:49 /boot/vmlinuz-5.15.0-52-generic
-rw------- 1 root root 11548224 окт 17 18:41 /boot/vmlinuz-5.15.0-53-generic
lrwxrwxrwx 1 root root       25 ноя 16 07:00 /boot/vmlinuz.old -> vmlinuz-5.15.0-52-generic

По умолчанию Debian и Ubuntu хранят старые ядра после обновления, поэтому здесь находятся несколько файлов.

Посмотрим что лежит еще в каталоге /boot:

alex@deb-11:~$ ls -l /boot/
итого 70660
-rw-r--r-- 1 root root   236286 авг 13 16:25 config-5.10.0-17-amd64
-rw-r--r-- 1 root root   236286 сен  2 16:54 config-5.10.0-18-amd64
drwxr-xr-x 5 root root     4096 сен 13 12:23 grub
-rw-r--r-- 1 root root 28960621 сен  9 10:49 initrd.img-5.10.0-17-amd64
-rw-r--r-- 1 root root 28979132 сен 12 15:00 initrd.img-5.10.0-18-amd64
-rw-r--r-- 1 root root       83 авг 13 16:25 System.map-5.10.0-17-amd64
-rw-r--r-- 1 root root       83 сен  2 16:54 System.map-5.10.0-18-amd64
-rw-r--r-- 1 root root  6962816 авг 13 16:25 vmlinuz-5.10.0-17-amd64
-rw-r--r-- 1 root root  6962016 сен  2 16:54 vmlinuz-5.10.0-18-amd64

alex@ubu-22:~$ ls -l /boot/
total 244772
-rw-r--r-- 1 root root    261861 окт 13 07:40 config-5.15.0-52-generic
-rw-r--r-- 1 root root    261837 окт 17 18:36 config-5.15.0-53-generic
drwxr-xr-x 5 root root      4096 ноя 16 07:00 grub
lrwxrwxrwx 1 root root        28 ноя 16 07:00 initrd.img -> initrd.img-5.15.0-53-generic
-rw-r--r-- 1 root root 107247090 ноя  9 06:19 initrd.img-5.15.0-52-generic
-rw-r--r-- 1 root root 107269841 ноя 16 07:00 initrd.img-5.15.0-53-generic
lrwxrwxrwx 1 root root        28 ноя 16 07:00 initrd.img.old -> initrd.img-5.15.0-52-generic
-rw------- 1 root root   6249017 окт 13 07:40 System.map-5.15.0-52-generic
-rw------- 1 root root   6250186 окт 17 18:36 System.map-5.15.0-53-generic
lrwxrwxrwx 1 root root        25 ноя 16 07:00 vmlinuz -> vmlinuz-5.15.0-53-generic
-rw------- 1 root root  11543392 окт 13 07:49 vmlinuz-5.15.0-52-generic
-rw------- 1 root root  11548224 окт 17 18:41 vmlinuz-5.15.0-53-generic
lrwxrwxrwx 1 root root        25 ноя 16 07:00 vmlinuz.old -> vmlinuz-5.15.0-52-generic
  • vmlinuz – ядро;
  • initrd.img – образ стартовой файловой системы, которая необходима чтобы запустить ядро;
  • System.map – файл для управления памятью;
  • config – файл параметров с которыми собрано текущее ядро;
  • Каталог grub – файлы загрузчика grub, про него я рассказывал здесь.

Модули ядра

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

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

Вот размер ядра:

alex@deb-11:~$ du -h /boot/vmlinuz-5.10.0-18-amd64
6,7M    /boot/vmlinuz-5.10.0-18-amd64

alex@ubu-22:~$ du -h /boot/vmlinuz-5.15.0-53-generic
12M     /boot/vmlinuz-5.15.0-53-generic

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

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

Использование lsmod

Команда lsmod берет информацию из /proc/modules чтобы вывести список уже загруженных модулей:

$ lsmod | head -n 20
Module                        Size  Used by
binfmt_misc                   24576  1
snd_hda_codec_generic         98304  2
ledtrig_audio                 16384  1 snd_hda_codec_generic
snd_hda_intel                 57344  0
snd_intel_dspcfg              28672  1 snd_hda_intel
soundwire_intel               45056  1 snd_intel_dspcfg
soundwire_generic_allocation  16384  1 soundwire_intel
snd_soc_core                  319488  1 soundwire_intel
snd_compress                  32768  1 snd_soc_core
soundwire_cadence             36864  1 soundwire_intel
snd_hda_codec                176128  2 snd_hda_codec_generic,snd_hda_intel
snd_hda_core                 110592  3 snd_hda_codec_generic,snd_hda_intel,snd_hda_codec
qxl                           77824  0
snd_hwdep                     16384  1 snd_hda_codec
drm_ttm_helper                16384  1 qxl
soundwire_bus                 94208  3 soundwire_intel,soundwire_generic_allocation,soundwire_cadence
joydev                        28672  0
ttm                          114688  2 qxl,drm_ttm_helper
snd_pcm                      143360  6 snd_hda_intel,snd_hda_codec,soundwire_intel,snd_compress,snd_soc_core,snd_hda_core

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

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

Вывод предыдущей команды будет очень большим, например в Ubuntu сейчас более 6040 подгружаемых модулей.

Использование modinfo

Команда modinfo нужна для получения информации о модуле. Вы можете указать полное имя файла или имя модуля.

Для выполнения этой команды в Ubuntu не обязательно использовать sudo, а в Debian нужно:

alex@ubu-22:~$ modinfo vfat
name:           vfat
filename:       (builtin)
author:         Gordon Chaffee
description:    VFAT filesystem support
license:        GPL
file:           fs/fat/vfat
alias:          fs-vfat

alex@deb-11:~$ sudo modinfo vfat
filename:       /lib/modules/5.10.0-18-amd64/kernel/fs/fat/vfat.ko
author:         Gordon Chaffee
description:    VFAT filesystem support
license:        GPL
alias:          fs-vfat
depends:        fat
retpoline:      Y
intree:         Y
name:           vfat
vermagic:       5.10.0-18-amd64 SMP mod_unload modversions
sig_id:         PKCS#7
signer:         Debian Secure Boot CA
sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
sig_hashalgo:   sha256
signature:      A0:1A:81:0B:41:A4:6C:82:1A:2F:85:91:BD:E3:51:69:CA:95:4E:EF:
                BB:29:9E:D5:DF:79:26:EC:85:2E:B7:2E:53:E7:4F:16:F5:00:C3:F2:
                C2:F0:85:51:8F:C3:2A:51:EF:0E:85:32:6F:7D:8D:59:6D:37:5F:7B:
                76:71:8A:C4:D3:96:39:3E:F7:EE:E5:59:ED:79:65:65:51:4C:3F:F4:
                F6:05:C7:61:D6:0D:91:B3:71:19:CA:81:B8:D6:90:CA:21:44:6A:FC:
                B0:B2:AE:11:7D:D9:EA:E5:E9:93:6B:A0:30:F2:20:95:97:84:E4:81:
                CA:26:09:3E:78:1A:B6:BB:21:7B:DC:B2:18:C6:2B:C9:1B:8F:60:7A:
                D3:8B:CB:21:15:C1:E5:88:75:06:07:DC:DC:B0:E9:5F:DF:C5:6F:20:
                DE:39:EA:7D:13:83:D1:92:7A:3A:0C:34:27:F2:50:43:5B:EA:68:E8:
                25:B2:A7:81:49:38:E7:8A:1C:25:74:B0:00:DC:CB:5A:52:D7:07:E0:
                32:12:D6:ED:0B:CC:90:49:00:5B:DB:7C:5B:5C:9F:44:C1:DF:51:EC:
                19:A7:96:2F:5A:7C:BF:E5:C9:9E:AB:08:2D:05:83:18:B8:F0:87:7E:
                03:C3:53:64:21:0D:35:54:B4:04:EF:39:32:71:0E:19

Выше вы можете заметить разницу. В Ubuntu вместо имени файла написано – (builtin). А в Debian/lib/modules/5.10.0-18-amd64/kernel/fs/fat/vfat.ko. Если вы вместо имени видите (builtin), значит этот модуль встроен в ядро.

Утилита modinfo показывает следующую информацию:

  • filename – полный путь к файлу (если это не встроенный в ядро модуль);
  • author – информация о создателе;
  • description – описание;
  • license – лицензия;
  • alias – псевдоним (их может быть несколько);
  • depends – зависимость, то есть без этого модуля, он не загрузится. Зависимостей может быть несколько. (не бывает для встроенных в ядро модулей);
  • retpoline – указывает, что модуль построен с поддержкой защиты от Spectre;
  • intree – все модули ядра начинают разработку как out-of-tree. Как только модуль принимается для включения в ядро, он становится модулем in-tree. Модули без этого флага (установленного в N) могут испортить ядро;
  • name – имя модуля;
  • vermagic – это строка используется для проверки, был ли модуль ядра скомпилирован для конкретной версии ядра или нет (не бывает для встроенных в ядро модулей);
  • parm – если у модуля есть параметры, то они записываются сюда.

Вы можете использовать опцию -F для ограничения вывода по конкретному полю:

alex@ubu-22:~$ modinfo -F description vfat
VFAT filesystem support

Если вы не укажете полное имя файла, modinfo ищет модуль в /lib/modules/<версия_ядра>/kernel

Версию вашего ядра можно получить командой uname -r:

alex@deb-11:~$ uname -r
5.10.0-18-amd64

alex@ubu-22:~$ uname -r
5.15.0-52-generic

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

alex@deb-11:~$ ls /lib/modules/`uname -r`/kernel
arch  block  crypto  drivers  fs  lib  mm  net  sound  virt

alex@ubu-22:~$ ls /lib/modules/`uname -r`/kernel
arch   crypto   fs      lib  net      sound   v4l2loopback
block  drivers  kernel  mm   samples  ubuntu  zfs

Вы можете найти некоторые простые текстовые файлы в каталоге:

$ ls /lib/modules/`uname -r`
build          modules.alias.bin          modules.builtin.modinfo  modules.order        vdso
initrd         modules.builtin            modules.dep              modules.softdep
kernel         modules.builtin.alias.bin  modules.dep.bin          modules.symbols
modules.alias  modules.builtin.bin        modules.devname          modules.symbols.bin
  • modules.dep – перечислены зависимости;
  • modules.alias – перечислены псевдонимы;
  • modules.builtin – содержит модули, которые встроены в ядро. К ним относятся драйверы необходимые для основных функциональных возможностей в большинстве систем.

Если вы заходите получить имя файла модуля с помощью modinfo а модуль окажется встроенным, то попробуйте поискать информацию в файле modules.builtin:

alex@deb-11:~$ sudo modinfo processor -F filename
(builtin)

alex@deb-11:~$ grep processor /lib/modules/`uname -r`/modules.builtin
kernel/drivers/acpi/processor.ko

alex@ubu-22:~$ modinfo processor -F filename
(builtin)
(builtin)

alex@ubu-22:~$ grep processor /lib/modules/`uname -r`/modules.builtin
kernel/drivers/acpi/processor.ko
kernel/drivers/xen/xen-acpi-processor.ko

Использование modprobe

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

Раньше использовались команды: insmod – для загрузки модуля, и rmmod – для извлечения модуля.

Команда modprobe заменила insmod и rmmod, при этом modprobe следит за зависимостями и выгружает или загружает модули с их учётом.

Я буду использовать модуль uhci_hcd для этого примера. Используйте modinfo, чтобы увидеть зависимости этого модуля:

alex@ubu-22:~$ modinfo uhci_hcd
name:           uhci_hcd
filename:       (builtin)
license:        GPL
file:           drivers/usb/host/uhci-hcd
description:    USB Universal Host Controller Interface driver
author:         Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, Alan Stern
softdep:        pre: ehci_pci
parm:           ignore_oc:ignore hardware overcurrent indications (bool)
parm:           debug:Debug level (int)


alex@deb-11:~$ sudo modinfo uhci_hcd
filename:       /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/host/uhci-hcd.ko
license:        GPL
description:    USB Universal Host Controller Interface driver
author:         Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, Alan Stern
softdep:        pre: ehci_pci
alias:          pci:v*d*sv*sd*bc0Csc03i00*
depends:        usbcore,usb-common
retpoline:      Y
intree:         Y
name:           uhci_hcd
vermagic:       5.10.0-18-amd64 SMP mod_unload modversions
sig_id:         PKCS#7
signer:         Debian Secure Boot CA
sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
sig_hashalgo:   sha256
signature:      0A:D2:BF:AF:B5:35:14:B4:7D:BC:73:6F:06:66:9A:F1:5D:94:67:99:
                CA:72:89:45:7C:3E:95:B1:00:19:F3:59:D6:D2:74:82:E8:AA:85:F8:
                60:A0:AB:CB:98:E1:A5:E4:7F:A6:3D:48:29:9B:4C:01:33:61:61:C0:
                A3:E5:80:B3:E6:3A:78:B0:F1:DB:D0:AF:A6:CA:41:EA:B2:59:EB:E6:
                4B:0C:80:69:3E:06:7A:BB:E9:DD:16:C6:B4:D2:78:10:68:D2:F0:0F:
                93:62:18:80:71:D3:42:3D:81:D6:3E:48:B5:85:FE:FB:77:C0:03:68:
                23:50:9B:99:F1:F8:8C:AF:9F:93:2D:28:16:AF:36:75:1E:72:54:AF:
                A6:3A:DD:43:32:6C:4C:39:1C:66:B9:77:B2:E2:9C:76:45:D7:0D:85:
                AE:38:9B:4A:69:00:B1:AA:92:5A:85:86:89:04:82:F7:DA:40:D4:2E:
                9D:D6:B9:AE:5C:44:01:6C:B6:95:8E:3C:02:06:18:D0:E1:D2:6A:18:
                E4:39:FF:0C:1D:62:C5:2D:16:C6:51:2F:24:B8:3E:DB:3A:8D:11:C6:
                48:F9:AC:A7:C2:83:95:88:D3:28:EC:C1:E9:6A:B0:B1:54:5E:76:E6:
                A6:00:1A:79:44:66:61:BB:9B:8C:7B:B4:B3:F6:EA:8C
parm:           ignore_oc:ignore hardware overcurrent indications (bool)
parm:           debug:Debug level (int)

Как видите, в Ubuntu этот модуль встроен в ядро. А в Debian это подгружаемый модуль ядра. Поэтому дальнейшие действия я буду выполнять в Debian.

Найдём зависимости для uhci_hcd:

$ sudo modinfo -F depends uhci_hcd
usbcore,usb-common

Как вы видите, этот модуль имеет зависимость от usbcore. А он зависит от usb-common:

$ sudo modinfo -F depends usbcore
usb-common

На этом зависимости кончаются:

$ sudo modinfo -F depends usb-common

Если вы хотите, вручную загрузить или выгрузить драйвер, используйте modprobe с опцией:

  • -i, чтобы загрузить модуль;
  • -r, чтобы выгрузить модуль;
  • -n чтобы показать, что будет сделано, не делая это;
  • а опция -v покажет подробную информацию.

Например:

$ sudo modprobe -nrv uhci_hcd
rmmod uhci_hcd
rmmod ehci_hcd

То есть, при выгрузке uhci_hcd выгрузится еще и ehci_hcd. Мы можем выполнить эти две команды (rmmod uhci_hcdrmmod ehci_hcd), или выполнить одну modprobe.

Давайте выгрузим этот модуль:

$ sudo modprobe -rv uhci_hcd
rmmod uhci_hcd
rmmod ehci_hcd
rmmod usbcore
rmmod usb_common

И загрузим модули обратно:

$ sudo modprobe -iv uhci_hcd
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/common/usb-common.ko
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/host/uhci-hcd.ko

$ sudo modprobe -iv ehci-hcd
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/host/ehci-hcd.ko

Вы не можете выгрузить модуль если он используется или если этот модуль встроен в ядро. Именно поэтому я не стал приводить пример на Ubuntu:

$ sudo modprobe -rv uhci_hcd
modprobe: FATAL: Module uhci_hcd is builtin

Параметры модулей

Некоторые модули имеют параметры. Например, драйвер устройства должен знать, какие IRQ или порт I/O использовать. Следующий пример показывает информацию о модуле usbhid, который имеет несколько таких параметров:

$ modinfo -F parm usbhid
mousepoll:Polling interval of mice (uint)
jspoll:Polling interval of joysticks (uint)
kbpoll:Polling interval of keyboards (uint)
ignoreled:Autosuspend with active leds (uint)
quirks:Add/modify USB HID quirks by specifying  quirks=vendorID:productID:quirks where vendorID, productID, and quirks are all in 0x-prefixed hex (array of charp)

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

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

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

$ sudo modprobe 8021q

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

$ sudo lsmod | grep 8021q
8021q                  40960  0
garp                   16384  1 8021q
mrp                    20480  1 8021q

Ну а чтобы в дальнейшем, после перезагрузки, этот модуль загружался, нужно добавить его название в конфиг в каталог /etc/modules-load.d:

$ sudo nano /etc/modules-load.d/8021q.conf
8021q

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

Также в Debian и Ubuntu для автозагрузки модуля ядра, можно добавить имя модуля в файл /etc/modules.

Итог

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

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

Узнали как получить информацию о модуле ядра используя команду modinfo, а также как получить список модулей в системе используя lsmod.


Сводка

Ядро Linux и модули ядра

Имя статьи

Ядро Linux и модули ядра

Описание

Сейчас каждая операционная система имеет разделение на пользовательский режим и режим ядра, в этой статье разбирается ядро Linux и его модули

Ядро linuxДоброго времени, уважаемые читатели www.k-max.name!

Сегодня постараюсь максимально понятно и сжато рассказать о управлении ядром Linux/UNIX. В теме постараюсь разобрать, как: с помощью шелла получать информацию о ядре и модулях ядра, загружать и удалять модули ядра в ходе работы, узнать, нужен ли вообще подключенный/отключенный модуль, настраивать операционную систему для загрузки необходимых модулей.

Общая информация

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

Исторически, ядро Linux выпускается под определенной версией. То есть имеет определенную маркировку нумерацию. Нумерация версии ядра Linux на текущий момент содержит четыре числа, следуя недавнему изменению в долго используемой до этого политике схемы версий, основанной на трёх числах. Для иллюстрации допустим, что номер версии составлен таким образом: A.B.C[.D] (например 2.2.1, 2.4.13 или 2.6.12.3).

  • Число A обозначает версию ядра. Оно изменяется менее часто и только тогда, когда вносятся значительные изменения в код и концепцию ядра. Оно изменялось дважды в истории ядра: в 1994 (версия 1.0) и в 1996 (версия 2.0).
  • Число B обозначает старшую версию ревизии ядра. Чётные числа обозначают стабильные ревизии, то есть те, которые предназначены для промышленного использования, такие как 1.2, 2.4 или 2.6. Нечётные числа обозначают ревизии для разработчиков, такие как 1.1 или 2.5. Они предназначены для тестирования новых улучшений и драйверов до тех пор, пока они не станут достаточно стабильными для того, чтобы быть включёнными в стабильный выпуск.
  • Число C обозначает младшую версию ревизии ядра. В старой трёхчисловой схеме нумерации, оно изменялось тогда, когда в ядро включались заплатки связанные с безопасностью, исправления ошибок, новые улучшения или драйверы. С новой политикой нумерации, однако, оно изменяется только тогда, когда вносятся новые драйверы или улучшения; небольшие исправления поддерживаются числом D.
  • Число D впервые появилось после случая, когда в коде ядра версии 2.6.8 была обнаружена грубая, требующая незамедлительного исправления ошибка, связанная с NFS. Однако, было недостаточно других изменений, для того чтобы это послужило причиной для выпуска новой младшей ревизии (которой должна была стать 2.6.9). Поэтому была выпущена версия 2.6.8.1 с единственным исправлением в виде исправления для этой ошибки. С ядра 2.6.11, эта нумерация была адаптирована в качестве новой официальной политики версий. Исправления ошибок и заплатки безопасности теперь обозначаются с помощью четвёртого числа, тогда как большие изменения выполняются в изменениях младшей версии ревизии ядра (число C).

Как я уже говорил, ядро — это код низкого уровня, который взаимодействует с интерфейсами аппаратных средств и управляет системой на низшем уровне.  В настоящее время существует громаднейшее количество разновидностей аппаратного обеспечения, файловых систем и остальных компонентов, с которыми взаимодействует ядро системы. Если поддержку всех мыслимых и не мыслимых аппаратных средств включить в ядро, то размер ядра вырастет до неподъемных величин. Для того чтобы ядро не занимало большого количества оперативной памяти и при этом оставалось универсальным, придумали — модули ядра. Модули ядра позволяют при необходимости загрузить обеспечивающее поддержку программное обеспечение, такое как драйверы для аппаратных средств или файловые системы. Это позволяет запускать систему с небольшим ядром и затем подгружать модули по мере необходимости. Часто эта подгрузка происходит автоматически, например, при подключении устройств USB.

Команды для выполнения задач загрузки и удаления модулей ядра требуют полномочий суперпользователя root. Команды, выдающие информацию о модулях, обычно могут быть выполнены обычным пользователем. Однако, в случае, если они расположены в каталоге /sbin, они будут недоступны для обычного пользователя, так как этот каталог не включается в путь поиска PATH. Таким образом, если вы не root, вам, вероятно, надо будет использовать полное наименование пути.

Просмотр информации о ядре и управление параметрами ядра (команды управления)

Просмотр общей информации о ядре (версии, имени ОС, аппаратная платформа и т.п.) производится с помощью команды uname.

Просмотреть  список подключенных модулей в данный момент возможно с помощью команды lsmod:

Print-server:/tmp/123# lsmod
Module                  Size  Used by
ipv6                  235396  10
loop                   12748  0
parport_pc             22500  0
parport                31084  1 parport_pc
snd_pcm                62660  0
snd_timer              17800  1 snd_pcm
snd                    45636  2 snd_pcm,snd_timer
soundcore               6368  1 snd
snd_page_alloc          7816  1 snd_pcm
psmouse                32336  0
serio_raw               4740  0
pcspkr                  2432  0
i2c_piix4               7216  0
i2c_core               19828  1 i2c_piix4
ac                      4196  0
button                  6096  0
evdev                   8000  0
ext3                  105576  5
jbd                    39476  1 ext3
mbcache                 7108  1 ext3
sd_mod                 22200  7
ide_cd_mod             27684  0
cdrom                  30176  1 ide_cd_mod
ata_generic             4676  0
ahci                   23596  6
libata                140448  2 ata_generic,ahci
scsi_mod              129548  2 sd_mod,libata
dock                    8304  1 libata
e1000                 102656  0
piix                    6568  0 [permanent]
ide_pci_generic         3908  0 [permanent]
ide_core               96168  3 ide_cd_mod,piix,ide_pci_generic
thermal                15228  0
processor              32576  1 thermal
fan                     4196  0
thermal_sys            10856  3 thermal,processor,fan

В приведенном примере видно, что в системе загружено множество модулей. Большинство из них поставляются вместе с ядром и имеют свободную лицензию. Бывают так же модули и проприетарные (например драйвера видеоадаптеров NVIDIA). Соответственно, модульный подход позволяет включать в ядро несвободные компоненты, если проприетарная лицензия позволяет это, что избавляет от необходимости получать данные модули от производителя железа.

В примере также можно видеть, что соответствующими модулями осуществляется поддержка таких устройств как видео, SATA, SCSI, дискеты и звуковые карты, а также сетевые устройства, например, IPV6, поддержка файловых систем, такой как ext3, и Remote Procedure Call (RPC) компании Sun.

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

Команда modinfo выдает информацию об одном или нескольких модулях.

kernel-server:/tmp/123$ /sbin/modinfo ipv6
filename:       /lib/modules/2.6.26-2-686/kernel/net/ipv6/ipv6.ko
alias:          net-pf-10
license:        GPL
description:    IPv6 protocol stack for Linux
author:         Cast of dozens
depends:
vermagic:       2.6.26-2-686 SMP mod_unload modversions 686

В приведенном примере видно, что команда modinfo показывает информацию о модуле ipv6, которая включает такие параметры как имя файла и путь, лицензия, описание, автор модуля и др. Параметры модуля могут различаться в зависимости от модуля.

Отдельно хотелось бы затронуть параметр filename, содержащий путь к файлу модуля и имя файла. Имя файла модуля ipv6 оканчивается на .ko, это говорит нам, что данный модуль относится к версии ядра 2.6. В более ранней версии ядра — 2.4, имена модулей оканчивались на .o). Как видно, модуль расположен в подкаталогах каталога /lib/modules/2.6.26-2-686/, в данном пути, каталог 2.6.26-2-686 соответствует версии ядра (а так же выводу команды uname -r, что активно используется в написании скриптов). Структура подкаталогов указанного каталога отражает взаимосвязь модулей ядра и назначения модулей, думаю пример ниже это наглядно покажет:

kernel-server:/tmp/123# ls -l /lib/modules/2.6.26-2-686/kernel/
итого 12
drwxr-xr-x  3 root root 1024 Окт  1 15:40 arch
drwxr-xr-x  3 root root 4096 Окт  1 18:02 crypto
drwxr-xr-x 54 root root 1024 Окт  1 15:40 drivers
drwxr-xr-x 51 root root 3072 Окт  1 18:02 fs
drwxr-xr-x  6 root root 1024 Окт  1 18:02 lib
drwxr-xr-x 37 root root 1024 Окт  1 15:40 net
drwxr-xr-x 11 root root 1024 Окт  1 18:02 sound

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

Как же нам узнать, какие модули ядра нужны, а какие можно удалить?

А все просто: если счетчик Used By равен нулю, то модуль ядра никем и ничем не используется. Соответственно, его можно удалить.

Удаление модуля ядра происходит командой  rmmod module_name.

Удаленный модуль может понадобиться в процессе работы, для загрузки модуля необходимо выполнить команду: insmod /path/to/module.ko

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

[root@proxy test]# uname -r
2.6.27-ovz-smp-alt9
[root@proxy test]# insmod /lib/modules/`uname -r`/kernel/drivers/block/floppy.ko
[root@proxy test]# rmmod floppy
[root@proxy test]# modinfo -F filename floppy
/lib/modules/2.6.27-ovz-smp-alt9/kernel/drivers/block/floppy.ko
[root@proxy test]# insmod $(modinfo -F filename floppy)
[root@proxy test]# lsmod | grep floppy
floppy                 58244  0

Существует так же и другая команда для управления модулями: modprobe. Особенность данной команды в том, что она удаляет/добавляет модули с учетом зависимостей между модулями (зависимости между модулями прописаны в файле /lib/modules/версия/modules.dep). Пример использования:

[linux@kernel root]# modprobe -r vfat
vfat: Device or resource busy
[linux@kernel root]# lsmod | grep fat
vfat                   13132   1
fat                    38744   1  [vfat]
[linux@kernel root]# umount /windows/D
[linux@kernel root]# modprobe -r vfat
[linux@kernel root]# modprobe -v --show  vfat
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
[linux@kernel root]# lsmod | grep fat
[linux@kernel root]# modprobe -v  vfat
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
[linux@kernel root]# lsmod | grep fat
vfat                   13132   0  (unused)
fat                    38744   0  [vfat]

Как уже выше было сказано, модули ядра имеют зависимости друг от друга, которые прописаны в файле /lib/modules/версия/modules.dep. Данный файл формируется командой depmod, которая при выполнении просматривает структуру каталогов /lib/modules/текущая_версия_ядра/ и формирует информацию о зависимостях.

Так же хочу отметить, что в Linux существует конфигурационный файл /etc/modules.conf, к которому обращается и modprobe и debmod. Данный файл в большинстве своем используется для корректировки алиасов модулей. Некоторые ОС используют другие конфигурационные файлы, таки как /etc/modprobe.conf или каталог с конфигурационными файлами — /etc/modprobe.d/.

Еще отличным источником информации о действующем ядре Linux является файл конфигурации ядра, который расположен в /boot/config-2.6…. Используя команду grep можно получить достаточно информации (например, поддерживает ли ядро файловую систему cifs):

samba-server:~# grep CONFIG_SMB_FS /boot/config-2.6.32-5-686
 # CONFIG_SMB_FS is not set
 samba-server:~# grep CONFIG_CIFS /boot/config-2.6.32-5-686
 CONFIG_CIFS=m
 # CONFIG_CIFS_STATS is not set
 CONFIG_CIFS_WEAK_PW_HASH=y
 CONFIG_CIFS_UPCALL=y
 CONFIG_CIFS_XATTR=y
 CONFIG_CIFS_POSIX=y
 # CONFIG_CIFS_DEBUG2 is not set
 CONFIG_CIFS_DFS_UPCALL=y
 CONFIG_CIFS_EXPERIMENTAL=y

На сегодня все. Как всегда — буду очень рад Вашим комментариям! В следующей статье, посвященной ядру Linux мы научимся собирать свое ядро.

С Уважением, Mc.Sim!


Теги: kernel, Linux, modules, UNIX, загрузка, команды

04.10.2020
Linux, Команды

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

Модули ядра

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

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

Обычно модули загружаются по запросу через udev (диспетчер устройств). Вы также можете вручную загрузить модуль в ядро с помощью команды modprobe или автоматически во время загрузки с помощью файлов /etc/modules или /etc/modules-load.d/*.conf .

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

Команда lsmod

lsmod — это простая утилита, которая не принимает никаких параметров или аргументов. Что делает команда, так это то, что она читает /proc/modules и отображает содержимое файла в хорошо отформатированном списке.

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

lsmod

Команда выводит информацию для каждого загруженного модуля ядра в новой строке:

Module                  Size  Used by
cmac                   16384  0
rfcomm                 81920  4
...
ahci                   40960  1
intel_lpss_pci         20480  0
i2c_i801               32768  0
libahci                32768  1 ahci
intel_lpss             16384  1 intel_lpss_pci
...

Каждая строка состоит из трех столбцов:

  • Module — в первом столбце отображается имя модуля.
  • Size — во втором столбце указан размер модуля в байтах.
  • Used by — в третьем столбце отображается число, указывающее, сколько экземпляров модуля используется в настоящее время. Нулевое значение означает, что модуль не используется. Список, разделенный запятыми после номера, показывает, что использует модуль.

Чтобы узнать, загружен ли конкретный модуль, отфильтруйте вывод с помощью grep . Например, чтобы узнать, загружен ли модуль kvm вы должны запустить:

lsmod | grep kvm
kvm_intel             278528  0
kvm                   651264  1 kvm_intel
irqbypass              16384  1 kvm

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

Выводы

Команда lsmod показывает список загруженных в настоящее время модулей ядра.

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

Понравилась статья? Поделить с друзьями:
  • Напишите сочинение рассуждение на тему как природа влияет на человека
  • Напишите кириллицей это как
  • Напишите сочинение рассуждение на тему как народная фантазия преображает жизнь
  • Напишите какой буквой обозначается физическая величина как обозначается ее единица измерения
  • Напишите сочинение рассуждение на тему как можно прославиться