• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Kernelinstallationsskript

catweasel

Hacker
Was sagt ihr zu meinem Skript?

ediert am 25.07.2007

Code:
#! /bin/sh
#
# Skriptname: xc
# Autor: catweasel
# Version: 0.8.2
# für SUSE 10.2 mit original menu.lst   Kernel 2.6.*
# Kernelinstallationsskript: entpacken von Kernelquellarchiven, patchen von Kernelquellen, Konfigurieren, Kompilieren und Installieren.

# Kopieren Sie die Kernelarchive bzw. Kernelpatches ins eigene home-Verzeichnis.

# backup's der menu.lst befinden sich in ~/kernel/backup-menu.lst.

# kav=Verzeichnis, in dem nach Kernelquellarchiven bzw. Kernelquellen.rpm's gesucht wird.
kav=~

# aa=Verzeichnis, in das die Kernelquellen entpackt, bzw. in dem die entpackten Kernelquellen gesucht werden (/usr/src).

# Wenn Sie die zu patchenden Kernelquellen überschreiben wollen, ändern Sie overw so: overw=1.
# overw=1 nur verwenden, wenn Sie die zu patchenden Kernelquellen wiederherstellen können z.B. mit den entsprechenden tar-Archiven. overw=1 ist schneller und verbraucht weniger Plattenplatz.
overw=0

# silent=ja ist silent-modus an - silent=nein ist silent-modus aus
silent=ja

################################################################################################

set -x


if [ "$silent" = nein ]; then
	s=
	v=v
	vh=vh
else
	s=-s
	v=
	vh=
fi
aa=/usr/src
temp=~/t9m3p4f8
rpm -q gcc > /dev/null
if [ $? -ne 0 ]; then
	echo "das rpm-Paket gcc ist nicht installiet"
	echo "gcc wird zum kompilieren des Kernels benötigt"
	select nummer in "gcc ist bereits installiert" "abbrechen um gcc zu installieren"; do
		case "$nummer" in
			gcc*)	break;;
			abb*)	exit;;
			   *)	echo "ungültige Auswahl";;
		esac
	done
	echo
fi
PS3="
Nummer: "
rm $temp.* 2> /dev/null
sudo rm -r "$aa"/err9or-linux-2.6* 2> /dev/null
who="$(whoami)"
arc="$(uname -m)"
ver="$(head -1 /etc/SuSE-release)"
ver=${ver#openSUSE\ }
ver=${ver%%\ (*}
if [[ "$arc" == i[3-6]86 ]]; then
	arc=i[3-6]86
else 
	arc=x86_64
fi
while [ ! -d "$kav" ]; do
	echo -n "das Verzeichnis \"$kav\", in dem nach Kernelarchiven gesucht werden soll, existiert nicht. Neue Eingabe: "
	read kav
done
while [ ! -d "$aa" ]; do
	echo -n "das Verzeichnis \"$aa\", in das die Kernelarchive entpackt bzw. in dem nach Kernelquellen gesucht werden soll, existiert nicht. Neue Eingabe: "
	read aa
done
te=${aa##*/}
if [ -z "$te" ]; then
	aa=${aa%/}
fi
tar=0
rpm=0
ptch=0
ent=0
Vanill=0
Pat=0
echo
echo
select num in "Kernelquellen patchen" "Download" "direkt zur Kernelkonfiguration"; do
	case "$num" in
		Ker*)	echo
			ptch=1
			break;;
		Dow*)	echo
			echo herunterladen
			select nummer in "Patches von kernel.org" "Vanilla-Kernelquellen von kernel.org"; do
				case "$nummer" in
					Pat*)	echo
						Pat=1
						ptch=1
						break;;
					Van*)	echo
						Vanill=1
						break;;
					*)	echo
						echo "ungültige Auswahl";;
				esac
			done
			break;;
		dir*)	echo
			break;;
		*)	echo
			echo "ungültige Auswahl";;
	esac
done
ko=~/kernel
if [ ! -d "$ko" ]; then
	mkdir "$ko"
fi
cd "$ko"

