Вопрос не праздный... как понять какой версии ядра соответствует какая версия nvidia дров? Пытаюсь откатить дрова к старой версии (что-то глюков тьма стала после последних обновлений), но похоже для этого придётся собирать ядро старой версии (какой именно версии?...). По-другому никак? Вообще я плохо себе представляю как взаимодействуют эти два пакета и что нужно для их совместимости (потонул в зависимостях пакмана).
Допустим я хочу, чтобы у меня крутились дрова версии X, какая версия ядра Y мне нужна, чтобы сборка модуля nvidia прошла успешно (без ругани на headers и зависимости)? Или прогрессивное человечество решает эту проблему без решения уравнений с двумя неизвестными? =)
P.S. И ещё я мечтаю реализовать это на основе какого-нибудь PKGBUILD из aur...
Соответствие пакетов nvidia и linux
вот это покури крепко
а про версии всё просто → ядро в любом раскладе первично, не важно какая версия, в твоём случае(если конечно не собираешся собирать уж самые архаизмы типа 2.6.24) его можно не трогать вовсе, а вот для дров нвидии примерно такой расклад - все последние версии(те что вышли за последние полгода) можно собрать на новых ядрах, с более старыми возможны проблемы, с компилятором и заголовками, т.к. им не известны версии ядер 3.Х.Х поэтому надо смотреть на время выхода, ядро должно быть более старое по времени релиза, чем время релиза дров. Информацию можно найти на соответствующих ресурсах.
То бишь смотреть надо по времени релиза... Благодарю, кое-что проясняется. Ну а +\- во времени видимо зависит чисто от изменений в ядре.
хм.. Покурил =) судя по PKGBUILD, после распаковки дров в папке kernel должен лежать файл nvidia.ko, но его там нет. Смотрел такой же сборочный скриптик из аура, но для той версии ядра, что я ставлю (pkgver=256.53) - там тоже упоминается этот файл, но на практике его после распаковки не оказывается.
package() {
install -D -m644 "${srcdir}/${_pkg}/kernel/nvidia.ko" \
"${pkgdir}/lib/modules/${_extramodules}/nvidia.ko"
install -d -m755 "${pkgdir}/usr/lib/modprobe.d"
echo "blacklist nouveau" >> "${pkgdir}/usr/lib/modprobe.d/nvidia.conf"
sed -i -e "s/EXTRAMODULES='.*'/EXTRAMODULES='${_extramodules}'/" "${startdir}/nvidia.install"
gzip "${pkgdir}/lib/modules/${_extramodules}/nvidia.ko"
}
откуда его брать то?
откуда его брать то?
:) ну так в этом и суть "сборки пакета", nvidia.ko это и есть сторонний модуль ядра от производителя карты, он создаётся во время компиляции NVIDIA-bla-bla-bla.run . Как это происходит ? Для начала скачай с оф. сайта нвидии любой понравившийся NVIDIA-bla-bla-bla.run , рекомендую 290-ю серию, она более-менее не глюкавая. Вот ссылка. Потом дай ему права на исполнение :
# chmod +x NVIDIA-bla-bla-bla.run
и запусти вот так :
# ./NVIDIA-bla-bla-bla.run -A
почитай внимательно опции, там много интересного. Потом тебе нужено его собрать самостоятельно, как читай доки Арча. Вот вариант из вики.
Так этим яурт же должен заниматься (сборкой) или нет? Смысл PKGBUILD разве не в том, чтобы дать инструкции по сборке пакета? Но там происходит только распаковка NVIDIA-bla-bla-bla.run а затем запускается функция package(), в которой уже указан этот модуль как существующий. Больше сборочный скрипт ничего не делает и не планирует делать. функция билд в нём ограничена распаковкой .run.
Так этим яурт же должен заниматься (сборкой) или нет?
этого я тебе не скажу, у меня Слака :) ..
Смысл PKGBUILD разве не в том, чтобы дать инструкции по сборке пакета?
да, смысл именно в этом, суть в том что одной из этих инструкций должна быть приметно такой :
SRCNAM=NVIDIA-Linux-$TARGET-${VERSION}
CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=${PKG:-$TMP/package-$PRGNAM}
OUTPUT=${OUTPUT:-/tmp}
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP || exit 1
rm -rf $SRCNAM
sh $CWD/$SRCNAM.run --extract-only || exit 1
cd $SRCNAM || exit 1
chown -R root:root .
chmod -R u+w,go+r-w,a-s .
cd kernel || exit 1
make SYSSRC=$KERNELPATH module || exit 1
mkdir -p $PKG/lib/modules/$KERNEL/kernel/drivers/video
install -m 0664 nvidia.ko $PKG/lib/modules/$KERNEL/kernel/drivers/video/
# Make sure the X is specified to automagically load the
# correct driver, since I always forget.
это из Слаки, но суть одна в любом дистрибутиве, хоть в Федоре, хоть в Бубунте, хоть в Генту
Кажется я понял где был глюк, но наткнулся на новый.
Функция
build() {
_kernver="$(cat /lib/modules/${_extramodules}/version)"
cd "${srcdir}"
#sh "${_pkg}.run" --extract-only
cd "${_pkg}/kernel"
#_kernver=3.3.3-1-ARCH
make SYSSRC=/lib/modules/3.3.3-1-ARCH/build module
}
даёт результат:
*** Unable to determine the target kernel version. ***
make: *** [select_makefile] Ошибка 1
Он не видит ядра и предлагает указать путь к нему переменной SYSSRC, но она уже указывает на установленное ядро: make SYSSRC=/lib/modules/3.3.3-1-ARCH/build module
но наткнулся на новый.
покажи весь билд, так не понятно что-где назначено.(под спойлер или на пастербин)
Показать
# Maintainer : Thomas Baechler <thomas@archlinux.org>
pkgname=nvidia
pkgver=256.53
_extramodules=extramodules-3.3-ARCH
pkgrel=3
pkgdesc="NVIDIA drivers for linux."
arch=('i686' 'x86_64')
url="http://www.nvidia.com/"
depends=('linux>=3.3' 'linux<3.4')
makedepends=('linux-headers>=3.3' 'linux-headers<3.4')
conflicts=('nvidia-96xx' 'nvidia-173xx')
license=('custom')
install=nvidia.install
options=(!strip)
if [ "$CARCH" = "i686" ]; then
_arch='x86'
_pkg="NVIDIA-Linux-${_arch}-${pkgver}"
#source=("ftp://download.nvidia.com/XFree86/Linux-${_arch}/${pkgver}/${_pkg}.run")
#md5sums=('0bc1561b405443c6d1331934093137fd')
elif [ "$CARCH" = "x86_64" ]; then
_arch='x86_64'
_pkg="NVIDIA-Linux-${_arch}-${pkgver}-no-compat32"
# source=("ftp://download.nvidia.com/XFree86/Linux-${_arch}/${pkgver}/${_pkg}.run")
#md5sums=('dde8347cde142c329b6bb923747672a3')
fi
echo ${pkgdir}
build() {
_kernver="$(cat /lib/modules/${_extramodules}/version)"
cd "${srcdir}"
#sh "${_pkg}.run" --extract-only
cd "${_pkg}/kernel"
#_kernver=3.3.3-1-ARCH
make SYSSRC=/lib/modules/3.3.3-1-ARCH/build module
}
package() {
install -D -m644 "${srcdir}/${_pkg}/kernel/nvidia.ko" \
"${pkgdir}/lib/modules/${_extramodules}/nvidia.ko"
install -d -m755 "${pkgdir}/usr/lib/modprobe.d"
echo "blacklist nouveau" >> "${pkgdir}/usr/lib/modprobe.d/nvidia.conf"
sed -i -e "s/EXTRAMODULES='.*'/EXTRAMODULES='${_extramodules}'/" "${startdir}/nvidia.install"
gzip "${pkgdir}/lib/modules/${_extramodules}/nvidia.ko"
}
P.S. дрова были распакованы вручную, потому закомментил кое-что, ну и кое-что ещё пришлось закомментить, чтобы он не качал их каждый раз заново с фтп.
_kernver="$(cat /lib/modules/${_extramodules}/version)"
cd "${srcdir}"
#sh "${_pkg}.run" --extract-only
cd "${_pkg}/kernel"
#_kernver=3.3.3-1-ARCH
make SYSSRC=/lib/modules/3.3.3-1-ARCH/build module
вот и глюк.
С одной стороны
_kernver="$(cat /lib/modules/${_extramodules}/version)"
но тут же
#_kernver=3.3.3-1-ARCH
make SYSSRC=/lib/modules/3.3.3-1-ARCH/build module
а в следующей функции опять
"${pkgdir}/lib/modules/${_extramodules}/nvidia.ko"
т.е. переменную ты пытаешься определить автоматически, а в сборке явно указываешь её.
там в make SYSSRC=/lib/modules/3.3.3-1-ARCH/build module должна стоять переменная _kernver=3.3.3-1-ARCH, так что всё вроде так...
uname -r
3.3.3-1-ARCH
а какой драйвер ?
pkgver=256.53
ну так я же предупреждал что древние драйвера не знают о существовании ядер с номерами 3.Х.Х и поэтому не соберутся никогда .
NVIDIA Corporation
Last Updated: Fri Aug 27 21:34:08 PDT 2010
Most Recent Driver Version: 256.53
в то время вышло ядро 2.6.34 вот на нем и собирай, в принципе на любом вплоть до 2.6.39 (на счет 39 не уверен)
хм... 290 тогда мучать придёться...
Эффект тот же - модуль не видит ядро.
дрова были распакованы вручную, потому закомментил кое-что, ну и кое-что ещё пришлось закомментить, чтобы он не качал их каждый раз заново с фтп.
Проблема решилась откатом на старые ядро и дрова через кэш пакмана. Но это как-то не так, как я хотел =) Может быть следующий релиз дров nvidia исправить баги с компизом и powermizer - тогда можно будет вернуться на дефолтные пакеты.