#! /bin/bash # # install-nvidia-debian # The use of this script is described on # http://www.xs4all.nl/~carlo17/howto/nvidia.html version="20080206.0" # # Copyright (C) 2006 - 2008 Carlo Wood # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. progname=$0 gvers= kvers= print_usage= option=$1 while test -n "$option"; do case $option in --version=*) gvers=`echo $option | sed -re 's/--version=//' -e 's/-([0-9]+)$/.\1/'` ;; --version) shift gvers=$(echo "$1" | sed -re 's/-([0-9]+)$/.\1/') ;; --kernel=*) kvers=`echo $option | sed -e 's/--kernel=//'` ;; --kernel) shift kvers=$1 ;; *) print_usage=1 ;; esac shift option=$1 done test -n "$gvers" || print_usage=1 test -n "$kvers" || kvers=$(uname -r) ARCH=`uname -m` case $ARCH in i*86) ARCH=`echo $ARCH | sed -e 's/i//'`; rfarch="x86"; ngmarch="i386"; ;; x86_64) ARCH="amd64"; rfarch="x86_64"; ngmarch="amd64" ;; *) echo "Sorry, $ARCH is not supported."; exit 1 ;; esac if test -n "$print_usage"; then echo "* install-nvidia-debian version $version -- Copyright (C) 2006 - 2008, Carlo Wood *" echo "Usage: $progname --version= [--kernel=]" echo "For example: $progname --version=100.14.06 --kernel=$(uname -r)" exit 1 fi if test ! -d "$kvers"; then echo "$kvers: No such directory." if test -d "/lib/modules/$kvers"; then echo "First run ./build-nvidia-kernel --kernel=$kvers" fi exit 1 fi echo "kvers = \"$kvers\"" echo "gvers = \"$gvers\"" INSTALLED=$(apt-cache policy nvidia-kernel-$kvers | grep '^ *Installed: ' | sed -e 's/ *Installed: *//') echo "INSTALLED = \"$INSTALLED\"" # Check if we have a non-beta version. beta= fgvers=$(/bin/ls $kvers/nvidia-kernel-$kvers""_$gvers+*_$ngmarch.deb | \ grep -v beta | sed -e "s/$kvers\/nvidia-kernel-$kvers""_\($gvers\+.*\)_$ngmarch\.deb/\1/") if test -z "$fgvers"; then beta=1 fgvers=$(/bin/ls $kvers/nvidia-kernel-$kvers""_$gvers+*_$ngmarch.deb | \ sed -e "s/$kvers\/nvidia-kernel-$kvers""_\($gvers\+.*\)_$ngmarch\.deb/\1/") if test -z "$fgvers"; then echo "Version $gvers not found in ./$kvers" echo -n "Use 'build-nvidia-kernel --kernel=$kvers" if test -n "$beta"; then echo -n " --beta=$gvers" fi echo "' to create nvidia debian packages." exit 1 fi fi echo "fgvers = \"$fgvers\"" # Test if we have all files. missing= nvidia_kernel_deb="$kvers/nvidia-kernel-$kvers""_$fgvers""_$ngmarch.deb" if test ! -e "$nvidia_kernel_deb"; then echo "$nvidia_kernel_deb: No such file." missing=1 fi nvidia_kernel_all_deb="$kvers/nvidia-kernel-2.6-$ARCH""_$fgvers""_all.deb" if test ! -e "$nvidia_kernel_all_deb"; then echo "$nvidia_kernel_all_deb: No such file." missing=1 fi if test -n "$beta"; then nvidia_glx_deb="$kvers/nvidia-glx_$gvers-0_$ngmarch.deb" if test ! -e "$nvidia_glx_deb"; then echo "$nvidia_glx_deb: No such file." missing=1 fi if test "$ngmarch" = "amd64"; then nvidia_glx_ia32_deb="$kvers/nvidia-glx-ia32_$gvers-0_$ngmarch.deb" if test ! -e "$nvidia_glx_ia32_deb"; then echo "$nvidia_glx_ia32_deb: No such file." missing=1 fi fi nvidia_glx_dev_deb="$kvers/nvidia-glx-dev_$gvers-0_$ngmarch.deb" if test ! -e "$nvidia_glx_dev_deb"; then echo "$nvidia_glx_dev_deb: No such file." missing=1 fi nvidia_kernel_source_deb="$kvers/nvidia-kernel-source_$gvers-0_$ngmarch.deb" if test ! -e "$nvidia_kernel_source_deb"; then echo "$nvidia_kernel_source_deb: No such file." missing=1 fi fi if test -n "$missing"; then echo -n "Run 'build-nvidia-kernel --kernel=$kvers" if test -n "$beta"; then echo -n " --beta=$gvers" fi echo "' to create these files." exit 1 fi upgrade= downgrade= if test -n "$INSTALLED"; then dpkg --compare-versions "$fgvers" le "$INSTALLED" || upgrade=1 dpkg --compare-versions "$fgvers" ge "$INSTALLED" || downgrade=1 fi # Whether or not we should handle nvidia-glx-ia32. want_glx_ia32="no" # Detect a local repository. foundrepo="no" if [ -e /etc/apt/sources.list ]; then # See http://www.xs4all.nl/~carlo17/howto/debian.html#repository for d in `grep '^deb file:.* \./$' /etc/apt/sources.list | \ sed -e 's/deb file://' -e 's/ .*//' -e 's%^//*%/%g'`; do if [ -f $d/overridefile ]; then if egrep "^nvidia-kernel-2\.[0-9]+\.[0-9]+-[^ ]*" $d/overridefile >/dev/null; then if ! test -w $d; then echo "Found repository in $d, but have no write access." exit 1 fi if ! test -w $d/overridefile; then echo "Found repository in $d, but have no write access to overridefile." exit 1 fi if ! test -w $d/Release; then echo "Found repository in $d, but have no write access to Release file." exit 1 fi foundrepo="$d" if grep 'nvidia-glx-ia32' $d/overridefile >/dev/null; then want_glx_ia32="yes" fi break; fi fi done fi if test "$foundrepo" = "no"; then # If we don't have a repository, let whether or not we want # nvidia-glx-ia32 depend on whether or not it is installed already. if dpkg -l nvidia-glx-ia32 | grep '^i. ' >/dev/null; then want_glx_ia32="yes" fi else echo "Updating repository in $foundrepo" OLDLINKS=`find $foundrepo -type l -name 'nvidia-*'` test -z "$OLDLINKS" || rm $OLDLINKS CURRDIR="`pwd`" (cd $d; \ ln -s "$CURRDIR/$nvidia_kernel_deb"; \ ln -s "$CURRDIR/$nvidia_kernel_all_deb"; \ ln -s "$CURRDIR/$nvidia_kernel_source_deb"; \ ln -s "$CURRDIR/$nvidia_glx_deb"; \ if test "$want_glx_ia32" = "yes"; then \ ln -s "$CURRDIR/$nvidia_glx_ia32_deb"; \ fi; \ ln -s "$CURRDIR/$nvidia_glx_dev_deb"; \ sed -i -re "s/nvidia-kernel-2\.[0-9]+\.[0-9]+-[^ ]*/nvidia-kernel-$kvers/" overridefile dpkg-scanpackages . overridefile | gzip > Packages.gz SIZE=$(stat -c%s Packages.gz) MD5SUM=$(md5sum ./Packages.gz | sed -re "s/ +/ $SIZE /") sed -i -re "s%[^[:space:]]+[[:space:]]+[[:digit:]]+[[:space:]]+[./]*Packages\.gz%$MD5SUM%" Release ) fi if test -z "$downgrade"; then test -z "$upgrade" || echo "This is an upgrade." if test "$foundrepo" != "no"; then echo "Execute the following commands: " echo "sudo apt-get update" echo -n "sudo apt-get install nvidia-glx" if test "$want_glx_ia32" = "yes"; then echo -n " nvidia-glx-ia32" fi echo " (or apt-get upgrade)" else # No repository. Figure out which manual commands to run. if test -n "$beta"; then echo "Execute the following commands: " echo "sudo dpkg -i $nvidia_kernel_deb $nvidia_kernel_all_deb $nvidia_kernel_source_deb" echo "sudo dpkg --unpack $nvidia_glx_dev_deb" echo -n "sudo dpkg -i $nvidia_glx_deb" if test "$want_glx_ia32" = "yes"; then echo -n " $nvidia_glx_ia32_deb" fi echo " $nvidia_glx_dev_deb" else echo "Execute the following commands: " echo "sudo dpkg -i $nvidia_kernel_deb $nvidia_kernel_all_deb" echo -n "sudo apt-get install nvidia-glx-dev nvidia-glx" if test "$want_glx_ia32" = "yes"; then echo -n " nvidia-glx-ia32" fi echo " nvidia-kernel-source" fi fi else echo "This is a downgrade." echo "Execute the following commands: " echo -n "sudo dpkg -i $nvidia_kernel_deb $nvidia_kernel_all_deb" if test -n "$beta"; then if test "$want_glx_ia32" = "yes"; then echo " $nvidia_glx_deb $nvidia_glx_ia32_deb" else echo " $nvidia_glx_deb" fi echo "sudo dpkg -i $nvidia_glx_dev_deb $nvidia_kernel_source_deb" else echo fglxvers=$(apt-cache policy nvidia-glx | grep "$gvers" | head -n 1 | sed -re "s/.*($gvers-[^ ]*).*/\1/") echo -n "sudo apt-get --force-yes -y install nvidia-glx=$fglxvers" if test "$want_glx_ia32" = "yes"; then echo -n " nvidia-glx-ia32=$fglxvers" fi echo " nvidia-glx-dev=$fglxvers nvidia-kernel-source=$fglxvers" fi if test "$foundrepo" != "no"; then echo "sudo apt-get update" fi fi echo "sudo rmmod nvidia" echo "sudo modprobe nvidia"