version()
	{
	i=${1##*patch-}
	i=${i##*linux-}
	i=${i%.bz2}
	i=${i%.gz}
	i=${i%.tar}
	}

sublev()
	{
	Iext= ; sublI= ; xIext= ; rcIext= ; spezIext= ;
	Iext=${1#2.6.[0-9][0-9]}
	if [ "$Iext" = "$1" ]; then
		Iext=${1#2.6.[0-9]}
	fi
	sublI=${1%"$Iext"}
	sublI=${sublI#2.6.}
	spezIext=${Iext#-rc[0-9][0-9]}
	if [ "$spezIext" = "$Iext" ]; then
		spezIext=${Iext#-rc[0-9]}
		if [ "$spezIext" = "$Iext" ]; then
			xIext=${Iext%%-*}
			spezIext=${Iext#"$xIext"}
		else
			rcIext=${Iext%"$spezIext"}
		fi
	else
		rcIext=${Iext%"$spezIext"}
	fi
	}

download()
	{
	ptchvers="$1"
	rcext="$2"
	spezext="$3"
	if [[ "$spezext" = -mm* ]]; then
		wget ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/"${ptchvers%%-mm*}"/"$ptchvers"/"$ptchvers".bz2
		if [ $? -ne 0 ]; then
			echo "der Patch patch-$ptchvers konnte nicht heruntergeladen werden."
			echo
			exit
		else
			mv "$ptchvers".bz2 patch-"$ptchvers".bz2
		fi
	elif [[ "$spezext" = -git* ]]; then
		wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-"$ptchvers".bz2
		if [ $? -ne 0 ]; then
			echo "der Patch patch-$ptchvers konnte nicht heruntergeladen werden."
			echo
			exit
		fi
		
	elif [ "$rcext" ]; then
		wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing/patch-"$ptchvers".bz2
		if [ $? -ne 0 ]; then
			echo "der Patch patch-$ptchvers konnte nicht heruntergeladen werden."
			echo
			exit
		fi
	else
		wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/patch-"$ptchvers".bz2
		if [ $? -ne 0 ]; then
			echo "der Patch patch-$ptchvers konnte nicht heruntergeladen werden."
			echo
			exit
		fi
	fi
	}


#########################################       Patch-download      #############################

if [ "$Pat" -eq 1 ]; then
	wget http://www.kernel.org/kdist/finger_banner
	if [ $? -ne 0 ]; then
		echo "es konnte keine Verbindung zu www.kernel.org hergestellt werden"
		rm finger_bannner*
		echo
		exit
	fi
	sed -n "/2.6.[0-9]*/p" < finger_banner > $temp.200
	rm finger_bannner*
	dwldpatch="$(cat $temp.200)"
	BACKIFS="$IFS"
	IFS='
'
	select nummer in $dwldpatch "ältere Patch-Version"; do
		if [ "$nummer" = "ältere Patch-Version" ]; then
			while [ "$best" != j -a "$best" != J -a "$best" != ja -a "$best" != Ja ]; do
				echo -n "vervollständigen Sie zur gewünschte Version: patch-2.6."
				read ptchvers
				ptchvers=2.6."$ptchvers"
				echo -n "Bestätigen Sie die Auswahl mit  j  ; für eine erneute Eingabe drücken Sie Enter : "
				read best
			done
			break
		elif [ "$nummer" ]; then
			ptchvers="$(echo "$nummer" | awk '{print $NF}')"
			break
		else
			echo "ungültige Eingabe"
			# exit
		fi
	done
	IFS="$BACKIFS"
	sublev "$ptchvers"
	download "$ptchvers" "$rcIext" "$spezIext"
fi


#########################################	Vanilla-Kernel-download    ##############################

if [ "$Vanill" -eq 1 ]; then
	select nummer in "aktuellen Kernel herunterladen" "Kernelversion selbst eingeben"; do
		case "$nummer" in
			akt*)	echo
				wget http://www.kernel.org/kdist/finger_banner
				if [ $? -ne 0 ]; then
					echo "es konnte keine Verbindung zu www.kernel.org hergestellt werden"
					rm finger_bannner*
					echo
					exit
				fi
				vers=$(head -n 1 finger_banner | awk '{print $NF}')
				rm finger_banner*
				break;;
			Ker*)	echo
				while [ "$best" != j -a "$best" != J -a "$best" != ja -a "$best" != Ja ]; do
					echo -n "vervollständigen Sie zur gewünschte Version: linux-2.6."
					read vers
					vers=2.6."$vers"
					echo
					echo "linux-$vers"
					echo
					echo -n "Bestätigen Sie die Auswahl mit  j  ; für eine erneute Eingabe drücken Sie Enter : "
					read best
				done
				break;;
			*)	echo
				echo "ungültige Auswahl";;
		esac
	done
	if [[ "$vers" == *-rc[0-9] || "$vers" == *-rc[1-9][0-9] ]]; then
		wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing/linux-"$vers".tar.bz2
		if [ $? -ne 0 ]; then
			echo "der Kernel linux-$vers konnte nicht heruntergeladen werden."
			echo
			exit
		fi
	else
		wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-"$vers".tar.bz2
		if [ $? -ne 0 ]; then
			echo "der Kernel linux-$vers konnte nicht heruntergeladen werden."
			echo
			exit
		fi
	fi
fi	


##########################################################################################################

Kernelquellensuche()
	{
	kname=2.6.[0-9]*
	find "$aa" -maxdepth 1 -name "linux-$kname" -type d > $temp.ptch.01
	if [ -s $temp.ptch.01 ]; then
		gf="$(cat $temp.ptch.01)"
		for i in $gf; do
			if [ -e "$i/Makefile" ]; then
				echo "$i" >> $temp.ptch.02
			fi 
		done
		if [ -s $temp.ptch.02 ]; then
			usr="$(cat $temp.ptch.02)"
			for i in $usr; do
				i=${i#*linux-}
				echo "$i" >> $temp.ptch.03
			done
		fi
	fi
	find "$kav" \( -name "linux-$kname.tar.bz2" -o -name "linux-$kname.tar.gz" \) > $temp.ptch.04
	if [ -s $temp.ptch.04 ]; then
		tar="$(cat $temp.ptch.04)"
		for i in $tar; do
			version "$i"
			echo "$i" >> $temp.ptch.05
		done 
	fi
	find "$kav" -name "kernel-source-$kname.$arc.rpm" > $temp.ptch.06
	if [ -s $temp.ptch.06 ]; then
		rpm="$(cat $temp.ptch.06)"
		for i in $rpm; do
			i=${i%.rpm}
			i=${i%.i[3-6]86}
			i=${i#*kernel-source-}
			echo "$i" >> $temp.ptch.07
		done
	fi
	if [ -s $temp.ptch.03 ]; then
		cat < $temp.ptch.03 > $temp.ptch.08
	fi
	if [ -s $temp.ptch.05 ]; then
		cat < $temp.ptch.05 >> $temp.ptch.08
	fi
	if [ -s $temp.ptch.07 ]; then
		cat < $temp.ptch.07 >> $temp.ptch.08
	fi
	cat $temp.ptch.08 | sort | uniq > $temp.ptch.09
	kat="$(cat $temp.ptch.09)"
	echo "$1"
	echo
	if [[ -n "$kat" ]]; then
		select nummer in $kat "abbrechen"; do
			echo
			if [ "$nummer" ]; then
				if [ "$nummer" = abbrechen ]; then
					rm $temp.*
					exit
				else
					e="$nummer"
					break
				fi
			else
				echo "ungültige Auswahl"
			fi
		done
	else
		echo "keine Kernelquellen gefunden"
		exit 
	fi
	}

find_Kziel()
	{
	gef=0
	kname="$4"
	grep -q $kname$ $1
	if [ $? -eq 0 ]; then
		gef=1
	fi
	if [ "$gef" -eq 0 ]; then
		grep -q "$kname.tar.bz2" $2
		if [ $? -eq 0 ]; then
			entp="$(grep "$kname.tar.bz2" $2 | head -1)"
			cd "$aa"
			#echo
			#echo "bitte etwas Geduld"
			#echo
			sudo tar -xj"$v"f "$entp"
			cd -
			gef=1
		else
			grep -q "$kname.tar.gz" $2
			if [ $? -eq 0 ]; then
				entp="$(grep "$kname.tar.gz" $2 | head -1)"
				cd "$aa"
				#echo
				#echo "bitte etwas Geduld"
				#echo
				sudo tar -xz"$v"f "$entp"
				cd -
				gef=1
			fi
		fi	
	fi
	if [ "$gef" -eq 0 ]; then
		grep -q "$kname.$arc.rpm" "$3"
		if [ $? -eq 0 ]; then
			ex=i[3-9]86.rpm
			gef=1
		fi
		if [ "$gef" -eq 1 ]; then
			entp="$(grep "$kname.$ex" "$3" | head -1)"
			cd "$aa"
			sudo rpm -"$vh"i "$entp"
			cd -
		fi
	fi
	}


##########################################    Kernel patchen     #########################################

findpatch()
	{
	find "$kav" \( -name "patch-$kname.gz" -o -name "patch-$kname.bz2" \)
	}

extention()
	{
	ext=${1##*.}
	case $ext in
		gz)	uncomp="gunzip -c" 
			ext=.gz;;
		bz2)	uncomp="bunzip2 -c"
			ext=.bz2;;
	esac
	}

patchziel_umbenennen()
	{
	if [ "$overw" -eq 1 ]; then
		sudo mv "$aa/linux-$1" "$aa/err9or-linux-$2"
	else
		#echo
		#echo "bitte etwas Geduld"
		#echo
		sudo cp -r "$aa/linux-$1" "$aa/err9or-linux-$2"
	fi
	}

repatchen()
	{
	ziel="$aa/err9or-linux-$e"
	entp="$(grep "$1" "$2" | head -1)"
	extention $entp
	sudo $uncomp "$entp" | sudo patch -p1 "$s" -R -N -E -d "$ziel"
	}


repatch()
	{
	if [ "$rczielext" -a "$spezzielext" ]; then
		kname=2.6.$[ $sublziel + 1 ]"$rczielext$spezzielext"
		pa="$kname"
		findpatch > $temp.ptch.150
		if [ ! -s $temp.ptch.150 ]; then
			pak="$kname"
		fi
		kname=2.6.$[ $sublziel + 1 ]"$rczielext"
		pb="$kname"
		findpatch > $temp.ptch.160
		if [ ! -s $temp.ptch.160 ]; then
			pbk="$kname"
		fi
		if [ -z "$pak" ] && [ -z "$pbk" ]; then
			patchziel_umbenennen "$pa" "$e"
			repatchen "$pa" $temp.ptch.150
			if [ $? -eq 0 ]; then
				repatchen "$pb" $temp.ptch.160
				if [ $? -eq 0 ]; then
					sudo mv "$aa/err9or-linux-$e" "$aa/linux-$e"
					weiter=0
				else
					sudo rm -r "$aa/err9or-linux-$e"
					if [ $weiter -eq 1 ]; then
						echo "Fehler beim Repatchen des Kernels $o auf $e gefunden"
						echo "der Kernel $o kann nicht gepatcht werden. Sie benötigen den Kernel $e"
						exit
					else
						weiter=1
					fi
				fi
			else
				sudo rm -r "$aa/err9or-linux-$e"
				if [ $weiter -eq 1 ]; then
					echo "Fehler beim Repatchen des Kernels $o auf $e gefunden"
					echo "der Kernel $o kann nicht gepatcht werden. Sie benötigen den Kernel $e"
					exit
				else
					weiter=1
				fi
			fi
		else
			weiter=1
		fi
	else
		kname="$o"
		findpatch > $temp.ptch.10
		if [ -s $temp.ptch.10 ]; then
			find_Kziel $temp.ptch.02 $temp.ptch.04 $temp.ptch.06 "$o"
			patchziel_umbenennen "$o" "$e"
			repatchen "$o" $temp.ptch.10
			if [ $? -eq 0 ]; then
				sudo mv "$aa/err9or-linux-$e" "$aa/linux-$e"
				weiter=0
			else
				sudo rm -r "$aa/err9or-linux-$e"
				if [ $weiter -eq 1 ]; then
					echo "Fehler beim Repatchen des Kernels $o auf $e gefunden"
					echo "der Kernel $o kann nicht gepatcht werden. Sie benötigen den Kernel $e"
					exit
				else
					weiter=1
				fi
			fi
 else
  weiter=1
		fi
	fi
	if [ "$weiter" -eq 1 ]; then
		kname="$e[-.]*"
		findpatch > $temp.ptch.11
		if [ -s $temp.ptch.11 ]; then
		pat=$(cat $temp.ptch.11)
			for i in $pat; do
				version "$i"
				grep -q "$i" $temp.ptch.09
				if [ $? -eq 0 ]; then
					find_Kziel $temp.ptch.02 $temp.ptch.04 $temp.ptch.06 "$i"
					if [ "$gef" -eq 1 ]; then
						version "$i"
						patchziel_umbenennen "$i" "$e"
						repatchen "$i" $temp.ptch.11
						if [ $? -eq 0 ]; then
							sudo mv "$aa/err9or-linux-$e" "$aa/linux-$e"
							weiter=0
							break
						else
							weiter=1
							sudo rm -r "$aa/err9or-linux-$e"
						fi
					else
						weiter=1
					fi
				else
					weiter=1
				fi
			done
		else
			weiter=1
		fi
	fi
	if [ "$weiter" -eq 1 ]; then
		cd "$ko"
		if [ "$pak" ] || [ "$pbk" ]; then
			if [ "$pak" ]; then
				download "$pak" "$rczielext" "$spezzielext"
				if [ $? -eq 0 ]; then
					pak=
				fi
			fi
			if [ "$pbk" ]; then
				download "$pbk" ziel
				if [ $? -eq 0 ]; then
					pbk=
				fi
			fi
		else
			download "$o" ziel
		fi
	fi
	}


if [ "$ptch" -eq 1 ]; then

#### Suche/Auswahl zu patchender Kernelquellen 

	Kernelquellensuche "Welche Kernelquellen wollen Sie patchen?"
	find_Kziel $temp.ptch.02 $temp.ptch.04 $temp.ptch.06 "$e"
	sublev "$e"
	sublziel="$sublI"
	xzielext="$xIext"
	rczielext="$rcIext"
	spezzielext="$spezIext"

#### Suche Patches

	kname=2.6.[0-9]*
	findpatch >> $temp.ptch.14
	ptchausw="$(cat $temp.ptch.14)"
	for i in $ptchausw; do
		extention "$i"
		i=${i%$ext}
		i=${i##*patch-}
		echo "$i" >> $temp.ptch.17
	done

#### Patches sortieren und filtern
	
	ptchausw1="$(cat $temp.ptch.17 | sort | uniq)"
	for i in $ptchausw1; do
		sublev "$i"
		if [ "$sublI" -gt "$sublziel" ] \
		||  ( [ "$sublI" -ge "$[ $sublziel - 1 ]" ] && [ "$rczielext" ] && [ "$i" != "$e" ] && [ "$i" != 2.6."$[ $sublziel - 1 ]" ] && [ ${e%$spezzielext} != ${i%$spezIext} ] ) \
		|| ( [ ${e%$spezzielext} = ${i%$spezIext} ] && [ "$spezIext" ] && [ "$i" != "$e" ] ) \
		|| ( [ "$sublI" -eq "$sublziel" ] && [ "$i" != "$e" ] && [ "$i" != 2.6."$sublziel" ] && [ -z "$rcIext" ] ); then 
			grep -q "$i.bz2" $temp.ptch.14
			if [ $? -eq 0 ]; then
				grep "$i.bz2" $temp.ptch.14 | head -1 >> $temp.ptch.16
			else
				grep "$i.gz" $temp.ptch.14 | head -1 >> $temp.ptch.16
			fi
		fi
	done
	echo
	echo "Patchauswahl:"
	echo
	patch="$(cat $temp.ptch.16)"
	if [ -z "$patch" ]; then
		echo "keine Patches für den Kernel $o bzw. $e in ~ gefunden"
		exit
	fi

#### Patch auswählen

	select nummer in $patch; do
		if [ "$nummer" ]; then
			extention "$nummer"
			patchneu="$nummer"
			version "$nummer"
			nummer="$i"
			sublev "$nummer"
			sublnummer="$sublI"
			xnummerext="$xIext"
			rcnummerext="$rcIext"
			speznummerext="$spezIext"

#### Patchziel korrigieren - wenn rc: minus 1 subl

			o="$e"
			if [ ${e%$spezzielext} = ${nummer%$speznummerext} ] && [ "$speznummerext" ]; then
				e=${e%$spezzielext}
			elif [ "$rczielext" ]; then
				sublziel=$[ $sublziel - 1 ]
			fi
			e=2.6."$sublziel"

#### Patchziel suchen, wenn nichts gefunden Kernelquellen repatchen
		
			#patchziel="$e"
			find_Kziel $temp.ptch.02 $temp.ptch.04 $temp.ptch.06 "$e"
			if [ "$gef" -eq 0 ]; then
				weiter=0
				repatch
				if [ $weiter -eq 1 ]; then
					repatch
				fi
			fi

#### nötige Patches suchen, fehlende herunterladen, ansonsten fehlende notieren
	
			patchziel="$e"
			cd "$ko"
			if [ "$xnummerext" ] || ( [  ! "$rcnummerext" ] && [ "$speznummerext" ] ); then
				count="$sublnummer"
			else
				count=$[ $sublnummer - 1 ]
			fi
			sublx="$sublziel"
			while [ "$sublx" -lt "$count" ]; do
				sublx=$[ $sublx + 1 ]
				kname="2.6.$sublx"
				findpatch > $temp.ptch.12
				if [ ! -s "$temp.ptch.12" ]; then
					wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/patch-2.6."$sublx".bz2
					if [ $? -ne 0 ]; then
						echo 2.6."$sublx" >> $temp.ptch.100
					fi
				fi
			done

#### Berechnung Zusatzpatches

			p2=0
			if [ ${e%$spezzielext} != ${nummer%$speznummerext} ] && [ "$speznummerext" ] && [ "$rcnummerext" ]; then
				p2=1
				patchneu2="$patchneu"
				kname="2.6.$sublnummer$rcnummerext"
				findpatch > $temp.ptch.30
				patchneu="$(cat $temp.ptch.30 | head -1)"
				if [ -z "$patchneu" ]; then
					if [ "$rcnummerext" ]; then
						wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing/patch-"$kname".bz2
						if [ $? -ne 0 ]; then
							echo "2.6.$sublnummer$rcnummerext" >> $temp.ptch.100
						else
							patchneu="$ko/patch-$kname".bz2
						fi
					else
						wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/patch-"$kname".bz2
						if [ $? -ne 0 ]; then
							echo "2.6.$sublnummer$rcnummerext" >> $temp.ptch.100
						else
							patchneu="$ko/patch-$kname".bz2
						fi
					fi
				fi
			fi

#### Falls der Fall, fehlende Patches zeigen und abbrechen

			if [ -s $temp.ptch.100 ]; then
				echo "um linux-$e mit dem patch-$nummer patchen zu können, benötigen Sie noch folgende Patches:"
				cat $temp.ptch.100
				exit
			fi

#### zu patchenden Quellen neuen Namen geben und Besitzer wechseln

			cd "$aa"
			if [ "$overw" -eq 1 ]; then
				sudo mv "linux-2.6.$patchziel" "err9or-linux-$nummer"
			else
				#echo
				#echo "bitte etwas Geduld"
				#echo
				sudo cp -r "linux-$patchziel" "err9or-linux-$nummer"
			fi
			ziel="$aa/err9or-linux-$nummer"
			sudo chown -R "$who" "$ziel"

#### Berechnung der Durchläufe der Patch-Schleife

			differenz=$[ $sublnummer - $sublziel ]
			version "$patchneu"
			sublev "$i"
			if [ "$xIext" ] || [ "$spezIext" ]; then
				differenz=$[ $differenz + 1 ]
			fi

#### Patch-Schleife

			sublpatch=$[ $sublziel + 1 ]
			while [ $differenz -gt 1 ]; do
				kname="2.6.$sublpatch"
				findpatch > $temp.ptch.30
				ptch="$(cat $temp.ptch.30 | head -1)"
				extention "$ptch"
				if [ "$uncomp" ]; then
					sudo $uncomp "$ptch" | sudo patch -p1 "$s" -N -E -d "$ziel"
					if [ $? -ne 0 ]; then
						echo "Fehler beim Patchen"
						sudo rm -r "$aa"/err9or-linux-2.6* 2> /dev/null
						exit
					fi
				fi
				differenz=$[ $differenz - 1 ]
				sublpatch=$[ $sublpatch + 1 ]
			done

#### erster Zusatzpatch

			extention "$patchneu"
			if [ "$uncomp" ]; then
				sudo $uncomp "$patchneu" | sudo patch -p1 "$s" -N -E -d "$ziel"
				if [ $? -ne 0 ]; then
					echo "Fehler beim Patchen"
					sudo rm -r "$aa"/err9or-linux-2.6* 2> /dev/null
					exit
				fi

				if [ "$p2" -eq 0 ]; then
					find "$ziel" \( -name "*.orig" -o -name ".*.orig" \) -exec sudo rm {} \;
				fi
			fi

#### zweiter Zusatzpatch

			if [ $p2 -eq 1 ]; then
				extention "$patchneu2"
				if [ "$uncomp" ]; then
					sudo $uncomp "$patchneu2" | sudo patch -p1 "$s" -N -E -d "$ziel"
					if [ $? -ne 0 ]; then
						echo "Fehler beim Patchen"
						sudo rm -r "$aa"/err9or-linux-2.6* 2> /dev/null
						exit
					fi
					find "$ziel" \( -name "*.orig" -o -name ".*.orig" \) -exec sudo rm {} \;	
				fi
			fi
			break
		else
			echo "ungültige Auswahl"
		fi
	done
	sudo mv "err9or-linux-$nummer" "linux-$nummer"
fi


##############################     Kernelquellen suchen     ############################################

Kernelquellensuche "welcher Kernel soll konfiguriert und installiert werden?"
find_Kziel $temp.ptch.02 $temp.ptch.04 $temp.ptch.06 "$e"


#######################################     Kernelbezeichnung       ####################################

a="$e"
f="$aa"/linux-"$a"
sudo chown -R mm "$f"
cd "$f"
nj=0
while [ -f "/boot/vmlinuz-$a-x$d-c" ] && [ "$nj" -eq 0 ]; do
	echo
	echo
	echo "/boot/vmlinuz-$a-x$d-c besteht bereits"
	echo
	select num in "zusätzliche Kernelbezeichnung" "/boot/vmlinuz-$a-x$d-c überschreiben"; do
		case "$num" in
			zusät*)	echo
				echo -n "zusätzliche Kernelbezeichnung z.B. -123 oder -xyz: "
				read d
				d=${d#.}; d=${d#_}; d=${d#;}; d=${d#:}; d=${d#,}; d=${d#/}; 
				if [[ "$d" != -* ]]; then
					d=-"$d"
				fi
				nj=0
				break;;
			/boot*)	nj=1
				break;;
			     *)	echo
				echo "ungültige Auswahl";;
		esac
	done
done
echo


########################################    initial-ram-disk   #########################################

select nummer in "Initial-RAM-Disk erzeugen" "keine Initial-RAM-Disk erzeugen"; do
	case "$nummer" in
		Initial*)	echo	
				irdisk=j
				break;;
		keine*	)	echo
				irdisk=n
				break;;
		*	)	echo
				echo "ungültige Auswahl";;
	esac
done
echo


###########################################     config     ###############################################

ko=~/kernel
if [ ! -d "$ko" ]; then
	mkdir "$ko"
fi
l="$ko/kernel-config"
if [ ! -d "$l" ]; then
	mkdir "$l"
fi
e="$(date +%F-%T)"
zcat /proc/config.gz > "$l/config-$e-alt"
	ses="$(sed -n '/DEFAULT_WM=/p' /etc/sysconfig/windowmanager)"
	ses=${ses##DEFAULT_WM=}
	ses=${ses#'"'}
	ses=${ses%'"'}
if [[ $ses = gnome ]]; then
	xg1=gconfig
	pac1=libglade2-devel
	xg2=xconfig
	pac2=qt3-devel
else
	xg1=xconfig
	pac1=qt3-devel
	xg2=gconfig
	pac2=libglade2-devel
fi
if [ -s Makefilexc9backup ]; then
	cp Makefilexc9backup Makefile
else
	cp Makefile Makefilexc9backup
fi

develpaketconfig()
	{
	echo
	make "$1"
	if [ $? -eq 0 ]; then
		cf=2
	else
		cf=1
		rpm -q "$2" > /dev/null
		if [ $? -ne 0 ]; then
			echo
			echo
			echo "das rpm-Packet \"$2\" ist nicht installiert."
			echo "\"$1\" benötigt das Packet \"$2\"."
		fi
		echo
	fi
	}

develpaketconfig "$xg1" "$pac1"
while [ "$cf" -eq 1 ]; do
	select num in "$xg1" "$xg2" "menuconfig" "config" "Abbruch"; do
		case "$num" in
			"$xg1"	)	develpaketconfig "$xg1" "$pac1"
					break;;
			"$xg2"	)	develpaketconfig "$xg2" "$pac2"
					break;;
			menuc*	) 	develpaketconfig menuconfig ncurses-devel
					break;;
			config	) 	echo
					make config
					if [ $? -eq 0 ]; then
						cf=2
					else
						cf=1
					fi
			 		break;;
			Abbruch	) 		exit;;
		    	  *	) 	echo
			 		echo "ungültige Auswahl";;
		esac
	done
