ГлавнаяРегистрацияВходВ закладки

Главная » Статьи » CentOS » Как настроить CentOS
Как автоматически обновлять собранный из исходников (sources) модуль при обновлении ядра
Весьма живая неувязка, т.к. нашим покупателям довольно частенько доводится устанавливать разные драйвера из исходников, а что, что при апгрейде ядра все падает - весьма нам не нравится.

Очередная добрая весть - он имеется в репозитории Epel и ставить его возможно так:
yum install -y dkms


Быстрый анализ представить, что dkms приплюсовал собственной сервис в запуск:
chkconfig --list | grep dkms
dkms_autoinstaller 0:off 1:off 2:on 3:on 4:on 5:on 6:off


Поэтому, очевидно по презентациям в вебах, он обязан скомпилить часть при загрузке (2,3,4,5 академия левелы), если внезапно его не заметит в новоиспеченном ядре.

А и клавиатура для CentOS по применению.

Теперь же устанавливаем нужный набор модулей для сборки модулей ядра: тык

Основываем папку для исходников модуля:
mkdir /usr/src/module-module-version


Приминительно ко мне сие станет:
mkdir /usr/src/r8168-8.015.00


Переходим в папку:
компакт -диски /usr/src/r8168-8.015.00


Стягиваем сорцы в данную папку (и устраняем за собой архивы и остальной сор):

wget http://download.hetzner.de/drivers/r8168-8.015.00.tar.bz2
tar -xf r8168-8.015.00.tar.bz2
rm -f r8168-8.015.00.tar.bz2
mv r8168-8.015.00/* ./
rm -r r8168-8.015.00



Создаем конфигурационный файл для нашего модуля (в именно этой папке):

vi dkms.conf


Тама проставляем последующее:

PACKAGE_NAME="r8168"
PACKAGE_VERSION="8.015.00"
BUILT_MODULE_NAME[0]="r8168"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/"
AUTOINSTALL="yes"


Вот "DEST_MODULE_LOCATION" спрашивает объяснения - это путь, ко какому станет возлежать Ваш модуль в /lib/modules, поэтому если не видите его, то пойдете в папку и поглядите, по какой-никакому пути лежат модули сходные Вашему.

Оборачиваю вниманье, что теперь я все бераю под ядром: Linux libvirt.ru 2.6.18-164.6.1.el5 #1 SMP Tue Nov три 16:12:36 EST 2009 x86_64 x86_64 x86_64 GNU/Linux (потребуется для следующих исследований).

Теперь подливаем наш модуль в репозиторий dkms:
dkms add -m r8168 -v восьмой.015.00


Берем часть:
dkms build -m r8168 -v 8.015.00


В процессе сможет следовать вот подобной облом:

Kernel preparation unnecessary for this kernel. Skipping...

Building module:
cleaning build область....
make KERNELRELEASE=2.6.18-164.6.1.el5 -C /lib/modules/2.6.18-164.6.1.el5/build M=/var/lib/dkms/r8168/8.015.00/build....

Error! Build of r8168.ko failed for: 2.6.18-164.6.1.el5 (x86_64)
Consult the make.log in the build directory
/var/lib/dkms/r8168/8.015.00/build/ for more information.


Какой выходит лишь потому, что dkms выискивает r8168.ko в нынешной папке ( ага, strace ), а он формируется в папке src.

По этой причине необходимо похачить:
mv src/* ./


И попатчить:

- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD)/src modules
+ $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules


И вновь бросим:
dkms build -m r8168 -v 8.015.00


И в результате приобретаем:

Kernel preparation unnecessary for this kernel. Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=2.6.18-164.6.1.el5 -C /lib/modules/2.6.18-164.6.1.el5/build M=/var/lib/dkms/r8168/8.015.00/build.....
cleaning build area....

DKMS: build Completed.


Теперь ставим его в нынешное ядро:

dkms install -m r8168 -v 8.015.00


В итоге видим следующее:


r8168.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/2.6.18-164.6.1.el5/extra/
Adding any weak-modules

depmod....

DKMS: install Completed.


Ну вот и все, модуль в системе:

find /lib | grep 8168
/lib/modules/2.6.18-164.6.1.el5/extra/r8168.ko


А пересоберется ли он под иную версию ядра? Правда давайте испытаем Испытывать станем на OpenVZ ядре, по этой причине все же ставим его -devel пакет:


yum install -y ovzkernel-devel.x86_64


Выкарабкаем его в grub.conf и ребутнемся, однако увы - модуль сам не скопился под ovz ядро.

А все потому, что:

dkms build -m r8168 -v 8.015.00

Error! Your kernel source for kernel 2.6.18-164.2.1.el5.028stab066.7 cannot be found at
/lib/modules/2.6.18-164.2.1.el5.028stab066.7/build or /lib/modules/2.6.18-164.2.1.el5.028stab066.7/source.
You can use the --kernelsourcedir option to tell DKMS where it's located.


По какой причине он не сумел отыскать путь к сорцам OVZ ядра я недослышал - possible bug, но вот такой хак подсобляет:

dkms build -m r8168 -v 8.015.00 --kernelsourcedir=/usr/src/kernels/2.6.18-164.2.1.el5.028stab066.10-x86_64/
dkms install -m r8168 -v 8.015.00


Ну вот и все, в прирученном режиме, но удачно:

find /lib | grep 8168
/lib/modules/2.6.18-164.6.1.el5/extra/r8168.ko
/lib/modules/2.6.18-164.2.1.el5.028stab066.7/extra/r8168.ko


Полагаюсь, с ядрами главной ветки подобного трабла не будет
Просмотров: 2964
Дата: 2011-08-11 01:25:02
Комментариев: 0
Источник: