
Как использовать последнюю бета-версию 302-й версии драйвера NVIDIA (которая наконец-то поддерживает расширение RandR!) с ядром реального времени в Precise?
Этот вопроссодержит информацию о включении текущей версии 295 для ядра 3.4 с патчем RT. Но я ищу ответ, который устанавливает драйвер nvidia с помощью менеджера пакетов, а не установщика nvidia (установки которого время от времени прерываются из-за перезаписи файлов системой управления пакетами).
решение1
Предупреждение
Патч вэтот вопроспредназначен для ядра 3.4, как и приведенный ниже; требуется ядро 3.4 с исправлениями в реальном времени.
Новый драйвер nvidia 302 требует видео ABI, который предоставляет xorg-server 1.12, и, к сожалению, Precise поставляется с xorg-server 1.11. Следующие инструкции включают добавлениеxorg-edgers PPAкак источник программного обеспечения для предоставления xorg-server 1.12, и это создает определенный риск поломки. Инструкции по удалению находятся внизу, но прочитайте их, чтобы не пропустить возможные сбои.
инструкции
Изменение упакованного драйвера nvidia
Создайте временный каталог и перейдите в него с помощью:
mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
Загрузите nvidia-current_302*.deb из PPA xorg-edgers, просмотрев пакеты для Precise в nvidia-graphics-driver_302*здесьНа момент написания этой статьи прямую загрузку можно выполнить с помощью:
wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_amd64.deb
Извлеките .deb с помощью:
dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
Добавьте патч в
deb_contents/usr/src/nvidia-current*/patches
каталог, вставив в терминал следующее:d=$(echo deb_contents/usr/src/nvidia-current*/patches) ; cat > $d/buildfix_kernel_rt_3.4.patch <<'EOF' diff -u a/conftest.sh b/conftest.sh --- a/conftest.sh 2012-05-03 09:49:19.582854050 +0100 +++ b/conftest.sh 2012-05-03 09:52:58.524101586 +0100 @@ -95,7 +95,7 @@ fi fi - CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS" + CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS" test_xen @@ -965,11 +965,12 @@ # echo "$CONFTEST_PREAMBLE #include <linux/acpi.h> + #include <acpi/acpixf.h> void conftest_acpi_walk_namespace(void) { acpi_walk_namespace(); }" > conftest$$.c - $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 + #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1 rm -f conftest$$.c if [ -f conftest$$.o ]; then @@ -980,6 +981,7 @@ echo "$CONFTEST_PREAMBLE #include <linux/acpi.h> + #include <acpi/acpixf.h> void conftest_acpi_walk_namespace(void) { acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL); }" > conftest$$.c @@ -1604,6 +1606,9 @@ fi fi + RET=0 + SELECTED_MAKEFILE=Makefile.kbuild + if [ "$RET" = "0" ]; then ln -s $SELECTED_MAKEFILE Makefile exit 0 diff -u a/nv-linux.h b/nv-linux.h --- a/nv-linux.h 2012-05-03 09:49:19.622853547 +0100 +++ b/nv-linux.h 2012-05-03 09:56:12.045668690 +0100 @@ -291,7 +291,18 @@ #endif #endif -#if defined(CONFIG_PREEMPT_RT) +#if defined(CONFIG_PREEMPT_RT_FULL) +typedef raw_spinlock_t nv_spinlock_t; +#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock) +#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock) +#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock) +#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags) +#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \ + raw_spin_unlock_irqrestore(lock,flags) +#define NV_SPIN_LOCK(lock) raw_spin_lock(lock) +#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock) +#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock) +#elif defined(CONFIG_PREEMPT_RT) typedef atomic_spinlock_t nv_spinlock_t; #define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock) #define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock) @@ -954,7 +965,9 @@ return ret; } -#if defined(CONFIG_PREEMPT_RT) +#if defined(CONFIG_PREEMPT_RT_FULL) +#define NV_INIT_MUTEX(mutex) sema_init(mutex,1) +#elif defined(CONFIG_PREEMPT_RT) #define NV_INIT_MUTEX(mutex) semaphore_init(mutex) #else #if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER) EOF
Добавьте патч в dkms.conf, вставив в терминал следующее:
d=$(echo deb_contents/usr/src/nvidia-current*) ; cat >> $d/dkms.conf <<'EOF' PATCH_MATCH[1]="^3\.4.*(rt|realtime)" PATCH[1]="buildfix_kernel_rt_3.4.patch" EOF
Измените номер версии в deb_contents/DEBIAN/control, выполнив:
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
Перепакуйте драйвер с помощью:
dpkg -b deb_contents nvidia-current_$(sed -n 's/^\(Version: *\)//p' deb_contents/DEBIAN/control)_amd64.deb
Установка PPA и модифицированного драйвера
Добавьте PPA-репозиторий xorg-edgers:
sudo add-apt-repository ppa:xorg-edgers/ppa && sudo apt-get update && sudo apt-get dist-upgrade
Установите локально измененный .deb с помощью:
sudo dpkg -i nvidia-current_*+rtfix_*.deb
Быть в курсе событий
Xorg-edgers PPA будет обновляться новыми версиями драйвера nvidia по мере их выхода; вам придется повторять приведенные выше инструкции по переупаковке с каждым новым выпуском.
Удаление
Тыдолжениметь возможность вернуться к nouveau
драйверу с помощью следующего:
sudo apt-get remove nvidia-current
sudo apt-get install ppa-purge
sudo ppa-purge ppa:xorg-edgers/ppa
В моем случае этот процесс включал удаление wine
вместе с некоторыми пакетами i386 (которые должны были быть понижены вместо этого). Будьте осторожны, ppa-purge
если вы используете amd64, так как онне очень хорошо уживается с мультиархитектурой(как указано в предупреждениях PPA); в моем случае результат оказался не таким уж и плохим (я просто переустановил wine
), но у других людей зависимости могут оказаться серьезно поврежденными в зависимости от того, что они установили.