done


#######################################     Extraversion      ############################################

cp "$f/Makefile" M9akke7
i="$(sed -n "4{/EXTRAVERSION\ =/p}" < M9akke7)"
grep -q "EXTRAVERSION = .[0-9]" M9akke7
if [ $? -eq 0 ];then
	sed "4s/$i/$i-x$d-c/" < M9akke7 > $f/Makefile
elif [ $? -eq 1 ]; then
	sed "4s/$i/$i\ -x$d-c/" < M9akke7 > $f/Makefile
else
	echo "zusätzliche Kernelbezeichnung konnte nicht in die Makefile geschrieben werden"
fi
head -4 "$f/Makefile"
echo


###########################################     make     ###############################################

make "$s" all
if [ $? -ne 0 ]; then
	echo "Fehler"
	exit
fi
echo -n "drücken Sie   Enter   :  "
read
sudo make modules_install
sudo cp "$f/arch/i386/boot/bzImage" "/boot/vmlinuz-$a-x$d-c"
sudo cp "$f/System.map" "/boot/System.map-$a-x$d-c"
if [ "$irdisk" != n ]; then
	sudo /sbin/mkinitrd -k "vmlinuz-$a-x$d-c" -M "/boot/System.map-$a-x$d-c" -i "initrd-$a-x$d-c"
