#!/bin/ash # mkcdiso Macht ein CD/DVD .iso -Image einer Linux-Installation und dieses Programmpaketes zur Re-Installation # ( SYS_Linux ) # Vor Anwendung muss das Install-System als initrd gepackt werden # # Von innerhalb Ordner /NAME-VERSION zBsp /SYS_Linux-0.23+ aus starten # der Inhalt des .iso -Images enthaelt RESIZEART=1 # resize mit resize2fs -M und hinterher Groesse ermitteln # RESIZEART=2 # resize mit vorher ermittelter Groesse: = Daten * 1.025 LEER=300 # MB leerer Platz auf Partition, mit 0 gefuellt, kompaktiert klein NACH=/dev/hda1 # Wo .iso hingeschrieben wird, meist / , wird nach /tmp gemountet PARTITION=/dev/hda1 # Hier hinschreiben welche Partition das zu rettende System enthaelt # Darf nicht Ziel sein wo .ext3 , .iso hingeschrieben werden # lzma kommt immer in PWD #VON1=zzz # Ordner in CD wo .lzma -Datei ist. zzz falls sie am Ende geschrieben werden soll. Achtung: VON1="." # dann Groesse auch mit ISO9660-level 3,4 max. 4 GB /bin/setterm -powersave off -blank 0 # auf Konsole schicken, nicht umleiten mv -f logfile ../logfile > /dev/zero 2>&1 PWDINIT=`pwd` ; NV=${PWDINIT##*/} ; NAME=${NV%%-[0,1-9]*} ; VERSION=${NV#$NAME-} >> logfile 2>&1 # Von wo aus gestartet wurde, in Name und Version spalten echo " Name: " $NAME " Version: " $VERSION >> logfile 2>&1 # Beispiel: NAME=SYS_Linux VERSION=0.20-rc3 #fdisk -l | grep "/dev/" | grep "Linux" > scr #dialog --title "partitions" --no-collapse --colors --textbox scr 0 0 for J in sda hda sdb hdb sdc hdc sdd hdd ; do ls /dev/$J > /dev/zero 2>&1; if test $? = 0 ; then # nur wenn Geraet ueberhaupt da; unklar ob sicher ohne udevd / in initrd, ggf. weg for I in 1 2 3 4 5 ; do ls /dev/$J$I > /dev/zero 2>&1 ; if test $? = 0 ; then mkdir -p /$J$I > /dev/zero 2>&1 mount /dev$J$I $J$I > /dev/zero 2>&1 ; sleep 1 ; df /dev$J$I > /dev/zero 2>&1 if test $? != 0 ; then rm -f $J$I > /dev/zero 2>&1; fi ; fi ; done fi ; done df -h > scr echo -e "\a" dialog --title "partitions" --no-collapse --colors --textbox scr 0 0 dialog --title "output partition .." --no-collapse --colors --inputbox " \Z1 A qual particao escrever ? Auf welche Partition schreiben ? \Zn ( > 30 GB : .ext3 , .ext3.lzma , .iso ) " 0 0 $NACH 2> scr read NACH REST < scr umount /nach >> logfile 2>&1 mkdir -p /nach >> logfile 2>&1 mount $NACH /nach if test $? != 0 ; then dialog --title "output partition can not be mounted .." --no-collapse --colors --infobox " \Z1 Particao de destino nao pode ser montada Ziel-Partition kann nicht gemounted werden \Zn " 7 54 exit fi ; if test $VON1 != "." ; then cd $VON1 ; fi ; #### # 1. Ob Partition der Linux-Installation schon als kompaktierte Datei vorhanden und in diesen Ordner kopiert ? ls -l $NAME.ext3.lzma > scr 2>&1 ; KOMPAKTIEREN=$? #grep "$NAME.ext3.lzma" scr # .lrz .lzma .bz2 # 2. Partition noch nicht als kompakte Datei da, machen # if test -r SYS_Linux.ext3.lzma -ne 0 ; then # ... dieser shit geht nicht if test $KOMPAKTIEREN -ne 0 ; then dialog --title "no compacted system .." --no-collapse --colors --infobox " \Z1 Nao tem nenhum Es gibt keine Arquivo Datei \Zn \Z4 $NAME.ext3.lzma \Zn " 8 40 sleep 5 #sleep 20 # 2.1. Abfragen welche Partition als Install-CD/DVD gerettet werden soll # dialog --inputbox " $ All this shit no working #Nao tem arquivo compactado da instalacao. #A instalacao esta em qual particao ? #( ex: /dev/hda1 ) # = nao fazer, neste caso deve #estar presente uma imagem nao-compactada #" 20 60 > partition #cat partition #read PARTITION REST < partition # 2.2. benutzter Anteil FSSIZE des Platzes FSSIZE0 der Partition abfragen ### if test $PARTITION != " " ; then mkdir -p /von >> logfile 2>&1 echo -e "\a" dialog --title "source partition .." --no-collapse --colors --inputbox " \Z1 Qual particao p/ compactar Welche Partition archivieren \Zn " 0 0 $PARTITION 2> scr read PARTITION REST < scr umount $PARTITION >> logfile 2>&1 if test $? != 0 ; then dialog --title "partition in use .." --no-collapse --colors --infobox " \Z1 Particao nao pode ser desmontada Partition kann nicht freigegeben werden \Zn " 7 44 exit fi ; mount $PARTITION /von if test $? != 0 ; then dialog --title "partition can not be mounted .." --no-collapse --colors --infobox " \Z1 Particao nao pode ser montada Partition kann nicht gemounted werden \Zn " 7 42 exit fi ; init 2 #; sleep 2 # text-Modus, da lzma viel Speicher braucht dialog --title "source partition .." --no-collapse --colors --infobox " \Z1 COMPACTAR KOMPRIMIEREN A PARTICAO DER PARTITION \Zn \Z4 $PARTITION \Zn " 8 40 sleep 5 tune2fs -m 0 $PARTITION >> logfile 2>&1 # damit Groesse korrekt und kein unnĂtiger admin-space # leere Datei erzeugen, gepackt sehr klein, sodass ungepackt freier Platz # vhd ist falls bei der Installation resize nicht geht df $PARTITION >> logfile 2>&1 echo " leere Datei mit " $LEER " MB Groesse erzeugen: " >> logfile 2>&1 ( dd if=/dev/zero of=/von/leer bs=1M count=$LEER >> logfile 2>&1 ) df $PARTITION >> logfile 2>&1 sync umount /von >> logfile 2>&1 if test $RESIZEART = 1 ; then echo " *** Resize auf minimate Groesse" >> logfile 2>&1 umount -f $PARTITION >> logfile 2>&1 dialog --title " fsck" --no-collapse --colors --infobox " ..." 0 0 sleep 2 ; clear e2fsck -f $PARTITION dialog --title "minimalize partition .." --no-collapse --colors --infobox " \Z1 Redimensionar particao para tamanho minimo ... Partition zu kleinster Groesse verkleinern ... \Zn " 7 54 sleep 2 ; clear touch rs ( while [ -e rs ] ; do dialog --title "resizing .." --no-collapse --colors --infobox "`cat rs | sed 's/-//g' | sed 's///g'`" 0 0 2>> logfile sleep 30 done ) & ( resize2fs -FfMp $PARTITION > rs 2>&1 ) >> logfile 2>&1 # resizen auf min. Wert cat rs >> logfile ; rm rs resize2fs -FP $PARTITION " Bloecke = 4 Sektoren" >> logfile 2>&1 echo " *** resize auf min. Groesse fertig" >> logfile 2>&1 fi ; mount $PARTITION /von >> logfile 2>&1 df $PARTITION > scr # Groesse muss MIT leer ermittelt wd #rm -f /von/leer >> logfile 2>&1 # unten umount /von >> logfile 2>&1 echo "df $PARTITION : " >> logfile 2>&1 cat scr >> logfile 2>&1 # Groesse in K hier ausgegeben , mit 1.024 mult. gibt in k unten benoetigt #sleep 20 grep $PARTITION scr > scr0 # eigentlich nicht noetig ... echo " *** Daten auf der Partition " >> logfile 2>&1 cat scr0 >> logfile 2>&1 read UNW1 FSSIZE0 FSSIZE REST < scr0 >> logfile 2>&1 # FSSize0 jetzige, FSSize nötige/belegte Groesse Dateien in $PARTITION FSSIZE1=$(($FSSIZE + $FSSIZE / 40 )) >> logfile 2>&1 # *1.024 K->k , sicherheitshalber etwas grĂsser machen echo " *** Sicherheitshalber gewaehlte Groesse: " $FSSIZE1 "k = Daten * 1.025 " >> logfile 2>&1 #sleep 20 if test $RESIZEART = 2 ; then echo " *** Resize auf Daten * 1.025 " umount -f $PARTITION >> logfile 2>&1 # 2.3. GrĂsse Datei-System auf benutzten Anteil FSSIZE (+Sicherheit) verringern #dialog --title " fsck" --no-collapse --colors --infobox " ..." 0 0 sleep 2 ; clear e2fsck -f $PARTITION #echo " Nur verkleinern, nicht vergrössern. Blegt: " $FSSIZE " .. mal 1.05 : " $FSSIZE1 " Groesse momentan: " $FSSIZE0 #echo $(($FSSIZE0 - $FSSIZE)) # focking bash dont work correctly, incl. the following condition dont work #test $(($FSSIZE0 - $FSSIZE)) -gt 0 ; if test $? -gt 0 ; then echo "***" ; resize2fs -f $PARTITION "$FSSIZE1"k ; echo "*** 2" ; FSSIZE0=$FSSIZE1 ; fi ; FSSIZE2=$(( $FSSIZE1 * 2 )) #clear # geht nach vorigem resize schnell, normalerweise kein Fehler etc resize2fs -Ff $PARTITION "$FSSIZE2"s >> logfile 2>&1 echo " *** Resize auf Daten * 1.025 fertig: " "$FSSIZE1" "k" >> logfile 2>&1 fi ; sync mount $PARTITION /von >> logfile 2>&1 rm -f /von/leer >> logfile 2>&1 # /leer loeschen, dann unkompaktiert LEER freier Platz vhd, kompaktiert ist /leer sehr klein echo " Nach /leer loeschen: " >> logfile 2>&1 df >> logfile 2>&1 ; ls -l /von >> logfile 2>&1 umount /von >> logfile 2>&1 echo "resize fertig, e2fsck beginnt" >> logfile 2>&1 dialog --title " fsck" --no-collapse --colors --infobox " ..." 0 0 sleep 2 ; clear e2fsck -f $PARTITION # zur Vermeidung von Problemen echo "e2fsck fertig" >> logfile 2>&1 echo "resize fertig, Partition wird nun in die Datei " $NAME.ext3 " kopiert" >> logfile 2>&1 # 2.4. Dateisystem woanders hin kopieren (stattdessen die Partition verkleinern, wĂrde reboot erfordern) EXT3SIZE=19000000 # in k touch /nach/$NAME.ext3 # damit keine Fehlermeldung solange Datei nicht da ( SIZE=0 ; SIZE0=-1 ; PROZENT=0 while test $SIZE -ne $SIZE0 ; do #if test $SIZE -ne $SIZE0 ; then echo $PROZENT #fi ; sleep 60 ls -1 -s -k /nach/$NAME.ext3 > scr SIZE0=$SIZE read SIZE REST < scr if test $SIZE = "" ; then SIZE=0 ; fi ; PROZENT=$(( $SIZE * 100 / $EXT3SIZE )) if test $PROZENT -gt 100 ; then PROZENT=100 ; fi ; done ) | dialog --title " copy minimalized system .. " --no-collapse --colors --gauge " \Z1 Copiar sistema minimalizado num arquivo ... Minimalisiertes System in Datei kopieren ...\Zn " 10 53 0 & echo " vor dd" >> logfile 2>&1 FSSIZE1=$(( $FSSIZE1 + 16 )) >> logfile 2>&1 # machen wir die Partition / Kopie 16k groesser als das Dateisystem echo " *** verkleinerte Partition kopieren: " "$FSSIZE1" "k" >> logfile 2>&1 dd if=$PARTITION of=/nach/$NAME.ext3 bs=1k count=$FSSIZE1 conv=noerror >> logfile 2>&1 #echo $(($FSSIZE1 * 2)) " Sektoren " > /nach/$NAME.ext3.size # Problem: lesen vor mounten ls -l /nach/$NAME.ext3 >> logfile 2>&1 echo " dd fertig" >> logfile 2>&1 sync ### fi ; killall -HUP sleep ; reset # damit kein Muell auf den screen kommt echo "Kopieren fertig, e2fsck beginnt" >> logfile 2>&1 dialog --title " fsck" --no-collapse --colors --infobox " ..." 0 0 sleep 2 ; clear e2fsck -f /nach/$NAME.ext3 # zur Vermeidung von Problemen echo "e2fsck fertig" >> logfile 2>&1 echo " md5 berechnen ..." >> logfile 2>&1 dialog --title " md5" --no-collapse --colors --infobox " ..." 0 0 cd /nach # wir wollen keine absoluten Datei-Namen im .md5 md5sum $NAME.ext3 > $NAME.ext3.md5 ls -l $NAME.ext3 >> $NAME.ext3.md5 cd - mv /nach/$NAME.ext3.md5 . # 2.6 AufrĂumen dialog --title "resize partition .." --no-collapse --colors --infobox " \Z1 Redimensionar particao para tamanho maximo ... Partition zu normaler Groesse erweitern ... \Zn " 7 54 #clear resize2fs -Ff $PARTITION >> logfile 2>&1 # Nach dem Packen, Installierung wieder an Grösse der Partitin anpassenn echo " resize fertig" >> logfile 2>&1 # 3. kompaktieren #bzip2 -9 -fc /nach/$NAME.ext3 > $NAME.ext3.bz2 # gross und lahm #lrzip -w 2 -L 9 /nach/$NAME.ext3 # kompaktiert zu 1/ 4.2 , mit -M Absturz Problem mit irgendwelchen streams in rzip_fd LZMASIZE=4400000 # in k touch /nach/$NAME.ext3.lzma # damit keine Fehlermeldung solange Datei nicht da ( SIZE=0 ; SIZE0=-1 ; PROZENT=0 while test $SIZE -ne $SIZE0 ; do #if test $SIZE -ne $SIZE0 ; then echo $PROZENT #fi ; sleep 800 # 1 Prozent dauert typischerweise 5 - 20 Min. ls -1 -s -k /nach/$NAME.ext3.lzma > scr SIZE0=$SIZE read SIZE REST < scr if test $SIZE = "" ; then SIZE=0 ; fi ; PROZENT=$(( $SIZE * 100 / $LZMASIZE )) if test $PROZENT -gt 100 ; then PROZENT=100 ; fi ; done ) | dialog --title " compact system ..." --no-collapse --colors --gauge " fazer $PWD/$NAME.ext3.lzma ... (observavel um outro terminal) $PWD/$NAME.ext3.lzma machen ... (in anderem Terminal beobachtbar) ( ca. 0.5 - 3 hs / GB ) " 15 0 0 & lzma -8 -kf /nach/$NAME.ext3 >> logfile 2>&1 # knapp 1% grĂsser als lrzip -w 2 -L 9 , aber schneller und lzmacat ist in busybox vhd #lrzip -l -o /nach/$NAME.ext3.lrz /nach/$NAME.ext3 # kompaktiert 30x schneller als lzma , 1.5 x so gross sleep 10 # um lzma korrekt abzuschliessen killall -HUP sleep ; reset # damit kein Muell auf den screen kommt # Bescheuerterweise bei lzma keine Ausgabedatei angebbar ... mv /nach/$NAME.ext3.lzma . >> logfile 2>&1 # nur relevant falls /nach -ne / echo " lzma fertig, md5 berechnen ..." >> logfile 2>&1 dialog --title " md5" --no-collapse --colors --infobox " ..." 0 0 cd /nach/ md5sum $NAME.ext3.lzma > $NAME.ext3.lzma.md5 ls -l $NAME.ext3.lzma >> $NAME.ext3.lzma.md5 cd - mv /nach/$NAME.ext3.lzma.md5 . #mv /nach/$NAME.ext3 /nach >> logfile 2>&1 # oder loeschen, kann nicht hier bleiben da es sonst auf das CD kaeme fi ; # KOMPAKTIEREN -ne 0 sync echo " iso machen ..." >> logfile 2>&1 dialog --title "make iso .." --no-collapse --colors --infobox " \Z1 Fazer o .iso ... .iso machen ... \Zn " 7 23 sleep 3 if test $VON1 != "." ; then cd .. ; fi ; #### rm scr* >> logfile 2>&1 # 4. CD/DVD .iso erzeugen # normalerweise bis 4482 MB , ab 4096 MB Probleme mit mkisofs daher genisoimage verwendet CDISO="$NV.iso" # nicht auf der zu kopierenden Partition selbst, oder mit -x ausnehmen rm /nach/$CDISO >> logfile 2>&1 # Man kann /boot/initrd ausnehmen da in der initrd gepackt : -x ./boot/initrd \ cp -f ./boot/initrd/installiso . >> logfile 2>&1 mv ../initrd ../initrd.old >> logfile 2>&1 ; mv ./boot/initrd .. >> logfile 2>&1 mv ./logfile .. ISOSIZE=4550000 # in k touch /nach/$CDISO # damit keine Fehlermeldung solange Datei nicht da ( SIZE=0 ; SIZE0=-1 ; PROZENT=0 while test $SIZE -ne $SIZE0 ; do #if test $SIZE -ne $SIZE0 ; then echo $PROZENT #fi ; sleep 20 ls -1 -s -k /nach/$CDISO > ../scr SIZE0=$SIZE read SIZE REST < ../scr if test $SIZE = "" ; then SIZE=0 ; fi ; PROZENT=$(( $SIZE * 100 / $ISOSIZE )) if test $PROZENT -gt 100 ; then PROZENT=100 ; fi ; done ) | dialog --title " make .iso ..." --no-collapse --colors --gauge " fazer $CDISO ... $CDISO machen ... " 10 42 0 & MKISO=1 # mkisofs geht nicht bei > 4 GB , erzeugt unbrauchbare .iso s if test $MKISO = 1 ; then genisoimage -o /nach/$CDISO \ -r -J -A "$NV" \ -hide-rr-moved \ -v -d -N \ -no-emul-boot -iso-level 4 -boot-load-size 4 -boot-info-table \ -allow-lowercase -allow-multidot -allow-limited-size \ -udf \ -b boot/isolinux/isolinux.bin \ -c boot/isolinux/isolinux.boot \ -V "$NV-DVD" . >> ../logfile 2>&1 fi ; if test $MKISO = 2 ; then mkisofs -o /nach/$CDISO \ -r -J -A "$NV" \ -hide-rr-moved \ -v -d -N \ -no-emul-boot -iso-level 4 -boot-load-size 4 -boot-info-table \ -allow-lowercase -allow-multidot \ -UDF \ -b boot/isolinux/isolinux.bin \ -c boot/isolinux/isolinux.boot \ -V "$NV-DVD" . >> ../logfile 2>&1 fi ; #growisofs -overburn -Z /dev/hdb=/nach/$CDISO & # ueberbrennen geht nicht sync echo " iso fertig " >> logfile 2>&1 sleep 20 ; killall -HUP sleep > /dev/zero 2>&1 ; reset # damit kein Muell auf den screen kommt mv ../initrd ./boot ; mv ../logfile . rm -f ../scr installiso >> logfile 2>&1 ls -l /nach/$CDISO >> logfile 2>&1 # Falls von hier aus direkt installiert werden soll (ohne Umkopieren), erwartet der Installer ein SYS_Linux.iso # Falls das gerade erzeugte .iso eine Versions-Nr hat, machen wir einen link, und verschieben ein ggf. vhd SYS_Linux.iso nach .old ( cd /nach ; if test $CDISO != SYS_Linux.iso ; then mv -f SYS_Linux.iso SYS_Linux.iso.old ; ln -s $CDISO SYS_Linux.iso ; fi ; cd - ) >> logfile 2>&1 mkdir -p /var/log >> logfile 2>&1 ; cp -f logfile /var/log/logfile.mkcdiso >> logfile 2>&1 #cd .. echo " iso.md5 im Hintergrund berechnen ..." >> logfile 2>&1 ( cd /nach ; md5sum $CDISO > $CDISO.md5 ; cd - ; umount /nach ) & clear echo -e "\a" exit