Automatischer Kernel- und Systembau unter OpenBSD

CW

Netswimmer
Da ich sehr oft neue Kernelkonfigurationen ausprobiere und ebenfalls auch das ganze System baue, habe ich mir ein quick-and-dirty Shell-Script gebastelt.

Und dieses möchte ich natürlich auch allen anderen anbieten, die keine Lust mehr auf config KERNEL && make depend && make && make install usw. haben ;)

Wenn es Verbesserungsvorschläge gibt, dann baut sie doch sofort ein ;)

Ich werde sie dann sofort ausprobieren. :)

Das Script habe ich als buildall.sh abgespeichert und führe es mit einem einfachen sh buildall.sh KERNELDATEI aus.

Dabei spielt es keine Rolle, in welchen Verzeichnis ich mich befinde.

Man muss aber in der Gruppe wheel sein und die jeweiligen SUDO-Rechte in der /etc/sudoers haben.

Das dürfte aber allen, die Kernel/Systeme bauen wohl klar sein ;)

Das Script erledigt neben der Kompilierarbeit auch die ganze Reinigung des Quellcodes.

-------------------------------------------------------------------------------------------
Code:
#!/bin/sh
#
# OpenBSD AutoBuild
#
# Datum: 03.09.2003
# Autor: CW
######################


#######################
#
# Scriptablauf:
#
# Zuerst wird überprüft, ob eine Datei namens datum im Homeverzeichnis
# vorhanden ist. Wenn ja, wird in die Datei geschaut und das abgespeicherte
# Datum wird mit dem aktuellen verglichen. Solle es sich um dasselbe handeln,
# bricht der Vorgang ab. Wir wollen ja nicht mehr als einmal am Tag das
# komplette System neu bauen.
#
#
# Danach wird überprüft, ob überhaupt eine Kernel-Config-Datei angegeben
# worden ist. Wenn nicht, wird ein Listing von /sys/arc/i386/conf
# gemacht und der weitere Vorgang abgebrochen.
#
#
# Wenn ein Dateiname angegeben worden ist, wird überprüft, ob diese vorhanden
# ist. Wenn nicht, dann gibt es eine Dateiauflistung von /sys/arch/i386/conf.
#
#
# Wenn die Datei vorhanden ist, laufen folgende Vorgänge ab:
#
# a) Alte Objektdateien im Compile-Verzeichnis werden gelöscht
# b) Konfiguration der Kernel-Konfig-Datei
# c) Wechsel nach ../compile/DATEINAME & Kernel-Kompilierung
# d) Alte Objektdateien und herumliegende Binaries in /usr/src werden gelöscht
# e) Neue Objektverzeichnisse werden angelegt
# f) Das System wird neu kompiliert
# g) Eine neue Datum-Datei wird angelegt
# h) 10 Sekunden lang warten und danach rebooten
#
###################################################


# der erste Parameter wird als Dateiname übernommen

MACHINE=$1

# Wann ist zum letzten Mal alles gebaut worden?

if [ -a $HOME/datum ]; then

 if [ `date +"%Y-%m-%d"` = `cat $HOME/datum` ]; then

# Wenn heute, dann Ende!

   echo "\nDas System ist bereits up-to-date!\n"
   exit 0
 fi
fi

# Ohne eine Dateiangabe machen wir nicht weiter.

if [ -z $MACHINE ];
		then

   echo "\nFEHLER: Der Kernel-Config-Name fehlt!\n"
   echo "\n Folgende Kernel-Config-Dateien können angegeben werden:"
   echo "------------------------------------------------------------"

# Die Liste aller Kernel-Configs

   ls -la -1 /sys/arch/i386/conf
   exit 0

fi


# Ist die angegebene Datei vohanden?

if  ! [ -a /usr/src/sys/arch/i386/conf/$MACHINE ]; then
   echo "\nDie angegebene Kernel-Config-Datei $MACHINE existiert nicht!\n"
   echo "\n Folgende Kernel-Config-Dateien können angegeben werden:"
   ls -la -1 /sys/arch/i386/conf
     exit 0