fi
mv M9akke7 "$f/Makefile"
i="$ko/backup-menu.lst"
if [ ! -d "$i" ]; then
	mkdir "$i"
fi
if [ ! -s "/boot/vmlinuz-$a-x$d-c" ]; then
	rm $temp.*
	echo "Fehler"
	echo "/boot/vmlinuz-$a-x$d-c konnte nicht erstellt werden"
	exit
fi


######################################     menu.lst      ###############################################

sudo cp /boot/grub/menu.lst "$i/bu-menu.lst-$e"
sudo chown "$who" "$i/bu-menu.lst-$e"
cp "$f/.config" "$l/config-$e-neu"
ml=~/9m7enu.lst
sudo cp /boot/grub/menu.lst "$ml"
sudo chown "$who" "$ml"
grep -q '^\#------------------------*---$' "$ml"
if [ $? -eq 0 ]; then
	sed '/#---------------/d' < "$ml" > $temp.04
	cat -s $temp.04 > "$ml"
fi
echo > ~/d9atei01 
echo \#---------------------------------------------------------------------------------------------------------------- >> ~/d9atei01
echo > ~/d9atei02
echo \#---------------------------------------------------------------------------------------------------------------- >> ~/d9atei02
v=1
grep "vmlinuz-$a-x$d-c" < "$ml" > $temp.08
s="$(wc -l < $temp.08)"
grep "initrd-$a-x$d-c" < "$ml" > $temp.09
t="$(wc -l < $temp.09)"
bop=0
grep -q '(hd[0-9]\{1,2\},[0-9]\{1,2\})/boot/vmlinuz' "$ml"
if [ $? -eq 0 ]; then
	bop=1
