Комментарии 51
Очень хорошо изложено. На мой взгляд ещё стоит добавить про modprobe.d/*.conf — автоматическое конфигурирование модулей при загрузке. Полезно в частности для видео устройств.
Большое спасибо, очень доступный и информативный материал, однозначно в избранное.
Некоторые подробности загрузки/выгрузки стали более ясны и прозрачны
Некоторые подробности загрузки/выгрузки стали более ясны и прозрачны
Хорошо изложено, спасибо.
Пользуясь случаем хочу порекомендовать две просто великолепные книги по ядру 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
О да! По Роберту Лаву я учился писать модули ядра. Автор не только рассказывает как писать модули, но и передает некую философию, руководствуясь которой можно избежать многих ошибок проектирования и правильно программировать в условиях пространства ядра.
В этот же список можно добавить
Understanding the Linux Kernel by Daniel P. Bovet (Author) & Marco Cesati (Author)
Understanding the Linux Kernel by Daniel P. Bovet (Author) & Marco Cesati (Author)
Интересно было бы узнать ппро конфигурирование udev — например, загрузка своего модуля при появлении устройства с особыми свойствами.
> В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского.
Монолитное — значит что ядро не поделено на части, а не то что вы тут написали. Монолитное ядро противопоставляется микроядерным — Minix и HURD, где каждый отдельный сервис — это отдельный процесс а «истинное» микроядро лишь занимается обменом между информации между ними.
> rmmod
rmmod -> modprobe -r
> Эти зависимости просчитываются автоматически, и будут описаны ниже.
Я не совсем понял, что здесь значил слово «автоматически»?
Монолитное — значит что ядро не поделено на части, а не то что вы тут написали. Монолитное ядро противопоставляется микроядерным — Minix и HURD, где каждый отдельный сервис — это отдельный процесс а «истинное» микроядро лишь занимается обменом между информации между ними.
> rmmod
rmmod -> modprobe -r
> Эти зависимости просчитываются автоматически, и будут описаны ниже.
Я не совсем понял, что здесь значил слово «автоматически»?
А не одно и то же? Монолитное ядро по сути один большой процесс, выполняющийся в рамках одного адресного пространства. Все службы ядра существуют и выполняются в одном большом адресном пространстве ядра.
«Автоматически» — имелось ввиду, что не нужно все делать руками, есть специальные механизмы определения зависимостей и их разрешения.
«Автоматически» — имелось ввиду, что не нужно все делать руками, есть специальные механизмы определения зависимостей и их разрешения.
Скрипты загрузки и выгрузки модулей, это, пока, единственный способ бороться с отваливанием вай-фая после суспенда или хибернейта. За статью спасибо, ее бы месяц назад.
зы. Регулярка find /lib/modules/`uname -r` -name ‘*.ko’ почему-то не срабатывает на убунту 10.10.
зы. Регулярка find /lib/modules/`uname -r` -name ‘*.ko’ почему-то не срабатывает на убунту 10.10.
Подозреваю, что не работает из-за кавычек (хабр их заменяет на свои). Попробуйте использовать символ ' вокруг *.ko
uname -r — это подстановка. Пишется в кавычках, которые находятся на русской букве «ё». А '*.ko' пишется в обычных одинарных кавычках. Подстановку можно, кстати, написать по другому:
find /lib/modules/$(uname -r) -name '*.ko'
find /lib/modules/$(uname -r) -name '*.ko'
>Необходимость в файле микропрограммы появилась в связи с тем, что интерфейс взаимодействия с устройством закрыт, и эти функции возложены на файл прошивки (firmware).
разве фирмварь не грузится в само устройство, а не драйвер?
разве фирмварь не грузится в само устройство, а не драйвер?
В этом случае нет. Судя по документации, этот файл грузится непосредственно в память ядра.
Вот вообще тему фирмвари бы поподробнее раскрыть -_-
Большое спасибо за статью. Интересует такой вопрос — Есть ли смысл вкомпиливать модули в ядро, интересно узнать в каких случаях это может потребоваться и будет ли влиять на производительность или надежность?
Чем больше вкомпилено в ядро, тем ядро медленнее загружается (может и работает), но так безопаснее — вам не надо думать о том, что какой-то модуль мог не подгрузится, когда он нужен.
А если выбрать модульную структуру, то все наоборот)
А если выбрать модульную структуру, то все наоборот)
Бывают ситуации, когда все нужные модули вкомпилируются в ядро и функция подгрузки модулей отключается. Это делают на тех системах, на которых не будут менять ни конфигурацию оборудования, ни файловые системы. Создается что-то типа бастиона, невозможно ничего не загрузить, ни выгрузить. Согласно этой политике повышается безопасность, т.к. невозможно загрузить какой либо вредоносный код в ядро. Но я с таким встречался только один раз, когда знакомый админ таким образом настроил внутренний шлюз. Он работал отлично, маршрутизировал довольно много трафика и держал аптаймы до нескольких лет. Но когда на маме сдохли конденсаторы и пришлось ее заменить — пришлось пересобирать ядро, т.к. таких матерей уже в продаже давно нет.
Смысл вкомпилировать только некоторые модули есть тогда, когда вы уверены, что это оборудование или файловая система будет у вас всегда, но опять же прироста в производительности это не даст. Я так поступаю чисто для удобства на домашней системе: вкомпилирую модули поддержки корневой файловой системы и контроллера жесткого диска в ядро, чтобы не использовать initrd. Других преимуществ я не вижу. Может быть кто нибудь еще просветит.
Смысл вкомпилировать только некоторые модули есть тогда, когда вы уверены, что это оборудование или файловая система будет у вас всегда, но опять же прироста в производительности это не даст. Я так поступаю чисто для удобства на домашней системе: вкомпилирую модули поддержки корневой файловой системы и контроллера жесткого диска в ядро, чтобы не использовать initrd. Других преимуществ я не вижу. Может быть кто нибудь еще просветит.
>Согласно этой политике повышается безопасность, т.к. невозможно загрузить какой либо вредоносный код в ядро
Глупости и наивняк. Если рут уже получен, то в ядро можно насрать и без красивой подгрузки модуля.
Глупости и наивняк. Если рут уже получен, то в ядро можно насрать и без красивой подгрузки модуля.
Согласен, я тоже этот метод не приемлю. Просто если цель нагадить в системе — да, этого достаточно, а чтобы незамеченно в системе сидела какая-то резидентная гадость — довольно не плохая идея интегрироваться в ядро.
«незаметная» резидентная гадость, которую видно в списке модулей — это как-то глупо.
надо бы смотреть, надо бы посмотреть, как настоящие руткиты в реальности грузятся.
надо бы смотреть, надо бы посмотреть, как настоящие руткиты в реальности грузятся.
Я вообще о том, что загрузить код в пространство ядра можно и без механизма модулей.
Подсказали что плюс использовать модули невкомпиленными, в том что при обновлении модуля можно просто заменить модуль и нет необходимости пересобирать ядро. Сомневаюсь что такая ситуация может часто встречаться, тем более что модули часто зависят от версии ядра.
>Сомневаюсь что такая ситуация может часто встречаться, тем более что модули часто зависят от версии ядра.
На девелоперской машине такое бывает по несколько раз на день.
В дистрибутивах конечно после одного патча чего угодно будет выпущен новый пакет с новыми версиями.
>модули часто зависят от версии ядра.
Модули всегда зависят от версии ядра, а также от некоторых параметров сборки.
Поле vermagic в том же modinfo.
На девелоперской машине такое бывает по несколько раз на день.
В дистрибутивах конечно после одного патча чего угодно будет выпущен новый пакет с новыми версиями.
>модули часто зависят от версии ядра.
Модули всегда зависят от версии ядра, а также от некоторых параметров сборки.
Поле vermagic в том же modinfo.
Если вкомпилить в ядро модули, нужные для монтирования рутфс, то можно выкинуть initrd/initramfs и сэкономить несколько секунд на загрузке.
Я так на нетбуке делаю.
После загрузки уже неважно, что откуда взялось.
Я так на нетбуке делаю.
После загрузки уже неважно, что откуда взялось.
>Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы.
Это какие еще? Механизм один — ядро пинает юзерспейсу id устройства, modprobe по табличке алиасов находит нужный модуль. Все.
В том же выхлопе modinfo rt73usb табличка есть.
Это какие еще? Механизм один — ядро пинает юзерспейсу id устройства, modprobe по табличке алиасов находит нужный модуль. Все.
В том же выхлопе modinfo rt73usb табличка есть.
А как ядро определяет, для какого устройства какой модуль грузить?
Есть устройство которое работает через COM-USB переходник (он внутри устройства стоит). Случайным образом при загрузке системы для устройства может быть загружен модуль pl2303 и соответственно оно станет /dev/ttyUSB*, а может загрузиться cdc_acm и оно станет /dev/ttyACM*
Внести один из этих модулей в blacklist я не могу, т.к. есть другие устройства, которые их используют. Как заставить ядро для USB устройства с конкретным ID грузить конкретный драйвер?
Есть устройство которое работает через COM-USB переходник (он внутри устройства стоит). Случайным образом при загрузке системы для устройства может быть загружен модуль pl2303 и соответственно оно станет /dev/ttyUSB*, а может загрузиться cdc_acm и оно станет /dev/ttyACM*
Внести один из этих модулей в blacklist я не могу, т.к. есть другие устройства, которые их используют. Как заставить ядро для USB устройства с конкретным ID грузить конкретный драйвер?
>как ядро определяет, для какого устройства какой модуль грузить?
habrahabr.ru/blogs/linux/112527/
>Случайным образом при загрузке системы
как-то очень странно — видимо устройство матчится под два разных драйвера и его ловит тот, который был загружен быстрее.
если действительно так, то похоже на баг и его надо бы отрепортить.
как воркарраунд, можно явно грузить один из модулей раньше, или прописать алиас.
еще можно разрулить на уровне имени устройства, написав хитрое правило udev.
habrahabr.ru/blogs/linux/112527/
>Случайным образом при загрузке системы
как-то очень странно — видимо устройство матчится под два разных драйвера и его ловит тот, который был загружен быстрее.
если действительно так, то похоже на баг и его надо бы отрепортить.
как воркарраунд, можно явно грузить один из модулей раньше, или прописать алиас.
еще можно разрулить на уровне имени устройства, написав хитрое правило udev.
lsmod покажет список загруженных модулей, modinfo — возможные опции загрузки конкретного модуля.
А вот есть ли способ узнать, с какими опциями загружен модуль? Это, пожалуй, даже чаще востребовано, чем modinfo, особенно с ноутбуками с snd-hda-intel с их вечными проблемами с входом для наушников.
А также интересно, можно ли «на лету» изменить параметры загрузки модуля без его выгрузки (иногда зависимости не дают выгрузить) и повторной загрузки.
Если эти два вопроса имеют решение, хорошо было бы его увидеть в самой статье для полноты картины — к остальному содержимому претензий нет.
А вот есть ли способ узнать, с какими опциями загружен модуль? Это, пожалуй, даже чаще востребовано, чем modinfo, особенно с ноутбуками с snd-hda-intel с их вечными проблемами с входом для наушников.
А также интересно, можно ли «на лету» изменить параметры загрузки модуля без его выгрузки (иногда зависимости не дают выгрузить) и повторной загрузки.
Если эти два вопроса имеют решение, хорошо было бы его увидеть в самой статье для полноты картины — к остальному содержимому претензий нет.
Довольно интересные вопросы… так чтобы списком получать я даже не знаю. Можно проверять значение параметра через файловую систему /sys: в каталоге "/sys/modules/<module_name>/parameters" сидят файлы, названные по имени параметра, данные в них — значения параметра.
А по поводу изменения параметров на лету никогда не сталкивался с проблемой, но поищу информацию. Спасибо за интересные вопросы.
А по поводу изменения параметров на лету никогда не сталкивался с проблемой, но поищу информацию. Спасибо за интересные вопросы.
Я всегда считал что некоторые вещи очень желательно делать модульными при сборке ядра, например — модуль wifi-карты и bluetooth. Все ради того, чтобы выгружать модуль ненужного в данный момент устройства и, типа, экономить электричество. Раскройте же глаза на правду, о линукс-гуру!)
Отличная статья. Хорошо структурирует знания и дает понимание четкое понимание того, как это все работает :)
Спасибо, теперь я хоть что-то понимаю в ядре линукса =)
modprobe -l
круто, спасибо за статью — после нее я наконец-то перестал бояться ядер/модулей)
Как win админ и немного lin считаю статью полезной для расширения кругозора и понимания процессов.
Спасибо!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работаем с модулями ядра в Linux