Лицензирование модулей ядра Linux
Прежде чем загружать модуль в ядро Linux, необходимо указать его лицензию. Это обязательное условие, если вы хотите избежать появления предупреждения «tainted kernel».
Назначение лицензирования
Когда вы используете MODULE_LICENSE(), вы сообщаете ядру, какая лицензия применяется к вашему модулю. В зависимости от этого:
Ядро может разрешить загрузку модуля без «запятнанного» статуса (если лицензия совместима с GPL)
Или вы получите предупреждение, если лицензия проприетарная или отсутствует
Пример «tainted»:
module: no license; tainting kernel
Допустимые значения
Наиболее часто используемые строки:
«GPL» — GNU General Public License
«GPL v2» — GNU GPL версии 2
«Dual BSD/GPL» — двойная лицензия
«Proprietary» — проприетарная лицензия (такая помечает ядро как tainted)
Простой пример лицензионного блока
#include <linux/module.h>
#include <linux/init.h>
static int __init hello_init(void) {
printk(KERN_INFO "Привет от Garvis!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Пока от Garvis!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Garvis");
MODULE_DESCRIPTION("Минимальный модуль с лицензией");
Пошаговая инструкция
Добавьте директиву MODULE_LICENSE(«GPL»); в конец файла модуля (обычно перед последней строкой).
Проверьте, что лицензия действительно входит в список разрешённых (иначе получите «tainted»).
(Опционально) Добавьте MODULE_AUTHOR, MODULE_DESCRIPTION и MODULE_VERSION:
MODULE_AUTHOR("Ваше имя или проект");
MODULE_DESCRIPTION("Описание модуля");
MODULE_VERSION("1.0");
Соберите и загрузите модуль:
$ make
$ sudo insmod garvis_greet.ko
$ dmesg | tail
Убедитесь, что нет строки tainting kernel.
Итоги
Корректное лицензирование модуля важно как с юридической, так и с технической точки зрения. Оно позволяет ядру правильно интерпретировать поведение модуля и избежать ошибок при разработке.