модули ядра: алиасы

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

модули ядра: алиасы

Непрочитанное сообщение Olej » 10 апр 2012, 12:12

Я уже этот вопрос обозначал в другой теме viewtopic.php?f=18&t=1646&start=10#p3551, но это было вскользь:
Olej писал(а):
Olej писал(а): Существуют же алиасы для модулей в файле modules.alias ?:
Как? ;-)
... загрузить модуль из файла YYY.ko так, чтобы он встал как модуль (lsmod) как XXX?
Но вопрос то интересный.
Например:
- сетевой модуль zzz.ko создаёт сетевой интерфейс записанный в его инициализации как "zzz%d" ...
- при загрузке будет создан интерфейс zzz0 ...
- при повторной загрузке модуля был бы создан ещё один интерфейс zzz1 ...
- ... если бы система позволила повторно загрузить ещё один экземпляр zzz.ko.

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение Olej » 10 апр 2012, 12:23

Некоторые соображения в тему:
Olej писал(а):
Olej писал(а): Как? ;-)
... загрузить модуль из файла YYY.ko так, чтобы он встал как модуль (lsmod) как XXX?
Вот такая задача.
1. загрузить модуль под алиасным именем просто:

Код: Выделить всё

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/string.h>

#define LOG(...) printk( KERN_INFO "! "__VA_ARGS__ )

static char* alias = NULL;
module_param( alias, charp, 0 );

int __init init( void ) {
   if( alias != NULL ) strcpy( THIS_MODULE->name, alias );
   LOG( "module %s loaded", THIS_MODULE->name );
   return 0;
}

void __exit exit( void ) {
   LOG( "module %s unloaded", THIS_MODULE->name );
}

Код: Выделить всё

[olej@notebook alias]$ sudo insmod mod_test.ko alias=XXX
[olej@notebook alias]$ dmesg | tail -n1
[ 3187.502753] ! module XXX loaded
и даже

Код: Выделить всё

[olej@notebook alias]$ sudo rmmod mod_test
ERROR: Module mod_test does not exist in /proc/modules
[olej@notebook alias]$ lsmod | head -n3
Module                  Size  Used by
XXX                    12452  0 
fuse                   71167  3 
[olej@notebook alias]$ sudo rmmod XXX
Но это не решает проблему, при загрузке 2-го экземпляра:

Код: Выделить всё

[olej@notebook alias]$ sudo insmod mod_test.ko alias=XXX
[olej@notebook alias]$ sudo insmod mod_test.ko alias=YYY
insmod: error inserting 'mod_test.ko': -1 Invalid parameters
[olej@notebook alias]$ dmesg | tail -n2
[ 4602.224877] ! module XXX loaded
[ 4611.800836] mod_test: module is already loaded
- система контролирует загрузку модулей (и правильно делает! - это целостность всей системы), но делает это не по тому имени, под которым модуль известен и зарегистрирован в системе! ... а каким-то (почти наверняка) контролем тела файла из которого грузится модуль.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение Olej » 10 апр 2012, 12:55

Olej писал(а):- система контролирует загрузку модулей (и правильно делает! - это целостность всей системы), но делает это не по тому имени, под которым модуль известен и зарегистрирован в системе! ... а каким-то (почти наверняка) контролем тела файла из которого грузится модуль.
Вот интересный факт:

Код: Выделить всё

[olej@notebook alias]$ cp mod_test.ko mod_test1.ko
[olej@notebook alias]$ sudo insmod mod_test1.ko
[olej@notebook alias]$ lsmod | head -n3
Module                  Size  Used by
mod_test               12452  0
fuse                   71167  3
- сколько не переименовывай файл модуля (из которого он грузится), имя под которым грузится модуль не меняется. Т.е. это имя просто совпадает по дефаулту с именем файла модуля при его сборке, но записано оно где-то в содержимом этого файла .ko.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение bose » 10 апр 2012, 22:18

