Ядро Linux

Керування модулями ядра Linux

Керування модулями ядра Linux

Розуміння ядра Linux

Ядро Linux є ядром операційної системи Linux. Він містить основні компоненти для вирішення апаратного забезпечення та дозволяє як спілкуватися, так і взаємодіяти між користувачем та апаратним забезпеченням. Ядро Linux - це не монолітна система, а досить гнучка, і ядро ​​розширено так званими модулями ядра.

Що таке модуль ядра?

Загалом, модуль ядра - це «шматок коду, який можна завантажувати та вивантажувати в ядро ​​за запитом. Вони розширюють функціональність ядра без необхідності перезавантажувати систему ”[1]. Це призводить до дуже великої гнучкості під час роботи.

Крім того, «модуль ядра може бути налаштований як вбудований або завантажуваний. Щоб динамічно завантажувати або видаляти модуль, він повинен бути налаштований як завантажуваний модуль у конфігурації ядра ”[1]. Це робиться у вихідному файлі ядра / usr / src / linux /.конфігурація [2]. Вбудовані модулі позначені "y", а завантажувані модулі - "m". Як приклад, перелік 1 демонструє це для модуля SCSI:

Лістинг 1: Декларація про використання модуля SCSI

CONFIG_SCSI = y # вбудований модуль
CONFIG_SCSI = m # завантажуваний модуль
# CONFIG_SCSI # змінна не встановлена

Ми не рекомендуємо редагувати файл конфігурації безпосередньо, але використовувати команду “make config”, “make menuconfig” або “make xconfig”, щоб визначити використання відповідного модуля в ядрі Linux.

Модульні команди

Система Linux постачається з низкою різних команд для обробки модулів ядра. Це включає перелік модулів, завантажених на даний момент в ядро ​​Linux, відображення інформації про модулі, а також завантаження та вивантаження модулів ядра. Нижче ми пояснимо ці команди більш докладно.

Для поточного ядра Linux наступні команди надаються пакетом kmod [3]. Усі команди є символічними посиланнями на kmod.

Список завантажених на даний момент модулів з lsmod

Починаємо з команди lsmod. lsmod скорочує “список модулів” і відображає всі модулі, завантажені в даний момент в ядро ​​Linux, приємно форматуючи вміст файлу / proc / модулі. Лістинг 2 показує вихідні дані, що складаються з трьох стовпців: ім'я модуля, розмір, який використовується в пам'яті, та інші модулі ядра, які використовують цей конкретний.

Лістинг 2: Використання lsmod

$ lsmod
Розмір модуля, який використовує
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
..
$

Знайдіть доступні модулі для поточного ядра

Можливо, доступні модулі ядра, про які ви ще не знаєте. Вони зберігаються в каталозі / lib / module. За допомогою find у поєднанні з командою uname ви можете роздрукувати список цих модулів. “Uname -r” просто друкує версію поточного ядра Linux. Перелік 3 демонструє це для старших 3.16.0-7 Linux
ядро, і показує модулі для IPv6 та IRDA.

Лістинг 3: Відображення доступних модулів (вибір)

$ find / lib / modules / $ (uname -r) -name '*.ко '
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_vti.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / xfrm6_tunnel.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_tunnel.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_gre.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irnet / irnet.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irlan / irlan.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm.ко
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ко
..
$

Відображення інформації про модуль за допомогою modinfo

Команда modinfo розповідає вам більше про запитуваний модуль ядра (“інформація про модуль”). Як параметр, modinfo вимагає або повний шлях до модуля, або просто ім'я модуля. Лістинг 4 демонструє це для модуля ядра IrDA, що має справу зі стеком протоколів інфрачервоного прямого доступу.

Лістинг 4: Відображення інформації про модуль

$ / sbin / modinfo irda
ім'я файлу: / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ко
псевдонім: net-pf-23
ліцензія: GPL
опис: стек протоколів IrDA для Linux
автор: Даг Браттлі & Жан Турріль
залежить: crc-ccitt
вермагічний: 3.16.0-7-amd64 SMP mod_unload modversions
$

Вихідні дані містять різні інформаційні поля, такі як повний шлях до модуля ядра, його псевдонім, ліцензія на програмне забезпечення, опис модуля, автори, а також внутрішні елементи ядра. Поле “залежить” показує, від яких інших модулів ядра це залежить.

Інформаційні поля відрізняються від модуля до модуля. Для того, щоб обмежити висновок певним інформаційним полем, modinfo приймає параметр "-F" (скорочення від "-field"), за яким слід ім'я поля. У лістингу 5 висновок обмежується інформацією про ліцензію, яка надається за допомогою поля ліцензії.

Лістинг 5: Відображення лише конкретного поля.

$ / sbin / modinfo -F ліцензія irda
GPL
$

У новіших ядрах Linux доступна корисна функція безпеки. Це охоплює криптографічно підписані модулі ядра. Як пояснюється на веб-сайті проекту ядра Linux [4], «це дозволяє підвищити захист ядра, забороняючи завантаження неподписаних модулів або модулів
підписаний недійсним ключем. Підписання модуля підвищує безпеку, ускладнюючи завантаження шкідливого модуля в ядро. Перевірка підпису модуля виконується ядром, так що немає необхідності мати “довірені біти простору користувача."На малюнку нижче показано це для
модуль parport_pc.

Показати конфігурацію модуля за допомогою modprobe

Кожен модуль ядра має певну конфігурацію. Команда modprobe, за якою слідує опція “-c” (скорочення від “-showconfig”), перелічує конфігурацію модуля. У поєднанні з grep цей результат обмежений певним символом. Перелік 6 демонструє це для опцій IPv6.

Лістинг 6: Показати конфігурацію модуля

$ / sbin / modprobe -c | grep ipv6
псевдонім net_pf_10_proto_0_type_6 dccp_ipv6
псевдонім net_pf_10_proto_33_type_6 dccp_ipv6
псевдонім nf_conntrack_10 nf_conntrack_ipv6
псевдонім nf_nat_10 nf_nat_ipv6
псевдонім nft_afinfo_10 nf_tables_ipv6
псевдонім nft_chain_10_nat nft_chain_nat_ipv6
псевдонім nft_chain_10_route nft_chain_route_ipv6
псевдонім nft_expr_10_reject nft_reject_ipv6
символ псевдоніма: nf_defrag_ipv6_enable nf_defrag_ipv6
символ псевдоніма: nf_nat_icmpv6_reply_translation nf_nat_ipv6
символ псевдоніма: nft_af_ipv6 nf_tables_ipv6
символ псевдоніма: nft_reject_ipv6_eval nft_reject_ipv6
$

Показати залежності модуля

Ядро Linux розроблено таким, щоб бути модульним, а функціональність розподілена по ряду модулів. Це призводить до декількох залежностей модулів, які можна знову відобразити за допомогою modprobe. У лістингу 7 використовується опція “-show-залежить”, щоб перерахувати залежності для модуля i915.

Лістинг 7: Показати залежності модуля

$ / sbin / modprobe --show-залежить i915
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / i2c / i2c-core.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / i2c / algos / i2c-algo-bit.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / thermal / thermal_sys.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / drm.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / drm_kms_helper.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / acpi / video.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / acpi / button.ко
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / i915 / i915.ко
$

Для відображення залежностей у вигляді дерева, подібного до команди “дерево” або “lsblk”, може допомогти проект modtree [5] (див. Малюнок нижче для дерева модулів i915). Хоча він є у вільному доступі на GitHub, він вимагає певних адаптацій, щоб відповідати правилам вільного програмного забезпечення та стати частиною дистрибутива Linux як пакет.

Завантаження модулів

Завантаження модуля до запущеного ядра можна виконати за допомогою двох команд - insmod (“insert module”) та modprobe. Майте на увазі, що між цими двома є невелика, але важлива різниця: insmod не вирішує залежності модулів, але modprobe розумніший і робить це.

У лістингу 8 показано, як вставити модуль ядра IrDA. Зверніть увагу, що insmode працює з повним шляхом до модуля, тоді як modprobe задоволений назвою модуля і шукає його у дереві модулів для поточного ядра Linux.

Лістинг 8: Вставка модуля ядра

# insmod / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ко
..
# modprobe irda

Розвантаження модулів

Останній крок стосується вивантаження модулів із запущеного ядра. Знову ж таки, для цього завдання доступні дві команди - modprobe та rmmod (“видалити модуль”). Обидві команди очікують ім'я модуля як параметр. У лістингу 9 показано це для видалення модуля IrDA із запущеного ядра Linux.

Лістинг 9: Видалення модуля ядра

# rmmod irda
..
# modprobe -r irda
..

Висновок

Обробка модулів ядра Linux - це не велика магія. Всього кілька команд, щоб навчитися, і ти господар кухні.

Дякую

Автор висловлює подяку Акселю Беккерту (ETH Zürich) та Сайфу дю Плессі (Hothead Studio Cape Town) за допомогу під час підготовки статті.

Посилання та посилання

  • [1] Модуль ядра, Arch Linux wiki, https: // wiki.Archlinux.орг / індекс.php / модуль_ядра
  • [2] Конфігурація ядра, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
  • [3] kmod, https: // git.ядро.org / pub / scm / utils / kernel / kmod / kmod.git
  • [4] Засіб підписання модуля ядра, https: // www.ядро.org / doc / html / v4.15 / admin-guide / модуль-підпис.html
  • [5] modtree, https: // github.com / falconindy / modtree
Mouse left-click button not working on Windows 10
If you are using a dedicated mouse with your laptop, or desktop computer but the mouse left-click button is not working on Windows 10/8/7 for some rea...
Cursor jumps or moves randomly while typing in Windows 10
If you find that your mouse cursor jumps or moves on its own, automatically, randomly while typing in Windows laptop or computer, then some of these s...
How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...