fi
			
if [ -d /usr/src/sys/arch/i386/compile/$MACHINE ]; then
	
echo -n "\n Alte Objektdateien werden gelöscht ..."

cd /usr/src/sys/arch/i386/compile/$MACHINE

sudo make clean > /dev/null 2>&1

echo "  erfolgreich!"


echo -n "\n Die Kernel-Konfiguration $MACHINE wird generiert ..."

cd /usr/src/sys/arch/i386/conf

sudo config $MACHINE > /dev/null 2>&1 && echo "  erfolgreich!"


cd ../compile/$MACHINE

echo -n "\n Der neue Kernel $MACHINE wird kompiliert ..."

sudo make depend > /dev/null 2>&1 && sudo make > /dev/null 2>&1 && sudo make install > /dev/null 2>&1

echo "  erfolgreich!"

cd /usr/src

echo -n "\n Der System-Quellcodebaum wird bereinigt ..."

sudo rm -rf /usr/obj/*

find . -type l -name obj | sudo xargs rm 

sudo make clean > /dev/null 2>&1

echo "  erfolgreich!"

echo -n "\n Neue Objektverzeichnisse werden angelegt ..."

sudo make obj > /dev/null 2>&1

echo "  erfolgreich!"

echo -n "\n Das System wird neu gebaut ..."

sudo make build > /dev/null 2>&1


echo "  erfolgreich!"

echo "\n\n Das komplette System $MACHINE ist gebaut worden ... NEUSTART erfolgt in 10 Sekunden!"

cd && echo `date +"%Y-%m-%d"` > `pwd`/datum

sleep 10 && sudo reboot

###############################################
# Ansonsten wird eine Fehlermeldung generiert.#
###############################################

else

   echo "\nDie angegebene Kernel-Config-Datei $MACHINE existiert nicht!\n"
   echo "\n Folgende Kernel-Config-Dateien können angegeben werden:"
   echo "------------------------------------------------------------"
   ls -la -1 /sys/arch/i386/conf
   exit 0

fi
 
Zuletzt bearbeitet:
Hi,

hm, also es soll Leute geben, die das mehr als einmal
am Tag machen :)

Und dann auch noch in anderen Pfaden, auf anderen Archs, ...

also die Variablen mit Vorbelegung auf "deinen" default:

(nach den sonst auf verwendeten variablennamen)

BSDSRCDIR=${BSDSRCDIR:=/usr/src}
BSDOBJDIR=${BSDOBJDIR:=/usr/obj}
ARCH=${ARCH:=i386}

und dann halt zB den 'cd' per
cd ${BSDSRCDIR}/sys/arch/${ARCH}/compile


> sudo make depend > /dev/null 2>&1 && sudo make > /dev/null 2>&1 && sudo make install > /dev/null 2>&1

geht auch mit 'sudo make depend all install' .. make bricht
weitere targets bei exit != 0 von selber ab

und die meisten if [ .. ] kann man auch auf [ .. ] && { foo } || { bar }
"kuerzen"

HTH,ciao
 
Original geschrieben von double-p
Hi,

hm, also es soll Leute geben, die das mehr als einmal
am Tag machen :)

Und dann auch noch in anderen Pfaden, auf anderen Archs, ...

also die Variablen mit Vorbelegung auf "deinen" default:

(nach den sonst auf verwendeten variablennamen)

BSDSRCDIR=${BSDSRCDIR:=/usr/src}
BSDOBJDIR=${BSDOBJDIR:=/usr/obj}
ARCH=${ARCH:=i386}

und dann halt zB den 'cd' per
cd ${BSDSRCDIR}/sys/arch/${ARCH}/compile


> sudo make depend > /dev/null 2>&1 && sudo make > /dev/null 2>&1 && sudo make install > /dev/null 2>&1

geht auch mit 'sudo make depend all install' .. make bricht
weitere targets bei exit != 0 von selber ab

und die meisten if [ .. ] kann man auch auf [ .. ] && { foo } || { bar }
"kuerzen"

HTH,ciao

Danke!

Ich habe in der Zwischenzeit mein Script stark verändert (mit Optionen usw. versehen).

Ich habe es bloß nicht gepostet (hmmm ... habe es vergessen) und leider hat auch niemand sonst was zum Script gepostet.

Danke auf alle Fälle für die Hinweise ... ich baue sie ein und poste sie dann hier :)

Gruß

CW
 
Zuletzt bearbeitet:
Hier die neue Version des Scripts.

Er ist jetzt viel flexibler und hat Optionen.

Und ich habe noch die BSD-Lizenz hinzugefügt

Es gehört sich ja so ;)

Wenn ihr Verbesserungvorschläge habt, dann postet sie und ich werde sie implementieren.

So wie z.B. den obenstehenden Vorschlag von double-p. :)

Danke nochmals double-p.

Vielleicht kann man den Script für andere BSDs anpassen.

So unterschiedlich sind sie ja nicht. :)

-------------------------------------------------------------------------------------------

Code:
#!/bin/sh
#
# AutoBuild-Script für OpenBSD  (v 0.3)
#
# Datum: 08.09.2003
# Zeit : 10:02:35
# Autor: CW
#
#
#
################################################################################
#
# Copyright (C) 2003 CW
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
#  1. Redistributions of source code must retain the above copyright notice, this list of conditions
#     and the following disclaimer.
#
#  2. Redistributions in binary form must reproduce the above copyright notice, this list of 
#     conditions and the following disclaimer in the documentation and/or other materials provided 
#     with the distribution.
#
#  3. The name of the author may not be used to endorse or promote products derived from this 
#     software without specific prior written permission. 
# 
#  4. All advertising materials mentioning features or use of this software must display the 
#     following acknowledgement:
#
#     This product includes software developed by CW
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 
#####################################################################################################




################################################################################
#
# Aufgabe des Scripts:
#
# a) Kompilierung des Kernels
#
# b) Kompilierung des Systems
#
#
################################################################################
#
#
#
# Die Standardvorgabe ist für die i386-Architektur angepasst.
# Diese kann durch das Ändern der ARCH-Variable an die jeweilige Hardware
# angepasst werden.
#
# Dasselbe gilt auch für die Quellcode-Verzeichnisse. 
#
#
################################################################################

#Optionen
##########

PARAMETER1=${PARAMETER1:=GENERIC}
PARAMETER2=${PARAMETER2:=build}
PARAMETER3=${PARAMETER3:=reboot}

# Umgebungsvariabeln
#####################

BSDSRCDIR=${BSDSRCDIR:=/usr/src}   # Standardvorgaben die angepasst werden können.
BSDOBJDIR=${BSDOBJDIR:=/usr/obj}
ARCH=${ARCH:=i386}                 # Folgende Architekturen können unter OpenBSD
                                   # kompiliert werden:
				   #
				   # alpha
                                   # hp300
                                   # hppa
                                   # i386
                                   # m68k
                                   # mac68k
                                   # macppc
                                   # mvme68k
                                   # mvme88k
                                   # mvmeppc
                                   # powerpc
                                   # sparc
                                   # sparc64
                                   # vax
				   


case "$1" in

	        # Wenn nichts angegeben wurde, dann wird der GENERIC-Kernel gebaut.

	"")     echo "\n Es wird der GENERIC-Kernel kompiliert!\n";;
                
		# Wenn statt der Kernel-Config "help" angegeben wurde, dann diese Info

	nobuild)

	        PARAMETER2=$1;;

	noreboot) 
	         
	        PARAMETER3=$1;;
         list)  echo "\n Folgende Kernel-Config-Dateien können angegeben werden:"
                echo "------------------------------------------------------------"
                ls -la -1 $BSDSRCDIR/sys/arch/$ARCH/conf
                echo -n "\n\n SYNTAX: sh buildall.sh <KERNEL> [nobuild] [noreboot] [help]\n\n"
                exit 0;;
	      
	help) 	echo -n "\n Folgende Optionen sind möglich:\n\n"
           	echo -n "\n SYNTAX: buildall.sh [KERNEL] [nobuild] [noreboot] [help]\n\n"
         	echo -n "\n nobuild  --> nur den Kernel bauen\n"
		echo -n "\n noreboot --> nach dem Kernel bzw. Systembau nicht rebooten\n"
                 echo -n "\n list       --> Kernel-Config-Dateien auflisten\n"
         	echo -n "\n help     --> diese Hilfe-Infos anzeigen\n\n"
		echo    "Wenn nichts angegeben wurde, wird der GENERIC-Kernel und das"
		echo -n "System neu gebaut und anschließend neugebootet."
	        exit 0;;
       list)    echo "\n Folgende Kernel-Config-Dateien können angegeben werden:"
                echo "------------------------------------------------------------"
                ls -la -1 $BSDSRCDIR/sys/arch/$ARCH/conf
                echo -n "\n\n SYNTAX: sh buildall.sh <KERNEL> [nobuild] [noreboot] [help]\n\n"
                exit 0;;


	*)      PARAMETER1=$1;;
		
	esac


                # Wenn die angegebene Kernel-Config-Datei nicht existiert, wird diese
		# Fehlermeldung ausgegeben und der Inhalt des ${BSDSRCDIR}/sys/arch/${ARCH}/conf
		# aufgelistet.

	
if ! [ -a $BSDSRCDIR/sys/arch/$ARCH/conf/$PARAMETER1 ]; then
	
        	echo "\n FEHLER: Der Kernel-Config-Name existiert nicht!\n"
		
                echo "\n Folgende Kernel-Config-Dateien können angegeben werden:"
		
                echo "------------------------------------------------------------"
		
                ls -la -1 $BSDSRCDIR/sys/arch/$ARCH/conf
		
                echo -n "\n\n SYNTAX: sh buildall.sh <KERNEL> [nobuild] [noreboot] [help]\n\n"

                exit 0

fi

	
        # Wenn unter ../compile bereits ein Verzeichnis genauso wie der angegebene Kernel heißt,
	# dann wird dieses bereinigt. Wir wollen nicht mit alten Objektdateien 
	# einen neuen Kernel bauen.


if [ -d $BSDSRCDIR/sys/arch/$ARCH/compile/$PARAMETER1 ]; then
	
                echo -n "\n\n Alte Objektdateien von $PARAMETER1 werden gelöscht ..."

                cd $BSDSRCDIR/sys/arch/$ARCH/compile/$PARAMETER1

                sudo make clean > /dev/null 2>&1

                echo " erfolgreich!\n"

fi

        # Jetzt generieren wir eine neue Kernel-Konfiguration.


                echo -n "\n Die Kernel-Konfiguration $PARAMETER1 wird generiert ..."

                cd $BSDSRCDIR/sys/arch/$ARCH/conf

                sudo config $PARAMETER1 > /dev/null 2>&1 
		
		echo " erfolgreich!\n"

                cd ../compile/$PARAMETER1


	# Danach wird der neue Kernel kompiliert.	

                echo -n "\n Der neue Kernel $PARAMETER1 wird kompiliert ..."

                sudo make depend all install > /dev/null 2>&1

                echo " erfolgreich!\n"
		

	# Haben wir einen zweiten Parameter angegeben, so wird dieser ausgewertet. 	

case "$2" in
                

	# Wenn der Parameter "nobuild" heißt, wird nach dem Kernel-Bau nichts mehr gemacht.     
	
	nobuild)    echo -n "\n Der Kernel $PARAMETER1 ist bereit ..."
	

	# Wenn der dritte Parameter "noreboot" heißt, dann wird das standardmäßige Neubooten
	# nicht ausgeführt.
	            
              	case "$3" in

		noreboot) 
		     PARAMETER3=$3	
		    echo -n " bitte REBOOTEN!\n" 
		    
		    exit 0;;
		   
	       esac

	# Ansonsten wird nach 30 Sekunden Wartezeit neugebootet.
			 
                    echo -n " REBOOT in 30 Sekunden!\n"
		    
		    sleep 30
		    
		    sudo reboot
		   
		    exit 0 ;; 
	esac

        # Wir wechseln in das System-Quellcode-Verzeichnis und bereinigen den Quellbaum
	# von alten Objektdateien. 


     cd $BSDSRCDIR

     echo -n "\n Der System-Quellcodebaum wird bereinigt ..."

     sudo rm -rf $BSDOBJDIR/*

     find . -type l -name obj | sudo xargs rm 

     sudo make clean > /dev/null 2>&1

     echo " erfolgreich!\n"

     echo -n "\n Neue Objektverzeichnisse werden angelegt ..."


     # Nach der Bereinigung legen wir neue Objektverzeichnisse an.
     

     sudo make obj > /dev/null 2>&1

     echo " erfolgreich!\n"

     echo -n "\n Das System wird neu gebaut ..."


     # Und anschließend kompilieren wir das gesamte System.
     

     sudo make build > /dev/null 2>&1

     echo " erfolgreich!\n"

     echo "\n Das komplette System mit dem Kernel $PARAMETER1 ist gebaut worden ..." 


     # War unser zweiter Parameter "noreboot", wird nach dem kompletten Neukompilieren nicht
     # standardmäßig neugebootet.

  if [ $2 == "noreboot" ]; then

       echo " bitte REBOOTEN!\n"
    
       exit 0

     # Ansonsten wird die Standardvorgabe nach 30 Sekunden ausgeführt.
       
  else

       echo " NEUSTART erfolgt in 30 Sekunden!\n"

       sleep 30
       
       sudo reboot

  fi
 
Zuletzt bearbeitet:
minor nitpick noch..

"immer alles" mit sudo machen ist auch so nen ding, gerade wenn
mehrere leute in einem tree hacken und teile bauen..

dafuer gibt's eigentlich noch extra die group 'wsrc', fuer die der
tree /usr/{obj,src} passend g+w ist.

innerhalb kann man dann mit passender umask eigentlich schoen als
"plain user" arbeiten, ohne dauernd (fuer "alle") sudo offen zu haben.

den eigentlichen make build kann man dann auch als "real admin" dann
mit "SUDO=sudo make build" machen, und bsd.sys.mk benutzt dann nur
dort (vorwiegend in den make install) sudo, wo es wirklich noetig ist.

least privilege halt..

HTH, pb
 
Original geschrieben von double-p
minor nitpick noch..

"immer alles" mit sudo machen ist auch so nen ding, gerade wenn
mehrere leute in einem tree hacken und teile bauen..

dafuer gibt's eigentlich noch extra die group 'wsrc', fuer die der
tree /usr/{obj,src} passend g+w ist.

innerhalb kann man dann mit passender umask eigentlich schoen als
"plain user" arbeiten, ohne dauernd (fuer "alle") sudo offen zu haben.

den eigentlichen make build kann man dann auch als "real admin" dann
mit "SUDO=sudo make build" machen, und bsd.sys.mk benutzt dann nur
dort (vorwiegend in den make install) sudo, wo es wirklich noetig ist.

least privilege halt..

HTH, pb

Stimmt.

Da ich aber alleine auf meinem Rechner die Sources kompiliere, habe ich einfach nicht daran gedacht. Die meisten hier basteln sich wohl ihre Systeme auch alleine.

Aber, so wie von mir versprochen, baue ich die Vorschläge von dir ein. :)

Least privilege sollte man immer beachten. Auch wenn man alleine bastelt ;)

Gruß

CW
 
Zurück
Oben