Olej писал(а):
Olej писал(а):- система контролирует загрузку модулей (и правильно делает! - это целостность всей системы), но делает это не по тому имени, под которым модуль известен и зарегистрирован в системе! ... а каким-то (почти наверняка) контролем тела файла из которого грузится модуль.
Наверное ключ
srcversion: 791C83080EEAD97F5844B9A

Код: Выделить всё

$ modinfo mod_procr.ko
filename:       mod_procr.ko
author:         Oleg Tsiliuric <olej@front.ru>
license:        GPL
srcversion:     791C83080EEAD97F5844B9A
depends:        
vermagic:       3.0.0-16-generic SMP mod_unload modversions 686

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение Olej » 10 апр 2012, 22:34

bose писал(а):
Olej писал(а):
Olej писал(а):- система контролирует загрузку модулей (и правильно делает! - это целостность всей системы), но делает это не по тому имени, под которым модуль известен и зарегистрирован в системе! ... а каким-то (почти наверняка) контролем тела файла из которого грузится модуль.
Наверное ключ
srcversion: 791C83080EEAD97F5844B9A

Код: Выделить всё

$ modinfo mod_procr.ko
filename:       mod_procr.ko
author:         Oleg Tsiliuric <olej@front.ru>
license:        GPL
srcversion:     791C83080EEAD97F5844B9A
depends:        
vermagic:       3.0.0-16-generic SMP mod_unload modversions 686
Очень даже возможно.
Но ведь он тоже должен, как и имя модуля (см. выше), иметь возможность динамической смены средствами API.

P.S. Я как-то встречал в описаниях возможность (опциями insmod?) отменить вообще контроль соответствия сигнатуры ОС в модуле ... т.е. загружать модуль, который, возможно, собирался и для другого ядра. Что такая возможность есть - это точно. Но я ещё тогда отметил, что это экстремально опасный трюк, это на манер "русской рулетки", и оставил его в стороне... А сейчас не могу вспомнить: что это было?

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение bose » 10 апр 2012, 22:42

Olej писал(а): Очень даже возможно.
Но ведь он тоже должен, как и имя модуля (см. выше), иметь возможность динамической смены средствами API.

P.S. Я как-то встречал в описаниях возможность (опциями insmod?) отменить вообще контроль соответствия сигнатуры ОС в модуле ... т.е. загружать модуль, который, возможно, собирался и для другого ядра. Что такая возможность есть - это точно. Но я ещё тогда отметил, что это экстремально опасный трюк, это на манер "русской рулетки", и оставил его в стороне... А сейчас не могу вспомнить: что это было?
бывает ещё необходимость загрузки одного и того же модуля но с разными параметрами

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение Olej » 10 апр 2012, 22:50

bose писал(а):
Olej писал(а): Очень даже возможно.
Но ведь он тоже должен, как и имя модуля (см. выше), иметь возможность динамической смены средствами API.

P.S. Я как-то встречал в описаниях возможность (опциями insmod?) отменить вообще контроль соответствия сигнатуры ОС в модуле ... т.е. загружать модуль, который, возможно, собирался и для другого ядра. Что такая возможность есть - это точно. Но я ещё тогда отметил, что это экстремально опасный трюк, это на манер "русской рулетки", и оставил его в стороне... А сейчас не могу вспомнить: что это было?
бывает ещё необходимость загрузки одного и того же модуля но с разными параметрами
Параметры - параметрами...
Я это и делал в примере выше: в качестве параметра задавалось имя, под которым модуль будет загружен и далее известен системе. Даже так ... и это возможно параметризовать. Но загрузить 2 экземпляра модуля под разными именами параметризованных - система не позволяет.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение bose » 11 апр 2012, 16:56

