Script zum Erstellen einer bootfähigen SuSE FTP DVD für die Bash! unter Linux
Leider ist das Script nicht perfekt, insbesondere das Überprüfen und Nachladen von fehlerhaft heruntergeladenen Dateien funktioniert bei mir nicht. Daher müssen bestimmte Aufrufe unten unter "Main" ggfs. auskommentiert werden. Das Herunterladen selbst und das Erstellen der ISO funktioniert aber gut. Das Script stammt aus einer Linux-Mailing-Liste. Wer kann es perfektionieren und den Code zum Überprüfen der heruntergeladeten Dateien durchsehen?
Wer die DVD lieber unter Windows erstellen möchte, der findet die Anleitung hier: ../DvdPerFtpWindows.
Wer keinen DVD-Brenner zur Hand hat, findet eine Anleitung zur Installation von der Festplatte unter ../InstallationPerFestplatte.
# # Make a bootable DVD ISO from a FTP version of SuSE Linux # # Dieses Script funktioniert noch nicht perfekt. Daher geniesst es mit Vorsicht. # Insbesondere das Überprüfen der Dateigrössen bleibt beim i586-Ordner hängen. # Deshalb kommentiert unten am Ende der Datei in der Routine "Main" bei Bedarf # den Call zur Subroutine CHECK mit einer Raute "#" aus. # Ihr müsst dieses Script als "root" ausführen, es sei denn, Ihr habt schon # Schreibrechte in /srv/ftp für Euch eingeräumt. Ebenfalls solltet Ihr die # Pfadangaben in "Programs and Paths" überprüfen, ob alle Pfadangaben richtig # sind. Momentan funktioniert dieses Script unter SuSE 8.2 gut (mit Ausnahme # der CHECK-Routine) # # Change according to your needs VER=9.0 DIR="/srv/ftp/pub/suse/i386/$VER" ISODIR="/srv/ftp/pub/cdlibrary/iso" ISO="SuSE-${VER}-ftp.iso" TMPDIR="/tmp" MD5SUM_ER_FILE="md5sumerror" LS_FILE="ls_for_dir" # Programs and paths WGETBIN=/usr/bin/wget PINGBIN=/bin/ping GREPBIN=/usr/bin/grep RMBIN=/bin/rm TOUCHBIN=/usr/bin/touch FINDBIN=/usr/bin/find PSBIN=/bin/ps PWDBIN=/bin/pwd MD5SUMBIN=/usr/bin/md5sum MKISOFSBIN=/usr/local/bin/mkisofs CUTBIN=/usr/bin/cut SLEEPBIN=/bin/sleep DOS2UNIXBIN=/usr/bin/dos2unix LSBIN=/bin/ls WCBIN=/usr/bin/wc # You shouldn't need to change anything below this SOURCE="$DIR/suse/src" OPTS="-r -J -l -D -L -V -P -p -abstract -biblio -copyright" BOOTDIR="boot/loader" BOOT="isolinux.bin" CAT="boot.cat" BOPTS="-no-emul-boot -boot-load-size 4 -boot-info-table" GRAFT="-graft-points /=$DIR" declare -i PING declare -i LOWPING declare -a LS_FILE_ARRAY declare -a LS_LEN_ARRAY #### FUNCTIONS #### # Choose Mirror PING_MIRRORS () { echo "Looking for closest mirror" LIST="ftp-linux.cc.gatech.edu mirror.mcs.anl.gov ftp.gwdg.de chuck.ucs.indiana.edu distro.ibiblio.org mirrors.usc.edu ftp.tu-ilmenau.de" let LOWPING=0 for HOST in $LIST ; do PING=`eval $PINGBIN -q -c 10 $HOST | $GREPBIN rtt | $CUTBIN -d "/" -f 5 | $CUTBIN -d"." -f 1` echo "$HOST is $PING ms away" if [ "$PING" -lt "$LOWPING" ] && [ "$PING" != "0" ] && [ "$LOWPING" != "0" ] ; then LOWPING=$PING PINGTEST=$HOST elif [ "$PING" != "0" ] && [ "$LOWPING" = "0" ] ; then LOWPING=$PING PINGTEST=$HOST fi done case $PINGTEST in mirrors.usc.edu) MIRROR="mirrors.usc.edu" MIRRORPATH="pub/linux/distributions/suse/i386/$VER" ;; distro.ibiblio.org) MIRROR="distro.ibiblio.org" MIRRORPATH="pub/Linux/distributions/suse/suse/i386/$VER" ;; ftp-linux.cc.gatech.edu) MIRROR="ftp-linux.cc.gatech.edu" MIRRORPATH="pub/suse/suse/i386/$VER" ;; mirror.mcs.anl.gov) MIRROR="mirror.mcs.anl.gov" MIRRORPATH="pub/suse/i386/$VER" ;; ftp.gwdg.de) MIRROR="ftp.gwdg.de" MIRRORPATH="pub/linux/suse/ftp.suse.com/suse/i386/$VER" ;; chuck.ucs.indiana.edu) MIRROR="chuck.ucs.indiana.edu" MIRRORPATH="linux/suse/suse/i386/$VER" ;; ftp.tu-ilmenau.de) MIRROR="ftp.tu-ilmenau.de" MIRRORPATH="/Mirrors/ftp.suse.com/i386/$VER" ;; esac # Don't get source rpms as they won't fit on the DVD anyway EXCLUDESRC="$MIRRORPATH/suse/src" # Cut the directories in MIRRORPATH for the ftp mirror of MIRROR DIRCUT=`echo ${MIRRORPATH//[A-Za-z0-9\_\.\:\\\,\-]} | $WCBIN -c` echo "" } # Test to see if the SuSE version is available TEST_DIR () { echo "Testing for $VER on $MIRROR" eval $WGETBIN -q -O - ftp://$MIRROR/$MIRRORPATH/ >/dev/null NEWTEST=$? } # Exit if the SuSE version wanted isn't available MIRROR () { if [ "$NEWTEST" = 0 ] ; then echo "OK" echo "" echo "Mirroring $MIRROR" eval $WGETBIN -cmq -nH --passive -X /$EXCLUDESRC -P $DIR --cut-dirs=${DIRCUT// } ftp://${MIRROR}/${MIRRORPATH} & PID=$! while true ; do RUNNING=`eval $PSBIN h -o pid -p $PID` if [ "${RUNNING}" ] ; then echo -en "#" eval $SLEEPBIN 5 else echo "#" echo "Download complete" echo "" break fi done else echo "$VER isn't avialable" exit 1 fi } #Verify file sizes CHECK () { for DOTLIST in `eval $FINDBIN $DIR -name "\.listing"` ; do eval $DOS2UNIXBIN -q $DOTLIST eval $LSBIN -l ${DOTLIST%.*} | $GREPBIN -v total > $TMPDIR/$LS_FILE cd ${DOTLIST%.*} NAME=${DOTLIST%.*} PATH=${NAME//$DIR} unset LS_FILE_ARRAY unset LS_LEN_ARRAY let x=0 while read x1 x2 x3 x4 LEN x5 x6 x7 FILE ; do if [ ! -d "$FILE" ] ; then LS_FILE_ARRAY["$x"]="$FILE" LS_LEN_ARRAY["$x"]="$LEN" let x++ fi done < $TMPDIR/$LS_FILE COUNT=${#LS_FILE_ARRAY[@]} if [ $COUNT -gt 0 ] ; then echo "" echo "Looking at file sizes in ${DOTLIST%.*} -- $COUNT files" fi while read x1 x2 x3 x4 LEN x5 x6 x7 FILE ; do if [ ! -d "$FILE" ] ; then if [ -e "$FILE" ] ; then let z=0 while [ $z -lt "$COUNT" ] ; do if [ "${FILE}" = "${LS_FILE_ARRAY["$z"]}" ] ; then echo -en "#" if [ "${LEN}" != "${LS_LEN_ARRAY["$z"]}" ] ; then echo "#" echo "Getting $FILE again" eval $RMBIN $FILE while true ; do eval $WGETBIN -q ftp://$MIRROR/$MIRRORPATH/$PATH/$FILE & WGETTEST=$? PID=$! while true ; do RUNNING=`eval $PSBIN h -o pid -p $PID` if [ "${RUNNING}" ] ; then echo -en "#" eval $SLEEPBIN 5 else echo "#" echo "" break fi done if [ "$WGETTEST" = 0 ] ; then echo "Continuing file check" break fi done fi fi let z++ done else echo "" echo "Getting $FILE again" while true ; do eval $WGETBIN -q ftp://$MIRROR/$MIRRORPATH/$PATH/$FILE & WGETTEST=$? PID=$! while true ; do RUNNING=`eval $PSBIN h -o pid -p $PID` if [ "${RUNNING}" ] ; then echo -en "#" eval $SLEEPBIN 5 else echo "#" echo "" break fi done if [ "$WGETTEST" = 0 ] ; then echo "Continuing file check" echo "" break fi done fi fi done < $DOTLIST #eval $RMBIN $DOTLIST cd - done } # Check MD5SUMS for rpms TEST_MD5SUMS () { if [ -e $TMPDIR/$MD5SUM_ER_FILE ] ; then eval $RMBIN $TMPDIR/$MD5SUM_ER_FILE eval $TOUCHBIN $TMPDIR/$MD5SUM_ER_FILE fi cd $DIR echo "" for MD in `eval $FINDBIN $DIR -name MD5SUMS` ; do cd ${MD%/*} echo "Checking sums in ${MD%/*}" echo ${MD%/*} >> $TMPDIR/$MD5SUM_ER_FILE eval $MD5SUMBIN -c $MD 2>/dev/null | $GREPBIN FAILED >> $TMPDIR/$MD5SUM_ER_FILE & PID=$! while true ; do RUNNING=`eval $PSBIN h -o pid -p $PID` if [ "${RUNNING}" ] ; then echo -en "#" eval $SLEEPBIN 5 else echo "#" echo "" break fi done done cd - } # Fix md5sum errors FIX () { CURRENT_DIR=`eval $PWDBIN` while read NAME STAT ; do if [ -d ${NAME} ] ; then cd $NAME PATH=${NAME//$DIR} elif [ "$STAT" = "FAILED" ] ; then echo "" echo "Getting ${NAME//:} again" eval $RMBIN ${NAME//:} while true ; do eval $WGETBIN -q ftp://$MIRROR/$MIRRORPATH/$PATH/${NAME//:} & WGETTEST=$? PID=$! while true ; do RUNNING=`eval $PSBIN h -o pid -p $PID` if [ "${RUNNING}" ] ; then echo -en "#" eval $SLEEPBIN 5 else echo "#" echo "" break fi done if [ "$WGETTEST" = 0 ] ; then break fi done fi done < $TMPDIR/$MD5SUM_ER_FILE cd $CURRENT_DIR } # Make the DVD iso or exit if it already exist ISO () { if [ ! -e ${ISODIR}/${ISO} ] ; then eval $MKISOFSBIN $OPTS \ -x $SOURCE \ -o ${ISODIR}/${ISO} \ -b ${BOOTDIR}/${BOOT} \ -c ${BOOTDIR}/${CAT} \ $BOPTS \ $GRAFT else echo ${ISODIR}/${ISO} exists fi } #### MAIN #### clear PING_MIRRORS TEST_DIR MIRROR CHECK echo "" eval $RMBIN $TMPDIR/$LS_FILE while true ; do TEST_MD5SUMS MD5SUMTEST=`$GREPBIN "FAILED" $TMPDIR/$MD5SUM_ER_FILE` if [ ${#MD5SUMTEST} -gt 0 ] ; then echo "There were problems with the md5sums. Some files will be downloaded again." FIX echo "" echo "Testing md5sums again" echo "" else eval $RMBIN $TMPDIR/$MD5SUM_ER_FILE break fi done ISO exit 0