В этой короткой заметке рассмотрена процедура установки модулей ядра в дистрибутивах Fedora. Данная процедура может быть использована для добавления модулей ядра, не включенных в состав стокового ядра Fedora, а также для сборки модулей в дереве ядра в процессе разработки для этого дистрибутива.
Процедура установки описана на примере модулей шины CAN и дистрибутива Fedora 22.
Перед началом установки рекомендуется обновить систему:
Для сборки ядра используются RPM Development Tools. Дерево сборки RPM пакетов (~/rpmbuild/) создается командой:
Далее скачиваются исходники ядра:
Устанавливаются зависимости для сборки пакета ядра:
Пакет ядра устанавливается в дерево RPM:
Cоздается актуальное ядро (накатываются патчи и т.п.):
В актуальном ядре необходимо задать EXTRAVERSION по uname -r текущего ядра:
Теперь можно скопировать конфиг текущего ядра и включить требуемые модули:
Сборка модулей шины CAN:
Установка:
Процедура установки описана на примере модулей шины CAN и дистрибутива Fedora 22.
Перед началом установки рекомендуется обновить систему:
sudo dnf update
reboot
Для сборки ядра используются RPM Development Tools. Дерево сборки RPM пакетов (~/rpmbuild/) создается командой:
rpmdev-setuptree
Далее скачиваются исходники ядра:
dnf download --source kernel
Устанавливаются зависимости для сборки пакета ядра:
sudo dnf builddep kernel-4.1.6-200.fc22.src.rpm
Пакет ядра устанавливается в дерево RPM:
rpm -Uvh kernel-4.1.6-200.fc20.src.rpm
Cоздается актуальное ядро (накатываются патчи и т.п.):
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=$(uname -m) kernel.spec
В актуальном ядре необходимо задать EXTRAVERSION по uname -r текущего ядра:
cd ~/rpmbuild/BUILD/kernel-4.1.fc22/linux-4.1.6-200.fc22.i686
gedit Makefile
..
EXTRAVERSION = -200.fc22.i686
..
Теперь можно скопировать конфиг текущего ядра и включить требуемые модули:
cp /boot/config-4.1.6-200.fc22.i686 .config
make menuconfig
Сборка модулей шины CAN:
make modules_prepare
make M=net/can modules
make M=drivers/net/can modules
Установка:
sudo make M=net/can modules_install
sudo make M=drivers/net/can modules_install
sudo depmod -a
sudo modprobe can
jcmvbkbc
Попробуйте DKMS чтобы не ковыряться в дистровом ядре (и последующих обновлениях) руками.
spot62
Ковыряться в стоковом ядре все равно придется.
Кроме того, в случае DKMS не очень понятно, как быть если в очередном релизе ядра произошло также обновление и в модулях.
jcmvbkbc
Зачем?
Мммм? Возможно, «в интерфейсах/структурах данных используемых модулем»? Абстрагироваться и выбирать нужное портянками из #if LINUX_VERSION_CODE < KERNEL_VERSION(a,b,c). Делать это для модуля поддерживающего несколько версий ядра в любом случае придётся, а DKMS к этому ортогонален.
spot62
чтобы создать структуру модулей в пакете dkms
Да. В в интерфейсах/структурах данных используемых модулем(ями) пакета dkms. Т.е. нужен более свежий пакет dkms? dkms не умеет собирать новые модули из исходников текущего установленного ядра?