Olej писал(а): Параметры - параметрами...
Я это и делал в примере выше: в качестве параметра задавалось имя, под которым модуль будет загружен и далее известен системе. Даже так ... и это возможно параметризовать. Но загрузить 2 экземпляра модуля под разными именами параметризованных - система не позволяет.
Olej писал(а): - система контролирует загрузку модулей (и правильно делает! - это целостность всей системы), но делает это не по тому имени, под которым модуль известен и зарегистрирован в системе! ... а каким-то (почти наверняка) контролем тела файла из которого грузится модуль.
Olej писал(а): P.S. Я как-то встречал в описаниях возможность (опциями insmod?) отменить вообще контроль соответствия сигнатуры ОС в модуле ... т.е. загружать модуль, который, возможно, собирался и для другого ядра. Что такая возможность есть - это точно.
Ну тут как всегда, чем много писать - лучше посмотреть в исходном коде как это всё работает :geek:
1) Сам insmod тупой как пробка - тупо собирает параметры и копирует файл в пользовательский буфер и далее вызов syscall. Весь процессинг идёт в syscall init_module (sys_init_module) - http://lxr.free-electrons.com/source/ke ... le.c#L2978
2) Все чеки делаются здесь - http://lxr.free-electrons.com/source/ke ... le.c#L2835
Например:
- контроль имени

Код: Выделить всё

if (find_module(mod->name)) {
         err = -EEXIST;
         goto unlock;
}
- проверка на конфликт с уже экспортироваными ядром символами
- проверка на соответсвие модуля исполняемому формату ELF
3) Форсирование вермаджика - http://lxr.free-electrons.com/source/ke ... le.c#L2513

Код: Выделить всё

/* This is allowed: modprobe --force will invalidate it. */
        if (!modmagic) {
                err = try_to_force_load(mod, "bad vermagic");
                if (err)
                       return err;
4) то сообщение ([ 4611.800836] mod_test: module is already loaded), которое вы получили исходит от сюда (попытка инициализации sysfs для модуля) - http://lxr.free-electrons.com/source/ke ... le.c#L1532

Но Г Л А В Н О Е!!!!
А главное, почему не работает ваш трюк с алиасами - определённая вами функция инициализации модуля, выполняется позже всех этих проверок (когда вы ещё не переименовали его явно)
http://lxr.free-electrons.com/source/ke ... le.c#L2978

Код: Выделить всё

SYSCALL_DEFINE3(init_module, void __user *, umod,
                unsigned long, len, const char __user *, uargs)
{
................................................
	/* Do all the hard work */
        mod = load_module(umod, len, uargs); // <------ тут проверки
        if (IS_ERR(mod))
                return PTR_ERR(mod);
.................................................
        if (mod->init != NULL)
                ret = do_one_initcall(mod->init); // <----- тут вы переименовываете
................................................
}

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение Olej » 11 апр 2012, 20:03

bose писал(а): Но Г Л А В Н О Е!!!!
А главное, почему не работает ваш трюк с алиасами - определённая вами функция инициализации модуля, выполняется позже всех этих проверок (когда вы ещё не переименовали его явно)
Всё понял (и до и после).

А что можно придумать? ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модули ядра: алиасы

Непрочитанное сообщение Olej » 11 апр 2012, 23:56

bose писал(а): Ну тут как всегда, чем много писать - лучше посмотреть в исходном коде как это всё работает :geek:
1) Сам insmod тупой как пробка - тупо собирает параметры и копирует файл в пользовательский буфер и далее вызов syscall. Весь процессинг идёт в syscall init_module (sys_init_module) - http://lxr.free-electrons.com/source/ke ... le.c#L2978
2) Все чеки делаются здесь - http://lxr.free-electrons.com/source/ke ... le.c#L2835
И что интересно ;) ... что в моём более позднем варианте рукописи "Модули ядра" есть целый раздел, с примерами работающего кода, относительно загрузки модулей как из пользовательских процессов, так и из других родительских модулей:
Динамическая загрузка 285
... из процесса пользователя 286
... из модуля ядра 290
Подключаемые плагины 293
Обсуждение 299
- почти 15 страниц.
Но я эту часть сделал - и из головы выкинул. Полезная привычка. ;-)

P.S. Не помню, этот раздел уже был в последней выложенной на сайте редакции?

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей