6.10 Модули ядра

Общая информация
Загрузка/выгрузка модулей ядра
Автозагрузка модулей
Черный список

 

Модули ядра – это фрагменты кода, которые могут быть загружены и выгружены в ядро по требованию. Они расширяют функциональность ядра без необходимости перезагрузки системы. Модуль может быть настроен, как встроенный в ядро или как загружаемый во время работы операционной системы.
Примеры модулей ядра – это драйверы различных устройств.

Общая информация

Все модули хранятся в папке /lib/modules/. Т.к. модули рассчитаны только на определенную версию ядра, для каждой установленной версии создается свой подкаталог.

Чтобы просмотреть список установленных версий ядра, выполните следующую команду:

ls /lib/modules/

Если у вас только одна версия ядра, терминал выведет примерно следующее:

5.10.29-1.el7.x86_64

Если версий ядра несколько, все они будут указаны.

Может возникнуть необходимость просмотреть все установленные модули для текущего ядра в системе, для этого следует выполнить команду:

find /lib/modules/$(uname -r) -name *.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/crc4.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/crc8.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/lz4/lz4_compress.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/lz4/lz4hc_compress.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/reed_solomon/reed_solomon.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/objagg.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/lru_cache.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/ts_bm.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/crc-itu-t.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/ts_fsm.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/math/cordic.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/crc7.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/crc64.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/ts_kmp.ko
/lib/modules/5.10.29-1.el7.x86_64/kernel/lib/parman.ko

Иногда возникает необходимость уточнить, установлен ли какой-либо конкретный модуль ядра, для этого можно отфильтровать вывод поиска с помощью grep. Рассмотрим команду на примере модуля ip_tables:

find /lib/modules -name *.ko | grep ip_tables
/lib/modules/5.10.29-1.el7.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko

Для просмотра драйверов и модулей, загруженных в данный момент в системе, используется команда:

lsmod
Module				  Size		Used by	
nls_utf8 			  16384		1
isofs				  53248		1
snd_hrtimer			  16384		1
rfkill				  28672		2
vsock_loopback			  16384 	0
vmw_vsock_virtio_transport_common 36864 	1 vsock_loopback
vmw_vsock_vmci_transport	  32768 	2
vsock 				  49152 	7 vmw_vsock_virtio_transport_common, vsock_loopback, vmw_vsock_vmci_transport
sunrpc 				  651264 	1
snd_ens1371 			  36864 	4