fi
grep -o 'root=/dev/[a-z]\{3\}[0-9]\{1,2\}' "$ml" | sort | uniq > $temp.06
rop=$(wc -l < $temp.06)
csplit -f ~/t9eil7. "$ml" /"###Don't change this comment - YaST2 identifier: Original name:"/-1 {*} > /dev/null
grep -q 'openSUSE' /etc/SuSE-release
if [ $? -eq 0 ]; then
	openSUSE=openSUSE
fi
if [ "$nj" -eq 0 ] || [ "$s" -eq 0 ]; then
	bp="$(grep -o 'root (hd[0-9]\{1,2\},[0-9]\{1,2\})' ~/t9eil7.01)"
	if [[ -z "$bp" ]]; then
		bp="root (hd?,?)"
	fi
	rp="$(grep -o 'root=/dev/[a-z]\{3\}[0-9]\{1,2\}' ~/t9eil7.01)"
	if [[ -z "$rp" ]]; then
		rp="root=/dev/????"
	fi
	cat ~/d9atei01 > $temp.07
	echo >> $temp.07
	echo "###Don't change this comment - YaST2 identifier: Original name: linux###" >> $temp.07
	echo "title openSUSE $ver  $a-x$d-c" >> $temp.07
	echo "    $bp" >> $temp.07
	echo "    kernel /boot/vmlinuz-$a-x$d-c $rp vga=0x317    resume=/dev/sda7  splash=silent showopts" >> $temp.07
	if [[ "$irdisk" == j ]]; then
		echo "    initrd /boot/initrd-$a-x$d-c" >> $temp.07
	fi
	cat ~/d9atei02 >> $temp.07
	j="title openSUSE $ver  $a-x$d-c"
	csplit -f ~/t9eil7. "$ml" /"###Don't change this comment - YaST2 identifier: Original name:"/-1 {1} > /dev/null
	cp "$ml" ~/menu.lst-bu
	cat ~/t9eil7.00 > "$ml"
	cat ~/t9eil7.01 >> "$ml"
	cat $temp.07 >> "$ml"
	cat ~/t9eil7.02 >> "$ml"
	v=0
	if [ ! -s "$ml" ]; then
		mv ~/menu.lst-bu "$ml"
		v=1
	fi
	rm ~/menu.lst-bu
