Ядро Linux (получение информации и управление)

Декабрь 1st, 2010 Рубрики: Linux, основы 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!




Теги: , , , , ,

6 комментариев к “Ядро Linux (получение информации и управление)”

  1. creed.d
    Апрель 15th, 2012 at 17:40
    1

    Сам изучаю линукс,читаю твой блог частенько-многое правда уже знаю(из того что написано),тем не менее перечитываю с удовольствием—>все красочно,доступно изложено,без излишек.Продолжай в том же духе,молодец!!!
    p.s. а ты ведешь пост про ‘скриптинг’ в bash’e?

    • Апрель 15th, 2012 at 22:13
      2

      Спасибо за комментарий и мнение.
      На текущий момент пока нет темы о скриптинге. Не исключено, что в перспективе появится. Все что есть о bash, отписано в разделе bash.

  2. creed.d
    Апрель 16th, 2012 at 00:21
    3

    Просмотрел раздел о ‘bash’—>превосходная база,но для начинающих!!!
    Вообщем надеюсь что ты снизойдешь создать раздел о скриптинге в bash’e,для более опытных дебианщиков!!! ;)

  3. tux
    Март 17th, 2013 at 16:23
    4

    А как же на счёт того, что само устройство использует модуль? Тогда в выхлопе lsmod может стоять нолик, а вы предлагаете эти модули удалять.

    lsmod в списке used by показывает каким колличеством других модулей используется этот. А не устройством.

    • Март 17th, 2013 at 21:30
      5

      Спасибо за коммент, tux.
      К сожалению, man lsmod не многословен и не содержит объяснений вывода команды (
      Откуда информация, что » used by показывает каким колличеством других модулей используется этот.»? Если не трудно, дайте ссылочку?

  4. atel
    Сентябрь 22nd, 2013 at 18:15
    6

    Спаибо за статью, написано толково. Хорошо пригодилась при работе со сборкой линукса на STB, где manpages вообще отсутствуют в принципе. modinfo — оказалась крайне полезна.

Написать комментарий