Ситуация выгдядит следующим образом: есть пересборка (respin) Fedora Core 8 c обновлениями и авто-установкой. В пост-установочных скриптах (kickstart) происходит создание административной установки wine и пересборка модулей hasp и linux-cifs. Однако версии ядра на котором проводится установка (т.е. того которое включено в install image) не совпадает с версией ядра которое будет рабочим на системе после установки. Как правило рабочее ядро новее и используется то которое приезжает с обновлениями. Поэтому логика определения версии ядра в /usr/src/aksparln/build.sh и /usr/src/linux-cifs/buildmodule.sh отрабатывает неверно. Для таких случаем определение версии ядра должно быть переопределяемым. В моем случае по окончании установки в /boot будет единственное рабочее ядро. Предлагаются патчи для возможности кросс-пересборки модулей под версию ядра, отличной от текущей выполняемой. >--- /usr/src/aksparlnx/build.sh 2008-01-13 20:24:09.000000000 +0300 >+++ /root/init-setup/build.sh-sgc-patched 2008-01-13 20:25:22.000000000 +0300 >@@ -38,9 +38,13 @@ > done > fi >- >-VERSION=$(uname -r) >-MAJVERSION=$(uname -r | cut -f2 -d.) >+if [ -z $KERNELVERSION ]; then >+ VERSION=$(uname -r) >+ MAJVERSION=$(uname -r | cut -f2 -d.) >+else >+ VERSION=$KERNELVERSION >+ MAJVERSION=$(echo -ne $KERNELVERSION | cut -f2 -d.) >+fi > > # source and destination directories can be inherited from the environment >--- /usr/src/linux-cifs/buildmodule.sh 2007-12-28 23:49:44.000000000 +0300 >+++ /root/init-setup/buildmodule.sh-sgc-patched 2008-01-13 19:58:55.000000000 +0300 >@@ -7,7 +7,8 @@ > > MODULENAME=cifs.ko > BUILDDIR=/usr/src/linux-cifs >-KERNELVERSION=$(uname -r) >+ >+[ -z $KERNELVERSION ] && KERNELVERSION=$(uname -r) > > # SMP build > [ -z "$RPM_BUILD_NCPUS" ] && RPM_BUILD_NCPUS=`/usr/bin/getconf _NPROCESSORS_ONLN` >@@ -20,7 +21,7 @@ > fi > if [ -z "$INSTALL_MOD_PATH" ]; then > #INSTALL_MOD_PATH=/lib/modules/$KERNELVERSION/kernel/extra >- INSTALL_MOD_PATH=/lib/modules/linux-cifs >+ INSTALL_MOD_PATH=/lib/modules/linux-cifs/$KERNELVERSION > fi > > echo >--- /etc/init.d/linux-cifs 2007-10-12 21:16:36.000000000 +0400 >+++ /root/init-setup/linux-cifs.sgc-patched 2007-10-21 17:53:33.000000000 +0400 >@@ -186,6 +187,8 @@ > ;; > build) > cd /usr/src/linux-cifs >+ KERNELVERSION=`ls /boot/vmlinuz-* | sed -n -e "s/^\S\{1\,\}-\(\S\{1\,\}\)-\{1\}\(\S\{1\,\}\)$/\1-\2/pg" ` >+ export KERNELVERSION > sh buildmodule.sh > ;; > status) > --- /etc/init.d/haspd 2007-12-04 17:19:53.000000000 +0300 +++ /root/init-setup/haspd-sgc-patched 2008-01-14 14:11:44.000000000 +0300 >@@ -286,6 +286,8 @@ > # remove manual built module > rm -f $MANMODULEPATH > cd /usr/src/aksparlnx >+ KERNELVERSION=`ls /boot/vmlinuz-* | sed -n -e "s/^\S\{1\,\}-\(\S\{1\,\}\)-\{1\}\(\S\{1\,\}\)$/\1-\2/pg" ` >+ export KERNELVERSION > MODDEST=`dirname $MANMODULEPATH` sh build.sh -i > ;; > status) >
Укажите пожалуйста пример команд, как вы собираетесь пользоваться вводимой переменной KERNELVERSION и кто её будет определять. Кстати, у нас есть обработка KERNSRC, позволяющая указать путь к исходникам.
В приложенных патчах на build.sh и buildmodule.sh если не установлена $KERNELVERSION то версия определяется вызовом uname - это текущее поведение и оно остается таким по умолчанию. Однако можно переопределть $KERNELVERSION. В примерах патчей на linux-cifs и haspd переопределение выполняется анализом имени файла /boot/vmlinuz-*. Это было написано на скорую руку и не очень правильно и корректно в случае наличия нескольких ядер. Можно доработать build.sh и buildmodule.sh так, чтобы они принимали необязательный аргумент версии ядра и не использовали $KERNELVERSION. Т.е. фактически надо добавить опциональный параметр версии ядра к вызову service [haspd | linux-cifs] build в инит-скриптах. Кто и как будет добавлять этот параметр - вопрос отдельный, у меня например он будет вызываться из kickstart скрипта, который уже знает версию рабочего ядра, устанавливаемую на машину.
Возможно нужно двигаться в сторону использования dkms? У нас есть пакеты для dkms.
В новых версиях KERNELVERSION задействована