Чи автоматично завантажуються та вивантажуються модулі драйверів?


15

У Ubuntu 14.04 я виявив, що коли я не підключаю зовнішній бездротовий адаптер, його модуль rt2800usbвсе ще відображається в lsmod.

  1. коли відбувається автоматичне завантаження драйверного модуля? Це коли пристрій підключено до комп'ютера, або коли ОС завантажується?

  2. коли відбувається автоматичне вивантаження драйверного модуля? Це коли відключений пристрій від комп'ютера, або коли ОС вимикається?

Відповіді:


13

Коли ядро ​​виявить новий пристрій, воно запускає програму modprobeі передає їй ім'я, яке ідентифікує пристрій. Більшість пристроїв ідентифікуються через зареєстровані номери постачальника та моделі, наприклад, ідентифікатори PCI або USB . modprobeПрограма звертається до таблиці модуля псевдоніма , щоб знайти ім'я файлу , який містить драйвер для даного пристрою. Аналогічний принцип стосується драйверів для речей, які не є апаратними пристроями, наприклад, файлових систем та криптографічних алгоритмів. Детальніше див. У статті Debian не виявляє послідовну PCI-карту після перезавантаження/lib/modules/VERSION/modules.alias

Як тільки modprobe визначив, який файл модуля ( .ko) містить запитуваний драйвер, він завантажує файл модуля в ядро: код модуля динамічно завантажується в ядро. Якщо модуль буде завантажено успішно, він з'явиться у списку від lsmod.

Автоматичне завантаження модулів відбувається, коли ядро ​​виявляє нове обладнання з гарячою підключенням, наприклад, при підключенні USB-периферії. Операційна система також робить перелік усіх апаратних засобів, які є в системі на початку запуску, щоб завантажити драйвери для периферійних пристроїв, які є при завантаженні.

Також можна вручну запросити завантаження модуля за допомогою команди modprobeабо insmod. Більшість дистрибутивів включає в себе сценарій запуску, який завантажує перелічені в модулі /etc/modules. Ще один спосіб для завантаження модулів - якщо вони залежать від модуля: якщо модуль A залежить від модуля B, то modprobe Aзавантажує B перед завантаженням A.

Після завантаження модуля він залишається завантаженим до явного вивантаження, навіть якщо всі пристрої, що використовують цей драйвер, були відключені. Давним-давно існував механізм автоматично вивантажувати невикористані модулі, але його було видалено, якщо я добре пам’ятаю, коли на сцену вийшов udev. Я підозрюю, що автоматичне вивантаження модулів не є загальною особливістю, оскільки системи, які, як правило, потребують цього, - це переважно настільні ПК, які так чи інакше мають багато пам'яті (за шкалою коду драйвера).


Спасибі. Я не змінював /etc/modules. rt2800usbє на виході lsmod, і чи означає це, що я підключив його пристрій до мого комп'ютера до моменту завантаження?
Тім

1
@Tim Якщо модуль завантажений, і ви не завантажили його явно, і він не вказаний в /etc/modules, тоді так, імовірно, причина завантаження модуля полягає в тому, що пристрій був присутній в якийсь момент.
Жиль "ТАК - перестань бути злим"

5

Модулі завантажуються, коли система завантажується через диск початкової оперативної пам'яті, інакше як initrd . У розділі обгрунтування зазначено:

Багато дистрибутивів Linux постачають єдиний, загальний образ ядра Linux - такий, який розробники дистрибутива створюють спеціально для завантаження найрізноманітніших апаратних засобів. Драйвери пристрою для цього загального зображення ядра включаються як завантажувані модулі ядра, оскільки статичне компілювання багатьох драйверів в одне ядро ​​призводить до того, що зображення ядра буде значно більшим, можливо, занадто великим, щоб завантажуватися на комп'ютерах з обмеженою пам'яттю. Потім виникає проблема виявлення та завантаження модулів, необхідних для монтажу кореневої файлової системи під час завантаження, або, з цього приводу, виведення місця або кореневої файлової системи.

Ubuntu, як і багато інших дистрибутивів, вирішує завантажувати кожен драйвер пристрою в цей initrd, незалежно від того, потрібен драйвер чи ні, а також незалежно від того, пристрій присутній у системі чи ні. Як вказував Джайлз, вся справа завантажується в оперативну пам'ять, а потім використовуються модулі виявляються при запуску, а невикористані - видаляються з оперативної пам'яті. Використання цього підходу гарантує, що Ubuntu завжди запускатиметься в будь-якій системі незалежно від налаштування. Ubuntu імітує монолітне ядро, використовуючи мікропрограмні конструкції. Дивіться причину цього


  1. Модуль rt2800usbзавжди завантажуватиметься під час завантаження, оскільки модуль був включений до initramfs, про які згадував Гілл. Інітрамф є спадкоємцем інітраду, тому його завжди показуватиме lsmod. Зауважте, що ви можете вставити щойно скомпільований модуль у ядро, скориставшись modprobeім'ям модуля.

В якості тестової перезавантажте систему з відключеним бездротовим адаптером. Якщо все піде добре, модуль не буде вказаний у lsmodвихідному сигналі s, оскільки під час завантаження процес виявлення, розпочатий програмою initramfs і init sstem, не знайшов пристрій під час зондування, і модуль був видалений з оперативної пам'яті.

  1. Щоб видалити модуль під час роботи системи, ви можете скористатися такими командами, як rmmodабо modprobe -rпісля них ім'я модуля. При наступному завантаженні модуль буде перезавантажений. Дивись вище. У більшості випадків модуль не видаляється динамічно, оскільки це відключить гарячу підключення, тобто коли модуль буде видалено, пристрій, що використовує його, не може бути виявлений знову при повторному підключенні.

Для того, щоб вилучити модуль з нього lsmod, потрібно видалити його з образу initramfs, створеного перекомпіляцією ядра без обраного модуля, а потім відновленням зображення. При цьому вимикається все виявлення згаданого модуля.


3
Ви плутаєте завантаження файлу в оперативну пам'ять як частина оперативної пам’яті та завантажуєте (тобто динамічно підключаєте) модуль до запущеного ядра. Модулі тимчасово завантажуються в пам'ять - не в ядро ​​- з initrd (технічно це initramfs сьогодні), але вони потім вилучаються з пам'яті після монтажу реального кореня. Модулі завантажуються в ядро ​​лише тоді, коли виявлено пристрій, який їх використовує (за кількома винятками).
Жиль "ТАК - перестань бути злим"

Хоча я погоджуюся тут, він говорив про розвантаження та завантаження одного модуля, що неможливо зробити, якщо він не вирішить перенастроїти диск Ubuntu RAM, що не рекомендується, оскільки Ubuntu вирішує завантажувати всі модулі в оперативну пам’ять кожного оновлення ядра. Усі модулі завантажуються щоразу, вони просто не всі використовуються.
eyoung100

2
Ні, питання стосується завантаження та вивантаження модуля в ядро. Ні вашої оригінальної відповіді, ні вашої переглянутої відповіді це не стосується. Інітрамфи не мають відношення до цього питання (або в кращому випадку периферично).
Жил "ТАК - перестань бути злим"

@Gilles Це краще ??
eyoung100

1
@ eyoung100, я згоден з Джилсом. Обговорення initramfs не стосується питання. Модулі, як правило, завантажуються шляхом перерахування пристроїв /sysта завантаження драйверів для пристроїв, які фактично знайдені в системі. Це відбувається, якщо пристрій присутній під час завантаження або підключений до гарячого зв'язку. udevмає набагато більше спільного з цим, ніж initramfs / initrd, і те, чи всі, більшість чи лише деякі модулі скопійовані в initramfs (варіант конфігурації в /etc/initramfs-tools/initramfs.conf), не особливо актуально.
Селада
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.