My-kernel-2.6

From LUGUM

Jump to: navigation, search

Dieses Script ermöglicht ein einfaches kompillieren von einem Kernel sowie dem Nvidia Modul und nimmt alle Arbeiten bis auf das konfigurieren ab. Es funktioniert sowohl unter Debian Sarge als auch unter Debian Sid. Unter Debian Etch wurde es von mir noch nicht getestet.

#!/bin/bash

# author: Andreas Kraus <lug@ak1301.de>
# $Revision: 0.5.2 $
#
# licence: GPL
# http://www.gnu.org/licenses/gpl.html
#

# Soll nach Nvidia und lilo gefragt werden

ASK_LILO=1
ASK_NVIDIA=1


LANG=C
KERNEL_ORG='kernel.org'
FTP_KERNEL_ORG="ftp.${KERNEL_ORG}"
WWW_KERNEL_ORG="www.${KERNEL_ORG}"
KERNEL_ORG_PATH="/pub/linux/kernel"
LINUX_ALT='/linux_alt'
LYNX=/usr/bin/lynx
GPG=/usr/bin/gpg
WGET=/usr/bin/wget
DIALOG=/usr/bin/dialog
PERL=/usr/bin/perl
SRC_ROOT='/usr/src'
ARCHIV='/kernelsource' # Ordner wo die Heruntergeladenen Kernelsources abgelegt werden
MAKE_KPKG=/usr/bin/make-kpkg
now=`date +%Y%m%d`
NCURSES=libncurses5-dev
PATCHES="${SRC_ROOT}/patches"
LABEL=" --no-label Nein --yes-label Ja"
GPG_WAIT=10
DMIDECODE=/usr/sbin/dmidecode

if [ ! $UID -eq 0 ]; then
    echo "Sie muessen dieses Script als Root ausfuehren."
    exit 1
fi

