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 |
Примеры:
Вывод команды 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 (no—RNG, no—ACE) (dynamic) Dynamic engine loading support |
Результат команды на Intel, с поддержкой AES-NI
$ openssl engine (aesni) Intel AES—NI 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 aes128—cbc serverA «cat >/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 aes128—cbc serverB «cat >/dev/null» user@localhost‘s 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 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_hcd, rmmod 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 и его модули
Доброго времени, уважаемые читатели 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
показывает список загруженных в настоящее время модулей ядра.
Не стесняйтесь оставлять комментарии, если у вас есть вопросы.