elif [ "$nj" -eq 1 ] && [ "$s" -eq 1 ] && [ "$t" -lt 2 ]; then
	cp "$ml" "$ml-backup"
	grep -l "vmlinuz-$a-x$d-c" ~/t9eil7.[0-9][0-9] > $temp.11
	c="$(wc -l $temp.11 | awk '{ print $1 }')"
	if [ "$c" -eq 1 ]; then
		u="$(cat $temp.11)"
		j="$(sed -n "/title\ openSUSE 1[0-9].[0-9]  $a-x$d-c/p" < $ml)"
		cp "$u" $temp.12
		cat ~/d9atei01 > "$u"
		cat $temp.12 >> "$u"
		if [[ "$irdisk" == j ]] && [ "$t" -eq 0 ]; then
			echo "    initrd /boot/initrd-$a-x$d-c" >> "$u"
		fi
		if [[ "$irdisk" == n ]] && [ "$t" -eq 1 ]; then
			sed "/initrd-$a-x$d-c/d" < "$u" > $temp.10
			cat < $temp.10 > "$u"
			find /boot -name "vmlinuz-$a-x$d-c" > $temp.22
			in="$(wc -l $temp.22 | awk '{ print $1 }')"
		if [ "$in" -eq 1 ]; then
			sudo rm "/boot/initrd-$a-x$d-c"
		fi
	fi
		cat ~/d9atei02 >> "$u"
		cat ~/t9eil7.[0-9][0-9] > "$ml"
	fi
	if [[ -z "$ml" ]] || [[ -z "$j" ]]; then
		v=1
		cp "$ml-backup" "$ml"
	else
		v=0
	fi
	rm "$ml-backup"
