Как автоматически обновлять собранный из исходников (sources) модуль при обновлении ядра
Автор: admin Раздел: Как настроить CentOS
Весьма живая неувязка, т.к. нашим покупателям довольно частенько доводится устанавливать разные драйвера из исходников, а что, что при апгрейде ядра все падает - весьма нам не нравится.
Очередная добрая весть - он имеется в репозитории 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 А пересоберется ли он под иную версию ядра? Правда давайте испытаем ![]() 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 Полагаюсь, с ядрами главной ветки подобного трабла не будет |