3.9.3.1 Модули ядра
Скачать документ Общая информация
Загрузка/выгрузка модулей ядра
Автозагрузка модулей
Черный список
Окружение
- Версия РЕД ОС: 8
- Конфигурация: Рабочая станция, Сервер графический, Сервер минимальный
- Версия ядра: 6.6.51-1
Модули ядра – это фрагменты кода, которые могут быть загружены и выгружены в ядро по требованию. Они расширяют функциональность ядра без необходимости перезагрузки системы. Модуль может быть настроен, как встроенный в ядро или как загружаемый во время работы операционной системы.
Примеры модулей ядра – это драйверы различных устройств.
Общая информация
Все модули хранятся в папке /lib/modules/. Т.к. модули рассчитаны только на определенную версию ядра, для каждой установленной версии создается свой подкаталог.
Чтобы просмотреть список установленных версий ядра, выполните следующую команду:
ls /lib/modules/
Если у вас только одна версия ядра, терминал выведет примерно следующее:
6.6.51-1.red80.x86_64
Если версий ядра несколько, все они будут указаны.
Может возникнуть необходимость просмотреть все установленные модули для текущего ядра в системе, для этого следует выполнить команду:
find /lib/modules/$(uname -r) -name *.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/sysv/sysv.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/ufs/ufs.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/hfs/hfs.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/nfs_common/nfs_acl.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/nfs_common/grace.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/coda/coda.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/crc8.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/ts_bm.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/asn1_encoder.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/crc4.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/ts_fsm.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/reed_solomon/reed_solomon.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/math/cordic.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/crc7.ko /lib/modules/6.6.51-1.red80.x86_64/kernel/lib/lru_cache.ko
Иногда возникает необходимость уточнить, установлен ли какой-либо конкретный модуль ядра, для этого можно отфильтровать вывод поиска с помощью grep. Рассмотрим команду на примере модуля ip_tables:
find /lib/modules -name *.ko | grep ip_tables /lib/modules/6.6.51-1.red80.x86_64/kernel/net/ipv4/netfilter/ip_tables.ko
Для просмотра драйверов и модулей, загруженных в данный момент в системе, используется команда:
lsmod Module Size Used by uinput 20480 1 snd_seq_dummy 12288 0 snd_hrtimer 12288 1 qrtr 49152 2 rfkill 28672 3 sunrpc 839680 1 snd_hda_codec_generic 110592 1 ledtrig_audio 12288 1 snd_hda_codec_generic snd_hda_intel 61440 2 intel_rapl_msr 20480 0 snd_intel_dspcfg 36864 1 snd_hda_intel joydev 24576 0 intel_rapl_common 36864 1 intel_rapl_msr
Вывод представляет собой таблицу, в которой три столбца:
- Module — название модуля;
- Size — размер модуля (в байтах);
- Used by — количество экземпляров модуля, используемое в настоящее время. Нулевое значение говорит о том, что модуль не используется. Разделенный запятыми список после количества показывает, какие зависимости есть у модуля.
Если список загруженных в данный момент модулей большой, а интересует узнать, загружен ли какой-либо конкретный модуль, следует отфильтровать вывод командой grep:
lsmod | grep fuse
Если модуль загружен, lsmod его выведет. В противном случае — ответа на команду не будет.
В нашем случае модуль загружен и команда его показывает следующим образом:
fuse 208896 5
Для отображения подробной информации о модуле используется команда:
modinfo <имя_модуля>.
Выполним ее на примере модуля fuse:
modinfo fuse filename: /lib/modules/6.6.51-1.red80.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 Szeredialias: fs-fusectl depends: retpoline: Y intree: Y name: fuse vermagic: 6.6.51-1.red80.x86_64 SMP preempt mod_unload sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: 7D:17:9F:94:5B:21:CB:37:D6:2C:F8:DA:24:AE:5E:6C:BF:6C:51:C4 sig_hashalgo: sha512 signature: CC:1D:9B:D8:90:10:9A:1F:75:2B:B5:D7:A1:76:EC:C4:EE:9B:82:21: D2:F6:60:E4:74:CA:54:40:D6:60:A5:61:AE:8C:F5:95:74:2C:B3:21: 1D:B6:1B:64:B3:05:37:8B:3E:00:05:2F:24:03:92:E4:1B:79:03:BE: B9:A8:B1:E6:1C:16:67:C6:82:52:0D:D0:19:5D:C6:83:C9:B7:56:D9: 55:35:78:25:33:89:47:0A:29:8B:C8:2B:4E:03:F2:5C:D0:C0:CF:A8: B0:33:54:66:3E:36:49:F4:77:89:03:2C:6F:E5:9F:42:B4:C6:30:4C: 44:AD:04:DC:FE:92:E9:CE:1A:7F:FC:48:9E:4B:70:AB:F4:82:E4:D8: 67:DD:B2:11:64:73:73:3A:85:B5:EA:4C:28:99:34:62:D4:A7:5C:62: EE:2C:57:FF:3E:1A:15:C8:13:39:7F:43:6C:C9:66:61:35:CA:99:66: 2D:47:FF:B8:2E:75:59:E1:9E:33:A8:D3:01:F1:31:6B:E6:68:CC:1B: 64:A3:A9:96:68:D5:F8:7E:9A:64:56:10:F1:2A:68:B3:4E:5B:7A:27: 70:9C:81:F0:CD:E7:44:52:D8:26:0B:02:D3:8F:A2:8C:5F:BD:5C:4B: 63:23:57:C2:0E:D5:E1:99:F2:BB:2D:4D:A5:A7:56:2E:6F:7D:84:11: 30:BB:0E:03:26:FE:BC:A8:49:FF:7A:F4:0E:8D:AD:EC:CA:4B:CC:FE: 07:70:F4:7E:60:5D:2C:4C:E7:D1:DA:28:E9:B0:1E:DD:13:4E:06:2D: 66:F5:0F:63:98:D7:63:E4:DD:DC:74:2A:C7:C0:FC:8F:D4:3F:9F:20: 2B:D3:E5:DF:B7:A3:8A:6F:8B:A8:55:BC:FB:3C:39:A7:97:44:7D:53: 46:9B:B9:33:DF:BD:78:2A:BC:D0:2A:92:DB:A8:17:3F:E3:A5:25:C9: B7:0C:B2:80:F3:55:C1:2E:72:74:01:21:0A:AB:10:75:29:DF:5C:6F: 28:24:91:04:FF:29:A3:7C:64:6A:7D:6A:4F:F0:76:56:F9:42:FD:E5: BF:90:10:87:D5:DE:FD:48:85:A6:04:D4:A4:F0:7A:F5:42:6F:C2:EB: 74:85:BC:34:08:41:9C:51:05:7C:39:C9:DA:CE:67:77:69:3C:AD:B4: 6D:4E:40:03:DC:26:CE:F4:5D:8F:E8:BA:FB:D9:8B:BA:E9:58:F5:C3: FE:4F:9F:3D:EA:92:D1:DB:E7:13:16:36:B5:CB:3B:CD:B1:50:EE:DD: 4B:72:76:76:AB:EB:7F:BB:E1:6C:2E:31:C5:E9:6D:14:F9:06:03:38: B3:50:37:82:A6:64:7F:BF:43:25:78:16 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) parm: allow_sys_admin_access:Allow users with CAP_SYS_ADMIN in initial userns to bypass allow_other access check (bool)
Есть возможность просмотреть список опций, установленных для загруженного модуля. Просмотр осуществляется командой systool (входит в пакет sysfsutils):
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 fuse alias char_major_10_229 fuse alias devname:fuse fuse alias fs_fuse fuse alias fs_fuseblk fuse alias fs_fusectl fuse alias symbol:efuse_one_byte_read rtlwifi alias symbol:efuse_power_switch rtlwifi alias symbol:efuse_read_1byte rtlwifi alias symbol:efuse_shadow_read rtlwifi alias symbol:fuse_abort_conn fuse alias symbol:fuse_conn_destroy fuse alias symbol:fuse_conn_get fuse alias symbol:fuse_conn_init fuse alias symbol:fuse_conn_put fuse alias symbol:fuse_dax_cancel_work fuse alias symbol:fuse_dequeue_forget fuse
Получить список зависимостей модуля (или псевдонима), включая сам модуль, с созданием (возможно пустого) набора имён файлов модулей, по одному в строке, каждое из которых начинается с «insmod», можно с помощью команды:
modprobe --show-depends fuse insmod /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/fuse/fuse.ko
Загрузка/выгрузка модулей ядра
Загрузка модулей ядра осуществляется командами modprobe и insmod. Принцип их действия один и тот же, но отличаются передаваемые параметры. Команде modprobe передается только название модуля modprobe <имя_модуля>.
Например:
modprobe fuse
Для команды insmod необходимо передать адрес файла модуля (его можно узнать командой modinfo):
modinfo fuse | grep filename filename: /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/fuse/fuse.ko insmod /lib/modules/6.6.51-1.red80.x86_64/kernel/fs/fuse/fuse.ko
Для выгрузки (выключения) модуля из ядра также можно использовать одну из двух команд - modprobe или rmmode. Команде modprobe обязательно требуется передать опцию –r:
modprobe -r 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-6.6.51-1.red80.x86_64.img 6.6.51-1.red80.x86_64 -v
* где 6.6.51-1.red80.x86_64 - это текущая версия ядра.
Дата последнего изменения: 16.10.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.