Вывод представляет собой таблицу, в которой три столбца:

  • Module — название модуля;
  • Size — размер модуля (в байтах);
  • Used by — количество экземпляров модуля, используемое в настоящее время. Нулевое значение говорит о том, что модуль не используется. Разделенный запятыми список после количества показывает, какие зависимости есть у модуля.
  •  

    Если список загруженных в данный момент модулей большой, а интересует узнать, загружен ли какой-либо конкретный модуль, следует отфильтровать вывод командой grep:

    lsmod | grep ip_tables

    Если модуль загружен, lsmod его выведет. В противном случае — ответа на команду не будет.
    В нашем случае модуль загружен и команда его показывает следующим образом:

    ip_tables 		28672 	0

    Для отображения подробной информации о модуле используется команда:
    modinfo <имя_модуля>.

    Выполним ее на примере модуля fuse:

    modinfo fuse
    filename:	/lib/modules/5.10.29-1.el7.x86_64/kernel/fs/fuse/fuse.ko
    alias:		devname:fuse
    alias:		char-major-10-229
    alias:		fs-fuseblk
    alias:		fs-fuse
    license:	GPL
    description:	Filesystem in Userspace
    author:		Miklos Szeredi 
    alias: 		fs-fusectl
    depends:
    retpoline:	Y
    intree:		Y
    name:		fuse
    vermagic:	5.10.29-1.el7.x86_64 SMP mod_unload
    sig_id:		PKCS#7
    signer:		Red Soft Kernel Signing key
    sig_key:	1B:2C:9A:D2:F1:D0:C7:8D:82:8F:62:82:B1:3E:F9:0D:7E:66:FF:01
    sig_hashalgo:	sha256	
    signature:	6E:62:46:91:B3:AE:74:0A:BA:67:28:61:A8:A4:FD:CC:A2:2E:DF:85:
    		E5:C2:38:56:8C:EB:C3:82:24:4F:8A:EA:5B:12:E0:E1:E9:78:D5:00:
    		FF:EA:53:C2:3A:4D:6B:35:43:CC:6A:41:F4:8B:E0:D5:57:23:F9:F2:
    		D9:ED:10:4B:8A:83:0A:34:CF:4E:BF:B6:EC:CD:E5:7F:C1:30:BA:2D:
    		B4:84:1A:F1:69:C7:BA:C3:39:0B:9C:56:BD:6C:1B:F8:CC:14:8A:32:
    		42:C5:82:37:78:43:C2:6B:1C:E8:99:EE:85:27:48:79:C1:68:07:AE:
    		3E:02:B8:64:8E:4F:06:C2:E3:5C:55:D2:96:1B:0E:56:49:A6:97:C2:
    		D6:5C:0A:DA:75:A4:48:C0:F3:1F:D0:A2:4F:92:5A:F7:9F:AB:B4:9D:
    		19:C4:5F:2C:E4:CB:33:20:41:4D:3A:64:02:2B:47:A1:C1:5E:89:35:
    		76:54:CD:06:D7:77:C5:44:C5:BB:FA:F4:77:62:C7:D8:7B:93:E9:F4:
    		CB:20:81:B5:33:52:7D:8B:B7:49:C4:54:56:34:89:B2:79:5C:29:8D:
    		BF:1B:64:19:8E:0E:4D:51:9D:B3:CC:38:5F:3C:4D:CB:EC:27:D5:B5:
    		EE:9C:59:AA:56:D4:AA:A7:25:5C:0D:64:BA:8E:C7:15:CE:7F:FB:D2:
    		9D:FB:F0:DA:E1:09:AD:8F:50:12:A3:6A:F9:B0:C9:52:FE:7E:67:B6:
    		FD:F3:3A:76:5C:14:63:D5:B5:4C:99:06:A4:32:B8:03:3F:6B:DC:DC:
    		07:12:90:08:2F:9A:11:ED:B8:DD:63:A3:AC:15:B7:20:7B:8E:C3:30:
    		60:B7:73:E7:6D:AF:5C:3B:AE:56:43:6F:F1:80:A4:29:3F:C8:01:EE:
    		C2:8E:78:30:2E:5E:22:38:7D:37:AE:61:C6:F7:35:3B:D5:A7:1E:C8:
    		7B:07:E9:27:B5:13:AC:7C:E7:86:40:98:9B:D1:23:52:35:3E:FA:A6:
    		10:EE:0B:9E:23:17:D4:1D:0A:C9:0C:7B:D2:7F:F9:BB:54:83:B8:17:
    		9B:BD:D5:CC:E8:65:0F:C7:14:33:42:78:27:78:AF:7E:9D:5D:A4:D1:
    		4C:87:E8:0A:DE:CD:45:DE:18:09:CD:77:AD:55:10:4F:3C:8C:25:09:
    		11:5F:29:EF:69:26:57:0B:23:90:FC:4A:8C:38:EF:FA:26:47:94:22:
    		21:C8:12:A3:B2:76:F5:91:9C:FF:7B:8D:C6:03:40:A8:5E:6F:A5:0B:
    		07:4F:84:48:0D:1F:66:6E:37:59:0C:4D:11:9D:C5:F0:2C:26:78:62:
    		29:97:C6:D5:D0:2A:D5:BB:8F:14:10:67
    parm: 	max_user_bgreq:Global limit for the maximum number of backgrounded requests an unprivileged user can set (uint)
    parm:	max_user_congthresh:Global limit for the maximum congestion threshold an unprivileged user can set (uint)

    Есть возможность просмотреть список опций, установленных для загруженного модуля. Просмотр осуществляется командой systool:

    systool [<опция> [имя_модуля]]
        -a			Show attributes
        -b <bus_name>	Show a specific bus
        -c <class_name>	Show a specific class
        -d			Show only devices
        -h			Show usage
        -m <module_name>	Show a specific module
        -p			Show path to device/driver
        -v			Show all attributes with values
        -A <attribute_name>	Show attribute value
        -D			Show only drivers
        -P			Show device's parent

    Команда systool без переданных параметров выводит список всех модулей, разделенный на секции: bus, class, devices, modules. Это сделано для того, чтобы можно было корректно передавать команде опции и получать правильный вывод.

    Чтобы отобразить конфигурацию определенного модуля, например ip_tables, выполним команду:

    modprobe –c | grep ip_tables
    alias ipt_icmp ip_tables
    alias symbol:ipt_alloc_initial_table ip_tables
    alias symbol:ipt_do_table ip_tables
    alias symbol:ipt_register_table ip_tables
    alias symbol:ipt_unregister_table ip_tables
    alias symbol:ipt_unregister_table_exit ip_tables
    alias symbol:ipt_unregister_table_pre_exit ip_tables

    Получить список зависимостей модуля (или псевдонима), включая сам модуль, с созданием (возможно пустого) набора имён файлов модулей, по одному в строке, каждое из которых начинается с «insmod», можно с помощью команды:

    modprobe –-show-depends fuse
    insmod /lib/modules/5.10.29-1.el7.x86_64/kernel/fs/fuse/fuse.ko

    Загрузка/выгрузка модулей ядра

    Загрузка модулей ядра осуществляется командами modprobe и insmod. Принцип их действия один и тот же, но отличаются передаваемые параметры. Команде modprobe передается только название модуля modprobe <имя_модуля>.
    Например:

    modprobe fuse

    Для команды insmod необходимо передать адрес файла модуля (его можно узнать командой modinfo):

    modinfo fuse | grep filename
    filename:	/lib/modules/5.10.29-1.el7.x86_64/kernel/fs/fuse/fuse.ko
    insmod /lib/modules/5.10.29-1.el7.x86_64/kernel/fs/fuse/fuse.ko

    Для выгрузки (выключения) модуля из ядра также можно использовать одну из двух команд — modprobe или rmmode. Команде modprobe обязательно требуется передать опцию –r:

    modprobe –r fuse

    Альтернативная команда выглядит несколько проще:

    rmmode fuse

    Если после выполнения команды выгрузки возникает ошибка типа:

    modprobe: FATAL: Module fuse is in use.

    это значит, что в данный момент модуль выгружен быть не может, т.к. он используется. Бывает, что в ошибке явно указывается, какими модулями используется необходимый к выгрузке, и тогда сперва требуется выгрузить их.

    Автозагрузка модулей

    Для того чтобы каждый раз не производить ручную загрузку тех или иных модулей, работать с которыми требуется регулярно, в РЕД ОС существует отдельный каталог, в котором можно настроить автоматическую загрузку модулей при старте системы — /etc/modules-load.d/. В каталоге хранятся конфигурационные файлы *.conf, содержащие наименования необходимых модулей.

    Кроме указанной выше директории также считываются файлы конфигурации из /run/modules-load.d/*.conf и /usr/lib/modules-load.d/*.conf. Если директории пустые, то можно создать файл и поместить нужные модули для автозагрузки. Каждый файл конфигурации имеет имя вида:
    */modules-load.d/<program>.conf

    Файлы конфигурации содержат список имён модулей ядра для загрузки, разделённых символами новой строки. Пустые строки и строки, чей первый не пробельный символ — # (решётка) или ; (точка с запятой) игнорируются.
    Например, можно создать файл autorun.conf в каталоге /etc/modules-load.d/:

    nano /etc/modules-load.d/autorun.conf

    В данный файл построчно добавляются все необходимые модули, например:

    video
    e1000
    serio_raw

    При следующей загрузке системы указанные в файле модули будут автоматически загружены.

    Черный список

    Чёрный список в контексте модулей ядра – это механизм, предотвращающий загрузку того или иного модуля. Это может быть полезно, если связанное оборудование не требуется или загрузка этого модуля вызывает проблемы. Например, могут быть два модуля ядра, которые пытаются управлять одним и тем же компонентом оборудования, и загрузка их вместе приведёт к конфликту.

    Для запрета загрузки определенного модуля ядра создайте конфигурационный файл block_modules.conf в каталоге /etc/modprobe.d/ и добавьте в нем строку для каждого модуля, который вы хотите добавить в чёрный список, используя ключевое слово «blacklist».

    Например, если вы хотите запретить загрузку модуля pcspkr, создайте файл /etc/modprobe.d/block_modules.conf и добавьте в него строку:

    blacklist pcspkr /bin/true

    * где /bin/true устанавливает запрет на загрузку модулей, зависящих от занесенного в черный список.

    Некоторые модули загружаются как часть initramfs. То есть можно выделить модули, которые загружаются:

  • из файлов .ko;
  • как часть initramfs (initial ramdisk).
  • Для запрета загрузки модулей первого типа (загружаемых из файлов .ko) достаточно внести запись об этом модуле в файл /etc/modprobe.d/*.conf с директивой blacklist.

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

    dracut --force /boot/initramfs-5.10.29-1.el7.x86_64.img 5.10.29-1.el7.x86_64 -v

    * где 5.10.29-1.el7.x86_64 — это текущая версия ядра.

    Если вы нашли ошибку, выделите текст и нажмите Ctrl+Enter.

    Print Friendly, PDF & Email