else
	v=1
fi
rm ~/t9eil7.[0-9][0-9]
echo
echo
echo
echo
echo
if [ "$v" -eq 1 ]; then
	if [ "$nj" -eq 0 ] || [ "$s" -eq 0 ]; then
		echo "fügen Sie einen Eintrag in menu.lst für den neuen Kernel $a-x$d-c hinzu"
		echo
		echo "kernel /boot/vmlinuz-$a-x$d-c"
		if [[ "$irdisk" == j ]]; then
			echo "initrd /boot/initrd-$a-x$d-c"
		fi
	elif [ "$nj" -eq 1 ] && [ "$s" -gt 0 ]; then
		echo "Bitte kontrollieren Sie den Eintrag (z.B. boot- bzw. root-Partion) in /boot/grub/menu.lst für den Kernel $a-x$d-c"
		echo
		echo "		kernel /boot/vmlinuz-$a-x$d-c"
		if [[ "$irdisk" == j ]]; then
			echo
			echo "falls nicht schon vorhanden, fügen Sie dem Eintrag folgende Zeile hinzu:"
			echo "initrd /boot/initrd-$a-x$d-c"
		elif [[ "$irdisk" == n ]]; then
			echo
			echo "entfernen Sie (falls vorhanden) die initrd-$a-x$d-c-Zeile des entsprechenden Eintrages"
		fi
	fi
	echo
	echo "Drücken Sie \"Enter\" um die menu.lst zu öffnen."	
	read we
