Comments 50
Очень хорошо изложено. На мой взгляд ещё стоит добавить про modprobe.d/*.conf — автоматическое конфигурирование модулей при загрузке. Полезно в частности для видео устройств.
+2
Большое спасибо, очень доступный и информативный материал, однозначно в избранное.
Некоторые подробности загрузки/выгрузки стали более ясны и прозрачны
Некоторые подробности загрузки/выгрузки стали более ясны и прозрачны
+1
Хорошо изложено, спасибо.
0
Пользуясь случаем хочу порекомендовать две просто великолепные книги по ядру Linux
— The Linux Programming Interface by Michael Kerrisk
— Linux Kernel Development by Robert Love
— The Linux Programming Interface by Michael Kerrisk
— Linux Kernel Development by Robert Love
+8
О да! По Роберту Лаву я учился писать модули ядра. Автор не только рассказывает как писать модули, но и передает некую философию, руководствуясь которой можно избежать многих ошибок проектирования и правильно программировать в условиях пространства ядра.
0
В этот же список можно добавить
Understanding the Linux Kernel by Daniel P. Bovet (Author) & Marco Cesati (Author)
Understanding the Linux Kernel by Daniel P. Bovet (Author) & Marco Cesati (Author)
+2
Интересно было бы узнать ппро конфигурирование udev — например, загрузка своего модуля при появлении устройства с особыми свойствами.
0
> В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского.
Монолитное — значит что ядро не поделено на части, а не то что вы тут написали. Монолитное ядро противопоставляется микроядерным — Minix и HURD, где каждый отдельный сервис — это отдельный процесс а «истинное» микроядро лишь занимается обменом между информации между ними.
> rmmod
rmmod -> modprobe -r
> Эти зависимости просчитываются автоматически, и будут описаны ниже.
Я не совсем понял, что здесь значил слово «автоматически»?
Монолитное — значит что ядро не поделено на части, а не то что вы тут написали. Монолитное ядро противопоставляется микроядерным — Minix и HURD, где каждый отдельный сервис — это отдельный процесс а «истинное» микроядро лишь занимается обменом между информации между ними.
> rmmod
rmmod -> modprobe -r
> Эти зависимости просчитываются автоматически, и будут описаны ниже.
Я не совсем понял, что здесь значил слово «автоматически»?
0
А не одно и то же? Монолитное ядро по сути один большой процесс, выполняющийся в рамках одного адресного пространства. Все службы ядра существуют и выполняются в одном большом адресном пространстве ядра.
«Автоматически» — имелось ввиду, что не нужно все делать руками, есть специальные механизмы определения зависимостей и их разрешения.
«Автоматически» — имелось ввиду, что не нужно все делать руками, есть специальные механизмы определения зависимостей и их разрешения.
0
Скрипты загрузки и выгрузки модулей, это, пока, единственный способ бороться с отваливанием вай-фая после суспенда или хибернейта. За статью спасибо, ее бы месяц назад.
зы. Регулярка find /lib/modules/`uname -r` -name ‘*.ko’ почему-то не срабатывает на убунту 10.10.
зы. Регулярка find /lib/modules/`uname -r` -name ‘*.ko’ почему-то не срабатывает на убунту 10.10.
0
Подозреваю, что не работает из-за кавычек (хабр их заменяет на свои). Попробуйте использовать символ ' вокруг *.ko
0
uname -r — это подстановка. Пишется в кавычках, которые находятся на русской букве «ё». А '*.ko' пишется в обычных одинарных кавычках. Подстановку можно, кстати, написать по другому:
find /lib/modules/$(uname -r) -name '*.ko'
find /lib/modules/$(uname -r) -name '*.ko'
0
>Необходимость в файле микропрограммы появилась в связи с тем, что интерфейс взаимодействия с устройством закрыт, и эти функции возложены на файл прошивки (firmware).
разве фирмварь не грузится в само устройство, а не драйвер?
разве фирмварь не грузится в само устройство, а не драйвер?
0
В этом случае нет. Судя по документации, этот файл грузится непосредственно в память ядра.
0
Вот вообще тему фирмвари бы поподробнее раскрыть -_-
0
Большое спасибо за статью. Интересует такой вопрос — Есть ли смысл вкомпиливать модули в ядро, интересно узнать в каких случаях это может потребоваться и будет ли влиять на производительность или надежность?
0
Чем больше вкомпилено в ядро, тем ядро медленнее загружается (может и работает), но так безопаснее — вам не надо думать о том, что какой-то модуль мог не подгрузится, когда он нужен.
А если выбрать модульную структуру, то все наоборот)
А если выбрать модульную структуру, то все наоборот)
0
Бывают ситуации, когда все нужные модули вкомпилируются в ядро и функция подгрузки модулей отключается. Это делают на тех системах, на которых не будут менять ни конфигурацию оборудования, ни файловые системы. Создается что-то типа бастиона, невозможно ничего не загрузить, ни выгрузить. Согласно этой политике повышается безопасность, т.к. невозможно загрузить какой либо вредоносный код в ядро. Но я с таким встречался только один раз, когда знакомый админ таким образом настроил внутренний шлюз. Он работал отлично, маршрутизировал довольно много трафика и держал аптаймы до нескольких лет. Но когда на маме сдохли конденсаторы и пришлось ее заменить — пришлось пересобирать ядро, т.к. таких матерей уже в продаже давно нет.
Смысл вкомпилировать только некоторые модули есть тогда, когда вы уверены, что это оборудование или файловая система будет у вас всегда, но опять же прироста в производительности это не даст. Я так поступаю чисто для удобства на домашней системе: вкомпилирую модули поддержки корневой файловой системы и контроллера жесткого диска в ядро, чтобы не использовать initrd. Других преимуществ я не вижу. Может быть кто нибудь еще просветит.
Смысл вкомпилировать только некоторые модули есть тогда, когда вы уверены, что это оборудование или файловая система будет у вас всегда, но опять же прироста в производительности это не даст. Я так поступаю чисто для удобства на домашней системе: вкомпилирую модули поддержки корневой файловой системы и контроллера жесткого диска в ядро, чтобы не использовать initrd. Других преимуществ я не вижу. Может быть кто нибудь еще просветит.
0
>Согласно этой политике повышается безопасность, т.к. невозможно загрузить какой либо вредоносный код в ядро
Глупости и наивняк. Если рут уже получен, то в ядро можно насрать и без красивой подгрузки модуля.
Глупости и наивняк. Если рут уже получен, то в ядро можно насрать и без красивой подгрузки модуля.
0
Согласен, я тоже этот метод не приемлю. Просто если цель нагадить в системе — да, этого достаточно, а чтобы незамеченно в системе сидела какая-то резидентная гадость — довольно не плохая идея интегрироваться в ядро.
0
«незаметная» резидентная гадость, которую видно в списке модулей — это как-то глупо.
надо бы смотреть, надо бы посмотреть, как настоящие руткиты в реальности грузятся.
надо бы смотреть, надо бы посмотреть, как настоящие руткиты в реальности грузятся.
0
Я вообще о том, что загрузить код в пространство ядра можно и без механизма модулей.
0
Подсказали что плюс использовать модули невкомпиленными, в том что при обновлении модуля можно просто заменить модуль и нет необходимости пересобирать ядро. Сомневаюсь что такая ситуация может часто встречаться, тем более что модули часто зависят от версии ядра.
0
>Сомневаюсь что такая ситуация может часто встречаться, тем более что модули часто зависят от версии ядра.
На девелоперской машине такое бывает по несколько раз на день.
В дистрибутивах конечно после одного патча чего угодно будет выпущен новый пакет с новыми версиями.
>модули часто зависят от версии ядра.
Модули всегда зависят от версии ядра, а также от некоторых параметров сборки.
Поле vermagic в том же modinfo.
На девелоперской машине такое бывает по несколько раз на день.
В дистрибутивах конечно после одного патча чего угодно будет выпущен новый пакет с новыми версиями.
>модули часто зависят от версии ядра.
Модули всегда зависят от версии ядра, а также от некоторых параметров сборки.
Поле vermagic в том же modinfo.
0
Если вкомпилить в ядро модули, нужные для монтирования рутфс, то можно выкинуть initrd/initramfs и сэкономить несколько секунд на загрузке.
Я так на нетбуке делаю.
После загрузки уже неважно, что откуда взялось.
Я так на нетбуке делаю.
После загрузки уже неважно, что откуда взялось.
0
>Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы.
Это какие еще? Механизм один — ядро пинает юзерспейсу id устройства, modprobe по табличке алиасов находит нужный модуль. Все.
В том же выхлопе modinfo rt73usb табличка есть.
Это какие еще? Механизм один — ядро пинает юзерспейсу id устройства, modprobe по табличке алиасов находит нужный модуль. Все.
В том же выхлопе modinfo rt73usb табличка есть.
0
А как ядро определяет, для какого устройства какой модуль грузить?
Есть устройство которое работает через COM-USB переходник (он внутри устройства стоит). Случайным образом при загрузке системы для устройства может быть загружен модуль pl2303 и соответственно оно станет /dev/ttyUSB*, а может загрузиться cdc_acm и оно станет /dev/ttyACM*
Внести один из этих модулей в blacklist я не могу, т.к. есть другие устройства, которые их используют. Как заставить ядро для USB устройства с конкретным ID грузить конкретный драйвер?
Есть устройство которое работает через COM-USB переходник (он внутри устройства стоит). Случайным образом при загрузке системы для устройства может быть загружен модуль pl2303 и соответственно оно станет /dev/ttyUSB*, а может загрузиться cdc_acm и оно станет /dev/ttyACM*
Внести один из этих модулей в blacklist я не могу, т.к. есть другие устройства, которые их используют. Как заставить ядро для USB устройства с конкретным ID грузить конкретный драйвер?
0
>как ядро определяет, для какого устройства какой модуль грузить?
habrahabr.ru/blogs/linux/112527/
>Случайным образом при загрузке системы
как-то очень странно — видимо устройство матчится под два разных драйвера и его ловит тот, который был загружен быстрее.
если действительно так, то похоже на баг и его надо бы отрепортить.
как воркарраунд, можно явно грузить один из модулей раньше, или прописать алиас.
еще можно разрулить на уровне имени устройства, написав хитрое правило udev.
habrahabr.ru/blogs/linux/112527/
>Случайным образом при загрузке системы
как-то очень странно — видимо устройство матчится под два разных драйвера и его ловит тот, который был загружен быстрее.
если действительно так, то похоже на баг и его надо бы отрепортить.
как воркарраунд, можно явно грузить один из модулей раньше, или прописать алиас.
еще можно разрулить на уровне имени устройства, написав хитрое правило udev.
0
lsmod покажет список загруженных модулей, modinfo — возможные опции загрузки конкретного модуля.
А вот есть ли способ узнать, с какими опциями загружен модуль? Это, пожалуй, даже чаще востребовано, чем modinfo, особенно с ноутбуками с snd-hda-intel с их вечными проблемами с входом для наушников.
А также интересно, можно ли «на лету» изменить параметры загрузки модуля без его выгрузки (иногда зависимости не дают выгрузить) и повторной загрузки.
Если эти два вопроса имеют решение, хорошо было бы его увидеть в самой статье для полноты картины — к остальному содержимому претензий нет.
А вот есть ли способ узнать, с какими опциями загружен модуль? Это, пожалуй, даже чаще востребовано, чем modinfo, особенно с ноутбуками с snd-hda-intel с их вечными проблемами с входом для наушников.
А также интересно, можно ли «на лету» изменить параметры загрузки модуля без его выгрузки (иногда зависимости не дают выгрузить) и повторной загрузки.
Если эти два вопроса имеют решение, хорошо было бы его увидеть в самой статье для полноты картины — к остальному содержимому претензий нет.
0
Довольно интересные вопросы… так чтобы списком получать я даже не знаю. Можно проверять значение параметра через файловую систему /sys: в каталоге "/sys/modules/<module_name>/parameters" сидят файлы, названные по имени параметра, данные в них — значения параметра.
А по поводу изменения параметров на лету никогда не сталкивался с проблемой, но поищу информацию. Спасибо за интересные вопросы.
А по поводу изменения параметров на лету никогда не сталкивался с проблемой, но поищу информацию. Спасибо за интересные вопросы.
0
Я всегда считал что некоторые вещи очень желательно делать модульными при сборке ядра, например — модуль wifi-карты и bluetooth. Все ради того, чтобы выгружать модуль ненужного в данный момент устройства и, типа, экономить электричество. Раскройте же глаза на правду, о линукс-гуру!)
0
Отличная статья. Хорошо структурирует знания и дает понимание четкое понимание того, как это все работает :)
0
Спасибо, теперь я хоть что-то понимаю в ядре линукса =)
0
modprobe -l
0
круто, спасибо за статью — после нее я наконец-то перестал бояться ядер/модулей)
0
Здравствуйте, спасибо за статью. Всё очень интересно, доходчиво.
Из вывода команды ясно, что модуль подгружен, а так же в своей работе использует другие модули.— в шапке таблицы указано «Used by», что означает «используется». Или я ошибаюсь? Т.е. правильно нужно было написать «Из вывода команды ясно, что модуль подгружен, а так же в своей работе используется другими модулями.»
0
Only those users with full accounts are able to leave comments. Log in, please.
Работаем с модулями ядра в Linux