#!/bin/ash # Sucht GERÄTE - nicht PARTITIONEN - VON wovon gelesen und NACH0 wohin installiert wird # läßt VON gemountet nach /von echo " Anfang mkdevs " read TST SIZE NACH0 NACH VON KLEINER OLDSYS WINDOWS REST < installinfo echo " mkdev Anfang: TST SIZE NACH0 NACH VON KLEINER OLDSYS WINDOWS: " echo $TST $SIZE $NACH0 $NACH $VON $KLEINER $OLDSYS $WINDOWS # 2. Geraete # 2.1. Bestandsaufnahme echo -e "\c" > devices echo "***" ; echo "*** Von linux gefundene Geraete: " ; echo "***" # geht scheinbar nur mit udevd :( echo "/dev/disk/by-id :" ls -l /dev/disk/by-id/* echo "/dev/disk/by-path :" ls -l /dev/disk/by-path/* echo "/dev/disk/by-uuid :" ls -l /dev/disk/by-uuid/* echo "/dev/input/by-path :" ls -l /dev/input/by-path/* echo "/dev/cd , /dev/dvd :" ls -l /dev/cd* ls -l /dev/dvd* echo "/dev/fb :" ls -l /dev/fb # Geraete-Bezeichnungen ohne /dev ( cd /dev ; ls -1L disk/by-path/* > devices ; cd - ; mv /dev/devices . ) grep "part" devices > partitions0 grep -v "part" devices > devices0 echo "Geraete: " cat devices0 echo "Partitionen: " cat partitions0 # Zur Sicherheit werden diese Geraetebezeichnungen hilfsweise verwendet wenn aus irgendwelchen komischen Gruenden # die normalen nicht vhd sind. Hauptsaechlich fuer Install-DVD und Festplatte noetig um sie anschliessend zu mounten DEV1="" ; DEV2="" ; DEV3="" ; DEV4="" ( read DEV1 REST ; read DEV2 REST ; read DEV3 REST ; read DEV4 REST echo $DEV1 $DEV2 $DEV3 $DEV4 > devs ) < devices0 read DEV1 DEV2 DEV3 DEV4 REST < devs echo " Geraete: " $DEV1 $DEV2 $DEV3 $DEV4 # Partitionen nicht so wichtig PART1="" ; PART2="" ; PART3="" ; PART4="" ; PART5="" ; PART6="" ; PART7="" ; PART8="" ( read PART1 REST ; read PART2 REST ; read PART3 REST ; read PART4 REST read PART5 REST ; read PART6 REST ; read PART7 REST ; read PART8 REST echo $PART1 $PART2 $PART3 $PART4 $PART5 $PART6 $PART7 $PART8 > parts ) < partitions0 read PART1 PART2 PART3 PART4 PART5 PART6 PART7 PART8 REST < parts echo " Partitionen: " $PART1 $PART2 $PART3 $PART4 $PART5 $PART6 $PART7 $PART8 echo "***" ; echo "*** in /proc/partitions gefundene Geraete: " ; echo "***" cat /proc/partitions # Statt uns auf /proc , /sys , /dev zu verlassen, sie von dort kompliziert aus- und einzulesen # - und wenn sie dann gebraucht werden geht das mounten doch nicht - suchen wir die # /hda , /sda unten einfach durch Probieren ab ob sie de facto da und mountbar sind, read PARTITIONEN < parts ; echo $PARTITIONEN > partitionen # erste Vorbesetzung echo -e "\c" > devices echo "***" ; echo "*** Test Geraete mit hdparm = Festplatten, CDs: " ; echo "***" FESTPLATTEN="" ; USBKEYS="" ; CDS="" ; LEEREGERAETE="" SIZEG=18 ; UNPARTMAXG=-1 ; FREIMAXG=-1 ; NTARGETS=0 ; TARGETS="" # potentielle Installgeraete groesser als SIZEG, max. unpartionierter Platz, Anzahl ###dmesg > dmesg0 # oder unten hdparm , besser #for I0 in a b c d ; do # spaeter noch vorsehen DVD auf /dev/sr0 usw #for J0 in hd sd ; do #DEVICE0=$J0$I0 ; for DEVICE0 in hda hdb hdc hdd sda sdb sdc sdd uba ubb ubc ubd sr0 sr1 sr2 sr3 $DEV1 $DEV2 $DEV3 $DEV4 ; do # hda vor sda lassen damit IDE-Geraete VOR usb-keys gefunden werden DEVICE=/dev/$DEVICE0 ; AUSGABE=0 echo "** Test Aufruf von: " $DEVICE " : **" hdparm -I $DEVICE > devices0 # oder oben dmesg ###IFDMESG=0 ; grep $DEVICE0 dmesg0 > devices0 ; if test $? -eq 0 ; then IFDMESG=HD ; fi ; # falls device unter dmesg gefunden ### grep "LBA" devices0 ; if test $? -eq 0 ; then IFDMESG=HD ; fi ; # alternativ falls hdparm statt dmesg verwendet ### grep "DVD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ; ### grep "CD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ; IFDMESG=0 ; grep "LBA" devices0 ; if test $? -eq 0 ; then IFDMESG=HD ; fi ; grep "DVD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ; grep "CD" devices0 ; if test $? -eq 0 ; then IFDMESG=CD ; fi ; DEVSIZE=0 ; /sbin/fdisk -s $DEVICE ; if test $? -eq 0 ; then /sbin/fdisk -s -u $DEVICE > scr0 ; read DEVSIZE REST < scr0 if test $DEVSIZE -gt 0 ; then echo " " ; else DEVSIZE=0 ; fi ; fi ; if test $IFDMESG != 0 ; then AUSGABE=1 ; fi ; if test $DEVSIZE -gt 0 ; then AUSGABE=1 ; fi ; # Geraet in Datei aller Geraete devices , der Festplatten hds , der CD-Geraete cds , der USB-Geraete usbs eintragen # TARGETS potentielle Zielgeraete: Festplatten oder USB-keys. Name, Groesse, unpart in G , wird in init im Dialog benutzt if test $AUSGABE = 1 ; then DEVSIZEG=$(($DEVSIZE / 976000)) ; DEVSIZE=$(($DEVSIZE * 2)) echo $DEVICE $IFDMESG $DEVSIZE $DEVSIZEG"G .GT. " $SIZEG"G" ; echo $DEVICE $IFDMESG $DEVSIZE >> devices if test $DEVSIZE -gt 0 ; then if test $IFDMESG = CD ; then CDS=$CDS" "$DEVICE0" " ; fi ; if test $IFDMESG != CD ; then if test $IFDMESG = HD ; then FESTPLATTEN=$FESTPLATTEN" "$DEVICE0" " ; fi ; if test $IFDMESG = 0 ; then USBKEYS=$USBKEYS" "$DEVICE0" " ; fi ; if test $DEVSIZEG -gt $SIZEG ; then # zur Installation geeignet SP=0 ; SV=0 # Groesse und belegter Platz der Partitionen abfragen (falls unmountbar, Groesse nehmen, daher unformatierte Part. vorher loeschen) , # SP partitioniert. SV voll. Werte von df um 1/42 erhoehen for J in 1 2 3 4 ; do PS=0 ; /sbin/fdisk -s -u $DEVICE$J > scr0 ; read PS REST < scr0 # ; echo " PS: " $PS if test $PS -gt 0 ; then SP=$(($SP + $PS)) PV=PS ; mkdir -p /$DEVICE0$J ; mount $DEVICE$J /$DEVICE0$J ; IFMOUNT=$? if test $IFMOUNT = 0 ; then df $DEVICE$J > scr ; grep $DEVICE$J scr > scr0 ; read UNW UNW1 PV REST < scr0 ; umount /$DEVICE0$J ; fi ; if test $IFMOUNT != 0 ; then rmdir /$DEVICE0$J ; fi ; # kann man auch da lassen. Evtl IFMOUNT = 32. PV0=$(($PV / 64)) ; PV=$(($PV + $PV0)) ; SV=$(($SV + $PV)) ; fi ; # PS -gt 0 echo " Partition " $DEVICE$J "IFMOUNT: " $IFMOUNT " Groesse: " $PS " voll: " $PV " , Geraet Groesse: " $SP " , voll: " $SV " (in k)" done SPG=$(($SP / 976000)) ; UNPARTG=$(($DEVSIZEG - $SPG)) # ; UNPART=$(($UNPART * 2)) # nicht-partitionierter freier Platz echo " partioniert SPG: " $SPG " unpart. UNPARTG: " $UNPARTG "G" SVG=$(($SV / 976000)) ; FREIG=$(($DEVSIZEG - $SVG)) echo " voll SVG: " $SVG " frei FREIG: " $FREIG "G" if test $UNPARTG -gt $UNPARTMAXG ; then NACH0P=$DEVICE ; UNPARTMAXG=$UNPARTG ; fi ; if test $FREIG -gt $FREIMAXG ; then NACH0V=$DEVICE ; FREIMAXG=$FREIG ; fi ; TARGETS=$TARGETS" "$DEVICE" \" "$DEVSIZEG" G ...... "$UNPARTG" G ....... "$FREIG" G \" " ; NTARGETS=$(($NTARGETS + 1)) echo "als Install-Geraet getestet: " $DEVICE " , Groesse: " $DEVSIZEG " G , unpartitioniert: " $UNPARTG " G , frei: " $FREIG " G" echo " jetzt beste Kandidaten: NACH0P : " $NACH0P " , unpart. frei: " $UNPARTMAXG " G" "NACH0V : " $NACH0V " , insg. frei: " $FREIMAXG " G" fi ; # DEVSIZEG -gt SIZEG fi ; # IFDMESG -ne CD fi ; # DEVSIZE -gt 0 if test $DEVSIZE -le 0 ; then LEEREGERAETE=$LEEREGERAETE" "$DEVICE0" " ; fi ; fi ; # AUSGABE = 1 #done done NACH0=$NACH0P ; if test $UNPARTMAXG -lt $SIZEG ; then NACH0=$NACH0V ; fi ; # Geraet mit meistem Platz ohne / mit Redimensionieren echo "***" ; echo "*** GEFUNDENE GERAETE = Festplatten / USB-keys , CDs: " ; echo "***" echo "*** Angabe sowohl als /dev/sda,hda als auch als path, daher jede device doppelt: " cat devices echo $FESTPLATTEN >> festplatten ; echo $USBKEYS >> usbkeys ; echo $CDS >> cds ; echo $LEEREGERAETE >> leeregeraete echo "*** davon Festplatten : " $FESTPLATTEN ; echo "*** davon USB-Geraete : " $USBKEYS ; echo "*** davon CDs : " $CDS echo "*** leere Geraete, zBsp CD-Leser ohne CD drin : " $LEEREGERAETE ; echo "***" echo "***** empfohlenes Geraet fuer eine Installation : " $NACH0 # 2.2. Bewertung (was wir davon als Install-CD und als Ziel-Festplatte nehmen) # Mindestens irgendein DVD-Drive finden, um copysys fuer /dev/cdrom benutzen grep "CD" devices > scr0 read DEVCDROM REST < scr0 if test $? -eq 0 ; then DEVCDROM=$DEVCDROM ; echo $DEVCDROM > devcdrom ; else DEVCDROM=- ; fi ; # 2.2.1 Install-Quelle : DVD oder Datei SYS_Linux.iso auf einer Partition echo "***" ; echo "*** Install-CDs " ; echo "***" # Hier /von mounten und gemountet lassen VON=- echo " 1. DVD-Suche: CD-Geraete mit Groesse -gt 0" grep -v " 0" scr0 > scr1 echo " CD-Devices mit eingelegtem CD: erste wird als Install-Quelle benutzt " ; cat scr1 read VON UNW SIZE00 REST < scr1 # erstes CD mit Groesse .ne. 0 als Install-CD VON angesehen. SIZE immer 4.7 GB, nicht verwenden if test $? -eq 0 ; then VON=$VON ; else VON=- ; fi ; # Weil in Linux alles so bescheuert ist ... hier waere 'continue' gut if test $VON != - ; then umount $VON ; mount $VON /von -t udf -o ro,unhide ; fi ; echo " 1. DVD-Suche beendet , 2.2.1 , VON = " $VON # 2.2.1.1 Nochmal sorgfältig suchen ob irgendwo ein DVD vhd ... echo " 2. DVD-Suche: eingelegte DVDs suchen" if test $VON = - ; then for I0 in hda hdb hdc hdd sda sdb sdc sdd uba ubb ubc ubd sr0 sr1 sr2 sr3 $DEV1 $DEV2 $DEV3 $DEV4 ; do if test $VON = - ; then # damit nichts anderes mehr gemountet wird nachdem CD gefunden # test /dev/$I0 = $NACH0 ; if test $? -ne 0 ; then umount /dev/$I0 ; mount /dev/$I0 /von -t udf -o ro,unhide ; if test $? -eq 0 ; then VON=/dev/$I0 ; fi ; echo " getestet: /dev/"$I0 " VON = " $VON # fi ; fi ; done echo " 2. DVD-Suche beendet , 2.2.1.1 , VON = " $VON fi ; if test $VON != - ; then ls /von/SYS_Linux.ext3.lzma ; if test $? -ne 0 ; then echo "DVD gefunden in " $VON " ist kein SYS-Install-DVD. " ; umount /von ; VON=- ; fi ; fi ; if test $VON != - ; then DEVCDROM=$VON ; fi ; echo $DEVCDROM > devcdrom # falls VON ein Install-DVD ist, sein Geraet spaeter als /dev/cdrom definieren echo $DEVCDROM " wird im installierten System als /dev/cdrom , /dev/dvd definiert" rm -f /dev/dvd ; rm -f /dev/cdrom ; ln -s $DEVCDROM /dev/dvd ; ln -s $DEVCDROM /dev/cdrom echo " ... und auch jetzt schon hier im Install/Rescue System" ; ls -l /dev/cdrom ; ls -l /dev/dvd # 2.2.1.2 Suchen ob eine Datei SYS_Linux.iso auf einer Partition vhd (nachrangig nach ggf. eingelegtem DVD) if test $VON = - ; then echo "***" ; echo "*** Install-.iso-Datei suchen: " ; echo "***" for J0 in 1 2 3 4 ; do for I0 in sda hda sdb hdb sdc hdc sdd hdd uba ubb ubc ubd $DEV1 $DEV2 $DEV3 $DEV4 ; do # sr0 sr1 sr2 sr3 # hier kann ruhig vorrangig auf sda also usb-keys vor hda gesucht werden if test $VON = - ; then # damit nichts anderes mehr gemountet wird nachdem .iso gefunden mkdir /$I0$J0 ; /bin/mount /dev/$I0$J0 /$I0$J0 # Nur in initrd noetig, außerhalb Partition mit .iso als gemountet angesehen umount /von ; mount /$I0$J0/SYS_Linux.iso /von -t udf -o ro,unhide,loop if test $? -eq 0 ; then VON=/$I0$J0/SYS_Linux.iso ; fi ; if test $VON = - ; then rmdir /$I0$J0 ; fi ; echo " getestet: /dev/"$I0$J0 " VON = " $VON fi ; done ; done if test $VON != - ; then echo " Datei SYS_Linux gefunden, VON = " $VON " , als /von gemountet " ; fi ; echo " Datei SYS_Linux.iso -Suche beendet , 2.2.1, VON = " $VON fi ; if test $VON = - ; then echo " Install-CD nicht da. Abbruch Installation, -> Rescue" ; echo "12 Install-CD nicht da" > problem ; exit ; fi ; echo "Auf Install-DVD oder .iso gefunden, unter /von gemountet: " ls -l /von # 3. Groesse der Installation (Groesse des Install-CDs, Kompaktrate, Sicherheit) KOMPAKT10=39 # 10-fache max. Kompakt-Rate, die bei lzma = 3.8 ... 4.2 ist . Besser zu hoch waehlen SIZEMIN=20000000 # Mindestgroesse der Installation in Sektoren jedenfalls . Hier normalerweise ruhig Grösse des Instal-DVDs # nur für Tests / kleines .img einen kleinen Wert #mount $VON /von # Ist von oben noch gemountet df | grep -v "tmpfs" ; df -k | grep -v "tmpfs" > df0 Z0=0 grep "/von" df0 > scr0 # Geraet oft als /dev/loop/0 statt $VON bezeichnet, daher nach /von suchen # Problem: bei langen Namen wie hda1/SYS_Linux.iso setzt Ausgabe von df auf naechster Zeile fort ... #if test $? -eq 0 ; then read UNW1 SIZE00ALT SIZE00 UNW2 VONALT VONNORMAL REST < scr0 ; fi ; # SIZE00 : Groesse des Install-CD in k if test $? -eq 0 ; then read UNW1 SIZE00 REST < scr0 ; fi ; # wir nehmen den 2. Wert der ist immer richtig #echo " VONNORMAL " $VONNORMAL ; echo " VONALT " $VONALT #echo " alle: " $UNW1 $SIZE00ALT "SIZE00:" $SIZE00 $UNW2 "VONALT:" $VONALT "VONNORMAL:" $VONNORMAL #if test $VONNORMAL = "/von" ; then SIZE00=$SIZE00 ; fi ; echo " == " ; if test $VONALT = "/von" ; then SIZE00=$SIZE00ALT ; fi ; echo " *** device /von : " ; cat scr0 ; echo " ... also Groesse Install-.iso in k: SIZE00 : " $SIZE00 if test $SIZE00 -gt 0 ; then SIZE00=$SIZE00 ; else SIZE00=4500000 ; fi ; SIZE=$(($SIZE00 * 2 * $KOMPAKT10 / 10)) # minimale Groesse der Installation in k, de facto wird mehr Platz genommen falls auf $NACH0 frei echo "SIZE: " $SIZE " SIZEMIN " $SIZEMIN # SIZE, SIZEMIN in Sektoren test $(($SIZE - $SIZEMIN)) -gt 0 ; if test $? -ne 0 ; then SIZE=$SIZEMIN ; fi ; echo " *** Groesse Install-CD Sektoren: " $(($SIZE00 * 2)) " Benoetigter Platz / Neue Partition Sektoren: " $SIZE " mindestens:" $SIZEMIN SIZEG=$(($SIZE / 1952000)) # Sinnvoll zu verlangen dass in TARGETS nur solche Festplatten mit DISKSIZEG -gt SIZEG kommen # Aus TARGETS zu kleine Platten rauswerfen, und brauchbare Geraete zaehlen. Wir machen das einstweilen oben echo $NTARGETS $TARGETS > targets #read UNW NACH0 REST < targets # Als NACH0 oben Geraet mit groesstem nicht-part. Platz nehmen echo "*** " $NTARGETS "potentielle Install-Geraete HD/USB : " $TARGETS " , empfohlen NACH0 : " $NACH0 ; echo "***" if test $NTARGETS = 0 ; then echo "11 Festplatte zu klein fuer Instalation" > problem ; exit ; fi ; # kuenftig ggf. andere Platten suchen if test $NACH0 != - ; then NACH0=$NACH0 ; else echo " Festplatte Install-Ziel nicht da. Abbruch Installation, -> Rescue" echo "13 Ziel nicht da"> problem ; exit ; fi ; # sollte an sich nicht vorkommen echo "***" ; echo "*** Installation von: " $VON " Groesse:" $SIZE00 " Sektoren" ; echo "***" echo " mkdev Ende: TST SIZE NACH0 NACH VON KLEINER OLDSYS WINDOWS: " echo $TST $SIZE $NACH0 $NACH $VON $KLEINER $OLDSYS $WINDOWS echo $TST $SIZE $NACH0 $NACH $VON $KLEINER $OLDSYS $WINDOWS > installinfo exit