elif [ "$v" -eq 0 ]; then
	echo "`tput setf 4`Kontrollieren`tput sgr0` Sie den Eintrag in /boot/grub/menu.lst mit dem Titel"
	echo
	echo "$j"
	echo
	echo "kernel /boot/vmlinuz-$a-x$d-c"
	if [[ "$irdisk" == j ]]; then
		echo "initrd /boot/initrd-$a-x$d-c"
	fi
	if [ "$rop" -gt 1 ]  || [ "$bop" -eq 1 ]; then
		echo
		echo "Kontrollieren Sie, ob die Boot- bzw. Root-Partition richtig gesetzt ist."
		echo
		echo
		echo "Drücken Sie \"Enter\" um die menu.lst zu öffnen."	
		read we
	fi
fi
echo
echo
echo
echo
kwrite "$ml"
if [ $? -ne 0 ]; then
	gedit "$ml"
	if [ $? -ne 0 ]; then
		vi "$ml"
	fi
fi
grep -q '^\#------------------------*---$' "$ml" 
if [ $? -eq 0 ]; then
	sed '/#---------------/d' < "$ml" > $temp.13
	cat -s $temp.13 > "$ml"
fi
sudo mv "$ml" /boot/grub/menu.lst
rm $temp.*
rm ~/d9atei[0-9][0-9]
exit
 
catweasel schrieb:
Was sagt ihr zu meinem Skript?
Superkomplex, mehr noch als der Dreischritt.

Guck dir die Specfiles an, da steht drin, sie geben einen Hinweis darauf, wie man - inklusive der SUSE-Patches - automatisiert vorgeht.

Subroutinen [in SH] scheinen dir auch ein Fremdwort zu sein.
 
OP
C

catweasel

Hacker
gibt es zwischen Suse 10.2 x86 und Suse 10.2 x86_64 beim Kompilieren und Installieren eines Kernels (abgesehen vom Konfigurieren und von den kernel-source.rpm's) Unterschiede?
 
Oben