if [ ! $# -ne 1 ]; then
clear
cat << EOF
my-kernel-2.6 Version 0.5

Es werden diverse Ordner zum leichteren Installieren angelegt.


Verzeichnisstrucktur:

kernelsource 
 Hier werden die Quellpaktete automatisch abgelegt oder von 
 Hand wenn man keine Internet Verbindung hat

linux
 Linux Source

linux_alt
 Alte Versionen von linux

pakete
 Fertige Debian Pakete

patches
 Alle Patches in diesem Ordner werden auf die Kernelquellen angewendet.
 Wenn sie in einer bestimmten Reihenfolge angewendet werden muessen, bitte 
 eine Zahl zur Reihenfolge vor den Patch stellen. 


EOF
exit 0
fi

FEHLT=""
for f in $WGET $LYNX  $DIALOG $MAKE_KPKG $GPG $PERL $DMIDECODE ; do
    if  ! [ -x  $f ]; then
            FEHLT="$FEHLT $f,"
        fi
done


if [ "$FEHLT" ]; then
    echo "Das Programm/ Die Programme $FEHLT ist/sind nicht installiert oder ist nicht ausfuerbar, bitte erst Installieren"
    exit 1
fi


for f in $NCURSES; do
    dpkg -s $f | grep -q "^Status: install ok installed" 2> /dev/null
    installed=$?
    if [ $installed -eq 1 ]; then
        echo ""
        echo "Achtung!"
        echo "Das Paket $f ist nicht installiert, bitte erst Installieren"
        echo ""
        exit 1
    fi
done

debian_version () {
    grep -qE "3.1" /etc/debian_version
    if [ $? -ne 0 ]; then
        PAKETNAME=linux-image-${real_version}${append_to_version}_${real_version}${append_to_version}-10.00.Custom_i386.deb
        PAKETNAME_HEADERS=linux-headers-${real_version}${append_to_version}_${real_version}${append_to_version}-10.00.Custom_i386.deb
        PAKETNAME_NVIDIA=nvidia-kernel-${real_version}${append_to_version}_`dpkg -s nvidia-kernel-source | grep Version | cut -f 2 -d " "`+${real_version}${append_to_version}-10.00.Custom_i386.deb
    else
        PAKETNAME=kernel-image-${real_version}${append_to_version}_10.00.Custom_i386.deb
        PAKETNAME_HEADERS=kernel-headers-${real_version}${append_to_version}_10.00.Custom_i386.deb
        PAKETNAME_NVIDIA=nvidia-kernel-${real_version}${append_to_version}_`dpkg -s nvidia-kernel-source | grep Version | cut -f 2 -d " "`+10.00.Custom_i386.deb
    fi
}


# Patcht den kernel mit allen Dateien die in /usr/src/patches/ liegen

own_patches (){
    if [ ! -d $PATCHES ]; then
        mkdir -p $PATCHES
    fi
    $DMIDECODE | grep "Product Name: Precision M70" > /dev/null 2>&1
    IS_PRECISION=$?
    if [ $IS_PRECISION -eq 0 ]; then
        $PERL -pi -e "s/undef ATA_ENABLE_PATA/define ATA_ENABLE_PATA/"  ${SRC_ROOT}/linux/include/linux/libata.h
	#    vi ${SRC_ROOT}/linux/include/linux/libata.h +44
    fi
    if [ -d $PATCHES ]; then
    	cd ${SRC_ROOT}/linux
    	for f in $PATCHES/*; do
    	    patch -p1 < $f
    	done
    fi
}

# Fragt den Kerneltree ab 

ask_kernel_tree(){
    KERNELTREE=`$DIALOG --title 'Kernel Version' --stdout --nocancel --menu 'Welcher Kernel soll kompiliert werden?' 9 70 2  2.6 Kerneltree 2.4 Kerneltree`
    if [ "$KERNELTREE" = "2.6" ]; then
        VERSION=`$LYNX -source http://www.kernel.org/kdist/finger_banner | awk '/latest stable/ { print $10 }'`
    fi
    if [ "$KERNELTREE" = "2.4" ]; then
        VERSION=`$LYNX -source http://www.kernel.org/kdist/finger_banner | awk '/latest 2.4/ { print $10 }'`
    fi
}

# Fragt ob der Kernel installiert werden soll, ansonsten bricht das Script ab

ask_install_kernel() {
     $DIALOG --title 'Installieren?' --stdout $LABEL --yesno "Soll der Kernel $VERSION installiert werden?" 5 70
     if ! [ $? -eq 0 ]; then
         echo "Abbruch"
	 exit 1
     fi
}

# Fragt ab, welche  Append_to_Version angehängt werden soll

append_to_version (){
    APPEND_TO_VERSION=`$DIALOG --stdout --inputbox "Bitte die Append_to_Version angeben" 8 70`
}

# Fragt nach ob man Online ist, ansonsten werden die bereits heruntergeladenen Pakete verwendet. 

ask_online () {
    # are we online?
    dialog --title 'Internet' --stdout --no-cancel $LABEL --yesno "Besteht eine Internet Verbindung zum Online Update der Quellen?" 5 70
    if [ $? -eq 0 ]; then
	online=1
    else
	online=0
    fi
}

# Fragt ob die Lilo Automatisch geschrieben werden soll.

ask_lilo () {
    $DIALOG --title 'Lilo' --stdout --no-cancel $LABEL --yesno "Soll die Lilo Config Automatisch geschrieben werden" 5 70
    if [ $? -eq 0 ]; then
	lilo=0
        $DIALOG --title 'Lilo' --stdout --no-cancel $LABEL --yesno "Soll der aktuelle Kernel als default gebootet werden?" 5 70
        if [ $? -eq 0 ]; then
	    lilo_default=0
	else
	    lilo_default=1
	fi
    else
	lilo=1
    fi
}

# Liest die aktuelle Version in /usr/src/linux aus 

read_this_version () {
    makefile_version=`grep "^VERSION" ${SRC_ROOT}/linux/Makefile | head -n 1 | cut -d "=" -f 2 | awk '{print $1}'`
    makefile_patchlevel=`grep "^PATCHLEVEL" ${SRC_ROOT}/linux/Makefile | head -n 1 | cut -d "=" -f 2 | awk '{print $1}'`
    makefile_sublevel=`grep "^SUBLEVEL" ${SRC_ROOT}/linux/Makefile | head -n 1 | cut -d "=" -f 2 | awk '{print $1}'`
    makefile_extraversion=`grep "^EXTRAVERSION" ${SRC_ROOT}/linux/Makefile | head -n 1 | cut -d "=" -f 2 | awk '{print $1}'`
    version=${makefile_version}.${makefile_patchlevel}.${makefile_sublevel}${makefile_extraversion}
}

# Laed den Public Key herunter, falls benoetigt.

get_public_key () {
    $GPG --fingerprint 0x517D0F0E > /dev/null 2>&1
    result=$?
    if [ $result -ne 0 ]; then
        if [ $online -ne 1 ]; then
        L1="Um den \"Linux Kernel Archives Verification Key\" herunterzuladen, benoetigen wir eine Internetverbindung!\n\n"
	L2="Ohne diesen Schluessel koennen wir die Kernel-Signatur nicht ueberpruefen."
	$DIALOG --title 'Achtung !' --msgbox "${L1}${L2}"  8 85
	else
	    $GPG --keyserver wwwkeys.de.pgp.net --recv-keys 0x517D0F0E
	fi
    fi
    $GPG --fingerprint 0x517D0F0E | grep -q "C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E"
    if [ $? -ne 0 ]; then
        L1="Der Fingerprint vom \"Linux Kernel Archives Verification Key\"\nist nicht"
	L2="Gueltig oder nicht Installiert.\n\nSoll abgebrochen werden?"
	$DIALOG --title 'Fehler' --stdout --no-cancel $LABEL --yesno "${L1}${L2}" 8 70
        if [ $? -eq 0 ]; then
            echo "Abbruch ..."
	    exit 1
        fi
    fi
}

# Laed den kernel runter, und packt ihn nach /usr/src/linux aus 

download_kernel(){
    if [ ! -d ${SRC_ROOT}${ARCHIV} ]; then
        mkdir -p ${SRC_ROOT}${ARCHIV}
    fi
    cd ${SRC_ROOT}${ARCHIV}
    $DIALOG --title 'Download' --infobox "Die Kernelquellen werden Heruntergeladen (${VERSION})\n\nEinen Augenblick bitte." 5 80
    if [ ! -f "linux-${VERSION}.tar.bz2" ]; then
        $WGET "ftp://${FTP_KERNEL_ORG}/pub/linux/kernel/v${KERNELTREE}/linux-${VERSION}.tar.bz2"
        if ! [ $? -eq 0 ]; then
            echo "Download ist Fehlgeschlagen"
	    exit 1
	fi
    fi
    if [ ! -f "linux-${VERSION}.tar.bz2.sign" ]; then
        $WGET "ftp://${FTP_KERNEL_ORG}/pub/linux/kernel/v${KERNELTREE}/linux-${VERSION}.tar.bz2.sign"
        if ! [ $? -eq 0 ]; then
            echo "Download ist Fehlgeschlagen"
	    exit 1
	fi
    fi
}

# Fragt nach ob Nvidia installiert werden soll, und installiert es 

ask_install_nvidia() {
    $DIALOG --title 'Install' --stdout $LABEL --yesno "Soll das Nvidia Treiber Paket erstellt werden?" 6 70
    if [ $? -eq 0 ]; then
        nvidia=0
        dpkg -s nvidia-kernel-source | grep -q "^Status: install ok installed" 2> /dev/null
	nvidia_kernel_source=$?
	if [ $nvidia_kernel_source -eq 1 ]; then
        apt-get install nvidia-kernel-source
	    if ! [ $? -eq 0 ]; then
                echo "Installieren der Nvidia-Kernel-Quellen ist Fehlgeschlagen"
		exit 1
            fi
	fi
    fi
}

# Fragt nach ob der Kernel gepatcht werden soll und unterbricht das Script bis gepatcht ist

ask_patches() {
    $DIALOG --title 'Patches' --stdout $LABEL --yesno "Soll der Kernel gepatcht werden?\nDu bekommst spaeter Zeit dazu." 6 70
    if [ $? -eq 0 ]; then
	APPLY_PATCH=1
    else
	APPLY_PATCH=0
    fi
}

# Wartet bis der Benutzer gepatcht hat

do_patches () {
    if [ $APPLY_PATCH -ne 0 ]; then
	$DIALOG --title 'Patches' --no-cancel --msgbox "Jetzt ist es Zeit den Kernel zu Patchen\nDruecke OK wenn alle Patches eingespielt sind" 6 70
    fi
}

# Kompilliert den Kernel

build_kernel () {
    cd ${SRC_ROOT}/linux
    cp /boot/config-`uname -r` ./.config
    $MAKE_KPKG clean
    $MAKE_KPKG --config menuconfig --append-to-version "${APPEND_TO_VERSION}" --bzimage configure kernel_image kernel_headers 
    $MAKE_KPKG --append-to-version "${APPEND_TO_VERSION}" debian modules_image --initrd
    if ! [ $? -eq 0 ]; then
	echo "Kompillieren hat abgebrochen"
	exit 1
    fi
}

# Liest die wirkliche Version aus die sich durch das Patchen aendern kann. 

get_real_version () {
    real_version=`grep "^VERSION" ${SRC_ROOT}/linux/conf.vars | head -n 1 | awk '{print $3}'`
    real_patchlevel=`grep "^PATCHLEVEL" ${SRC_ROOT}/linux/conf.vars | head -n 1 | awk '{print $3}'`
    real_sublevel=`grep "^SUBLEVEL" ${SRC_ROOT}/linux/conf.vars | head -n 1 | awk '{print $3}'`
    real_extraversion=`grep "^EXTRAVERSION" ${SRC_ROOT}/linux/conf.vars | head -n 1 | awk '{print $3}'`
    real_append_to_version=`grep "^APPEND_TO_VERSION" ${SRC_ROOT}/linux/conf.vars | head -n 1 | awk '{print $3}'`
    real_version=${real_version}.${real_patchlevel}.${real_sublevel}${real_extraversion}${real_append_to_version}
}

# Schreibt die Optionen fuer den neuen Kernel in die Lilo.conf

prepare_lilo_conf () {
    label_version=`echo ${real_version}${append_to_version} |  cut -b 1-15`
    echo "image=/boot/vmlinuz-${real_version}${append_to_version}"  >> /etc/lilo.conf
    echo "        label=${label_version}"                           >> /etc/lilo.conf
    echo "        read-only"                                        >> /etc/lilo.conf
    if [ $IS_PRECISION -eq 0 ]; then
        echo "        append=\"libata.atapi_enabled=1\""		    >> /etc/lilo.conf
    fi
}

# Erstellt einen Ordner und kopiert die aktuell erstellten Pakete hinein

consolidate_files () {
    cd ${SRC_ROOT}
    test -d  ${SRC_ROOT}/pakete/${VERSION}-deb-${now} || mkdir -p  ${SRC_ROOT}/pakete/${VERSION}-deb-${now}
    mv *.deb ${SRC_ROOT}/pakete/${VERSION}-deb-${now}/
    cp ${SRC_ROOT}/linux/.config  ${SRC_ROOT}/pakete/${VERSION}-deb-${now}/config
}

# Fragt ob der Kernel Installiert werden soll

ask_install_kernel_package() {
    $DIALOG --title 'Install' --stdout $LABEL --yesno "Soll der Kernel Installiert werden?" 6 70
    if [ $? -eq 0 ]; then
	dpkg -i ${SRC_ROOT}/pakete/${VERSION}-deb-${now}/$PAKETNAME
    	if ! [ $? -eq 0 ]; then
	    exit 1
        fi			    
    fi
}


# Fragt nach ob das Nvidia Paket installiert werden soll

ask_install_nvidia_package() {
    $DIALOG --title 'Install' --stdout $LABEL --yesno "Soll das Nvidia Treiber Paket Installiert werden?" 6 70
    if [ $? -eq 0 ]; then
	dpkg -i ${SRC_ROOT}/pakete/${VERSION}-deb-${now}/${PAKETNAME_NVIDIA}
	if ! [ $? -eq 0 ]; then
	            exit 1
        fi
	depmod -a ${real_version}${append_to_version}
    fi
}

# Aendert den Standard Kernel von Lilo 

change_lilo() {
    $PERL -pi -e "s/^default=.*/default=${label_version}/g;" /etc/lilo.conf
}


select_modules () {
    cd ${SRC_ROOT}
    my_modules=""
    m=""
    for f in `ls *.tar.gz | grep -v nvidia-kernel-source.tar.gz | sort`; do
	tar tfz ${f} | grep -q "^modules/"
	result=$?
        if [ $result -eq 0 ]; then
	    m="$m `basename $f .tar.gz` "
	    p=`dpkg -S $PWD/$f | cut -d : -f 1`
	    if [ $p ]; then
		dsc=`dpkg -s $p | grep "^Description:" | cut -c 14-`
		if [ "$dsc" ]; then
		    m="$m \"$dsc\" off"
		else
		    m="$m $f off"
		fi
	    else
		m="$m $f off"
	    fi
	fi
    done
    if [ "$m" ]; then
	tmpfile=`mktemp`
        m="dialog --title 'Module' --nocancel --stdout --checklist 'Welche module sollen installiert werden?' 20 70 14 $m"
	echo $m > $tmpfile
	chmod 755 $tmpfile
        result=`$tmpfile | sed -e 's/"//g'`
	rm $tmpfile
	my_modules=$result
    fi
}


prepare_modules () {
    cd ${SRC_ROOT}
    rm -rf modules
    for f in $my_modules; do
	test -f ${f}.tar.gz && tar xfz ${f}.tar.gz;
	test -f ${f}.tgz && tar xfz ${f}.tgz;
	test -f ${f}.tar.bz2 && tar xfj ${f}.tar.bz2;
    done
}

# Fragt ab welcher Kernel im Offline modus installiert werden soll

select_kernel () {
    cd ${SRC_ROOT}${ARCHIV}
    m=''
    for kernel in `ls linux-[0-9]*.[0-9]*.*.tar.bz2 | sort -r`; do
        VERSION=`echo ${kernel} | tail -n 1 | cut -d '-' -f 2- | sed -e s/.tar.bz2// `
	m="${m} ${VERSION} ${kernel}"
    done
    VERSION=`dialog --title 'Kernel' --stdout --nocancel --menu 'Welcher Kernel?' 20 70 14 ${m}`
    if [ ! $VERSION ]; then
        dialog --title 'Error' --infobox "Kernelpaket Fehlt!\nEs gibt keinen Kernelpaket im Verzeichnis ${SRC_ROOT}${ARCHIV}/" 4 70
	exit 1
    fi
}

# Entpacke Nvidia

prepare_nvidia() {
    cd /usr/src
    tar -xzf nvidia-kernel-source.tar.gz
    if ! [ $? -eq 0 ]; then
        exit 1
    fi
}

# Ueberprueft die Signatur vom kernelpaket

check_signature(){
    $GPG --verify ${SRC_ROOT}${ARCHIV}/linux-${VERSION}.tar.bz2.sign ${SRC_ROOT}${ARCHIV}/linux-${VERSION}.tar.bz2 > /dev/null 2>&1
    result=$?
    sig=`$GPG --verify ${SRC_ROOT}${ARCHIV}/linux-${VERSION}.tar.bz2.sign ${SRC_ROOT}${ARCHIV}/linux-${VERSION}.tar.bz2 2>&1`
    echo $sig
    dialog --title 'Teste Kernel Signatur' --infobox "$sig" 16 70
    sleep $GPG_WAIT
    if [ $result -ne 0 ]; then
        dialog --title 'Fehler' --stdout --no-cancel $LABEL --yesno "Die Kernel Signatur ist nicht in Ordnung.\nSoll ich abbrechen?" 6 85
        if [ $? -eq 0 ]; then
            echo "Abbruch ..."
	    exit 1
        fi
    fi
}

# Enpacke den kernel 

prepare_kernel() {
    if [  -L ${SRC_ROOT}/linux ]; then
        rm ${SRC_ROOT}/linux
    fi
    if  ! [ -d ${SRC_ROOT}${LINUX_ALT} ]; then
         mkdir ${SRC_ROOT}${LINUX_ALT}
    fi
    if [ -d ${SRC_ROOT}/linux ]; then
        read_this_version
	mv ${SRC_ROOT}/linux/ ${SRC_ROOT}${LINUX_ALT}/linux-${version}-`date +%Y%m%d%H%M%S`
        if ! [ $? -eq 0 ]; then
            echo "Verschieben ist Fehlgeschlagen"
	    exit 1
        fi
    fi
    cd ${SRC_ROOT}
    if [  -d ${SRC_ROOT}/linux ]; then
        rm -r ${SRC_ROOT}/linux
    fi
    $DIALOG --title 'Entpacken' --infobox "Die Kernelquellen (${VERSION}) werden Entpackt\n\nEinen Augenblick bitte." 5 80
    tar xjf ${SRC_ROOT}${ARCHIV}/linux-${VERSION}.tar.bz2
    if ! [ $? -eq 0 ]; then
        echo "Entpacken ist Fehlgeschlagen"
	exit 1
    fi
    mv ${SRC_ROOT}/linux-${VERSION} linux
}
feddisch (){

	$DIALOG --title 'Fertig' --infobox "\n Die Installation war erfolgreich ... Have a lot of fun" 5 80


}
################################################################
### main
################################################################

cd ${SRC_ROOT}

ask_online
get_public_key
if [ $online -eq 0 ]; then
    select_kernel
else
    ask_kernel_tree 
    ask_install_kernel
    download_kernel
fi
if [ $ASK_NVIDIA -eq 1 ]; then
    ask_install_nvidia
fi

check_signature
prepare_kernel
append_to_version
select_modules
ask_patches
own_patches
do_patches
prepare_modules
if [ $nvidia -eq 0 ]; then
    prepare_nvidia
fi
build_kernel
cd ${SRC_ROOT}
get_real_version 
debian_version
if [ $ASK_LILO -eq 1 ]; then
    ask_lilo
    if [ $lilo -eq 0 ]; then
        prepare_lilo_conf
    fi
    if [ $lilo_default -eq 0 ]; then
        change_lilo
    fi
fi    
consolidate_files
ask_install_kernel_package
if [ $nvidia -eq 0 ]; then
	ask_install_nvidia_package
fi
feddisch
Persönliche Werkzeuge