InitrdPxeMac: pxe

File pxe, 10.1 KB (added by juanfran, 10 years ago)
Line 
1#!/bin/sh
2
3# Juan Francisco Fernandez Dominguez
4# Universidad de Málaga
5# ver 0.3 Se añade opcion de arranque MacOsx desde el disco duro y se guardan kernel og en la efi
6# ver 0.6 se usa kernel 3.8 de ubuntu 13.04 , soporte para arranque de linux
7# ver 0.6.4 se añade la carga de funciones og
8
9#def variables
10hoy=$(date +"%d/%m/%Y %H:%M")
11#export PS1="ClientePXE >"
12export LANG="es_ES.UTF-8"
13EsOpenGnsys=0
14EsMacOsx=0
15Comienzo_Opengnsys=0
16DiscoArranque="(hd1,2)"
17Efi=""
18root="/tmp/"
19
20########################
21#Funciones de opengnsys#
22########################
23# cargar funciones de og
24. /scripts/functions
25. /scripts/ogfunctions
26#capturamos los parametros del kernel
27set -a
28log_success_msg "Checking kernel parameters"
29ogExportKernelParameters
30log_success_msg "Checking OpenGnSys Environmnet"
31ogExportVarEnvironment
32#modificamos la resolucion
33[ -n "$video" ] && ogChangeVideoResolution
34
35
36#montamos la EFI
37#Efi=$(blkid | grep vfat | cut -d ":" -f 1 | head -1)
38#miro si la efi ha sido maontasda por el fstab
39Efi=$(mount | grep efi | cut -d " " -f 1)
40if [ ! -n $Efi ]
41then
42        #Miro si existe la particion efi
43       
44        Efi=$(blkid | grep vfat | cut -d ":" -f 1 | head -1)
45        mount -t vfat $Efi /boot/efi -o user,rw
46        echo "Montado unidad EFI"
47        #mkdir /mnt/EFI/kernel
48        root="/boot/efi/"
49        #si existe una marca anterior de boot.mac la borro
50       
51else
52        echo "  EFI montada en FSTAB" >> ${root}ClientePXE.log
53        mount -a >> ${root}ClientePXE.log       
54        #trabajamos sobre initrd
55        root=$(mount | grep efi | cut -d " " -f 3)"/"
56fi
57
58#Cabecera del log
59echo "================" >> ${root}ClientePXE.log
60echo $hoy >> ${root}ClientePXE.log
61echo "================" >> ${root}ClientePXE.log
62echo "  Efi encontrada en $Efi" >> ${root}ClientePXE.log
63echo "  Usando root=$root" >> ${root}ClientePXE.log
64
65rm ${root}boot.mac
66rm ${root}boot.win
67if [ ! -d ${root}kernel ]
68then
69        busybox mkdir -p ${root}kernel
70        echo "  Creando directorio kernel"
71        echo "  Creando directorio kernel" >> ${root}ClientePXE.log
72else 
73        echo "  El directorio kernel ya existe"
74        echo "  El directorio kernel ya existe" >> ${root}ClientePXE.log
75fi
76
77
78#preparamos para dhcp
79#borrando cualquier configuracion anterior
80if [ -f /var/lib/dhcp/dhcpd.leases ]
81then 
82        rm /var/lib/dhcp/dhcpd.leases
83else
84        touch /var/lib/dhcp/dhcpd.leases
85fi
86
87dhclient -v eth0
88
89#variables dhcp
90Eth=$(cat /var/lib/dhcp/dhclient.leases | grep interface | cut -d " " -f 5 | tr -d '";' );
91IpServidor=$(cat /var/lib/dhcp/dhclient.leases | grep tftp-server-name | cut -d " " -f 5 | tr -d '";' ); 
92echo " servidor tftp ==>> $IpServidor "
93#lanzamos nuevo kernel con kexec usando pxelinux (linux.conf)
94#pxe-kexec --ignore-whitelist -f -l "OpenGnsys_Client" -n $IpServidor
95#kexec -e
96
97# mac de la ethernet
98Mac=$(ifconfig $Eth | grep HW | cut -d " " -f 11 | tr -s ':' '-')
99Mac="01-$Mac" 
100
101
102
103#desarrollo , comentarlo
104#Mac="01-3C-07-54-26-A4-75"
105#IpServidor="172.17.69.233"
106
107#Descargamos menu de configuracion grub4dos (menu.lst)
108#if $(atftp -g -r /menu.lst/default 172.17.69.233 >> /dev0 )
109atftp -g -r /menu.lst/$Mac -l /tmp/$Mac $IpServidor 69
110
111#mv /tmp/$Mac /tmp/grldr.conf
112#Creamos el menu de arranque
113#cat /tmp/grldr.conf | grep title | cut -d ' ' -f 2 > /tmp/menu
114#TimeOut=3
115#Default=1
116#menu($Default,$TimeOut)
117
118#parametros de menu.lst
119#Si el arranque es OpenGnsys-NET
120
121Comienzo_Opengnsys=$(cat /tmp/$Mac | grep -n "OpenGnsys-NET" | cut -d ':' -f 1)
122cat /tmp/$Mac
123#Miramos Si el arranque es del hdd o de opengnsys
124if [ -z $Comienzo_Opengnsys ] 
125then
126        #Comienzo_MBR=$(cat /tmp/$Mac | grep -n FirstHardDisk )
127        #head -n $Comienzo_MBR /tmp/$Mac | tail -n 8 > /tmp/grldr.conf
128        cat /tmp/$Mac  > /tmp/grldr.conf
129        echo " Arranque local " 
130        EsOpenGnsys=0
131        EsMacOsx=1
132else
133        Comienzo_Opengnsys=$(($Comienzo_Opengnsys+8));
134        head -n $Comienzo_Opengnsys /tmp/$Mac | tail -n 8 > /tmp/grldr.conf
135        EsOpenGnsys=1
136        EsMacOsx=0
137fi
138
139#sacamos los datos del archivo de configuracion grub.cfg
140if [ $EsOpenGnsys == 1 ]
141then 
142        #kernel
143        Linux=$(cat /tmp/grldr.conf | grep "kernel"| cut -d " " -f 2 | cut -b 5-)
144        Inicio=$(expr index $Linux "(pd)")
145        Inicio=$(($Inicio+1))
146        Linux=$(echo $Linux | cut -b $Inicio-)
147
148        #parametros del kernel
149        Parametros=$(cat /tmp/grldr.conf |grep kernel)
150        j=1
151        for Actual in $Parametros 
152        do                     
153                if [ $j -gt 2 ]
154                then
155                        param="$param $Actual"
156               
157                fi     
158                j=$(($j+1))     
159        done
160
161        #initrd
162        Initrd=$(cat /tmp/grldr.conf | grep initrd | cut -d " " -f 2 | cut -b 5-)
163        Inicio=$(expr index $Initrd "(pd)")
164        Inicio=$(($Inicio+1))
165        $Initrd=$(echo $Initrd | cut -b $Inicio-)
166       
167        #*Descaga de los archivos
168       
169        #*Comprobamos que no esten descargados ya (sum)
170        if [ -f ${root}kernel/ogvmlinuz ]
171        then
172                #ya se han descargado
173                #se comprueban los sum
174                echo "Descargado los archivos sum para comprobar si es necesaria la actualizacion de la EFI"           
175                atftp -g -r ${Linux}.sum -l ${root}kernel/ogvmlinuz.new.sum $IpServidor 69
176                atftp -g -r ${Initrd}.sum -l ${root}kernel/oginitrd.img.new.sum $IpServidor 69
177                temp1=$(cat ${root}kernel/oginitrd.img.new.sum)
178                temp2=$(cat ${root}kernel/oginitrd.img.sum)
179                if [ "$temp1" != "$temp2" ]
180                then   
181                        echo "Hay una nueva version del Kernel , se descargara"
182                        echo "  Se descarga nuevo kernel .... " >> ${root}ClientePXE.log
183                        atftp -g -r $Linux -l ${root}kernel/ogvmlinuz $IpServidor 69
184                        busybox md5sum ${root}kernel/ogvmlinuz | cut -d " " -f 1 > ${root}kernel/ogvmlinuz.sum
185                        atftp -g -r $Initrd -l ${root}kernel/oginitrd.img $IpServidor 69
186                        busybox md5sum ${root}kernel/oginitrd.img | cut -d " " -f 1 > ${root}kernel/oginitrd.img.sum
187
188                else 
189                        echo "El kernetl esta actualizado"             
190                fi
191                rm ${root}kernel/oginitrd.img.new.sum   
192               
193        else
194                echo "Descargando el Kernel"           
195                atftp -g -r $Linux -l ${root}kernel/ogvmlinuz $IpServidor 69
196                busybox md5sum ${root}kernel/ogvmlinuz | cut -d " " -f 1 > ${root}kernel/ogvmlinuz.sum
197                atftp -g -r $Initrd -l ${root}kernel/oginitrd.img $IpServidor 69
198                busybox md5sum ${root}kernel/oginitrd.img | cut -d " " -f 1 > ${root}kernel/oginitrd.img.sum
199        fi
200        #pasamos este kernel a la EFI
201else
202        #*datos para arrancar desde una particion local macosx
203        DiscoArranque=$(cat /tmp/$Mac | grep root | cut -d " " -f 2)
204        echo "  La unidad de arranque sera : $DiscoArranque"
205        echo "  La unidad de arranque sera : $DiscoArranque" >> ${root}ClientePXE.log
206fi
207
208
209#imprimimos todas las variables en el log
210echo "  Mac $Mac" >> ${root}ClientePXE.log
211echo "  IpServidor $IpServidor " >> ${root}ClientePXE.log
212echo "  Eth $Eth " >> ${root}ClientePXE.log
213echo "  Comienzo_Opengnsys $Comienzo_Opengnsys " >> ${root}ClientePXE.log
214echo "  Comienzo_MBR $Comienzo_MBR " >> ${root}ClientePXE.log
215echo "  Linux $Linux " >> ${root}ClientePXE.log
216echo "  initrd $Initrd " >> ${root}ClientePXE.log
217echo "  parametros $param" >> ${root}ClientePXE.log
218echo ""
219echo ""
220echo ""
221
222#compruebo que la efi esta por defecto para arrancar
223#en caso contrario lo cambio
224#SystemPartition=1
225#ListaAtributos=$(sgdisk -A=1:show /dev/sda | cut -d ":" -f 2)
226#echo "Comprobando si la EFI esta establecida como particion de arranque ..."
227#echo $(sgdisk -A=1:show /dev/sda)
228#for Atributo in $ListaAtributos
229#do
230#       if [ $Atributo -lt 1 ]
231#       then
232#               SystemPartition=0
233#       fi
234#done
235#if [ $SystemPartition -eq 1 ]
236#then
237#       echo "Estableciendo la EFI como particion de arranque......"
238        #sgdisk -A=1:set:0 /dev/sda
239        #sgdisk -A=1:set:3 /dev/sda             
240#else
241#       echo "Estado de la efi correcto"
242#fi
243
244
245#Hacemos el cambio de kernel
246#si es un linux lo arranco , en caso contrario o error arranco MacOsx
247if [ $EsOpenGnsys == 1 ]
248then 
249        echo "Arrancando OpenGNSYS"     
250        kexec -d -e -f -x --command-line="$param acpi=force vga=792 " --initrd=${root}kernel/oginitrd.img ${root}kernel/ogvmlinuz
251else
252        case $DiscoArranque in
253        "(hd0)")         #arranque en consola
254                echo "Arrancado el cliente en Modo interactivo ..."
255                echo "          Saliendo a modo interactivo " >> ${root}ClientePXE.log
256                echo ""
257                echo "  Log de arranque"       
258                echo "  ==============="       
259                cat ${root}ClientePXE.log
260                echo ""
261                ;;
262                       
263        "(hd0,0)")     #arranque linux
264               
265                echo "Montado $DiscoArranque"
266                mkdir /mnt/sda5
267                mount /dev/sda5 /mnt/sda5
268                root="/mnt/sda5/"
269                #hay que detectar si es linux
270                echo "Arrancando Linux....." 
271                param=" root=/dev/sda5 ro quiet splash vga=792" 
272                kexec -d -e -f -x --append="$param acpi=force" --initrd=${root}initrd.img ${root}vmlinuz
273                #kexec -d -e -f -x --command-line="$param acpi=force" --initrd=${root}initrd.img ${root}vmlinuz
274                #kexec -d -e -f -x --command-line="$param acpi=force" --initrd=${root}kernel/oginitrd.img ${root}kernel/ogvmlinuz
275                ;;
276
277        "(hd0,1)")    #arranque en Macosx       
278                if [ -r /dev/sda2 ]
279                then
280                        echo "Montado $DiscoArranque"
281                        mkdir /mnt/sda2
282                        mount /dev/sda2 /mnt/sda2
283                fi
284                #hay que detectar si es macosx
285                touch ${root}boot.mac
286               
287                #echo "Modificando Cmos para arrancar Macosx...."       
288                #modificamos nvram
289                #nvramtool -b /tmp/cmos.bin
290                #echo -e \\x02 | dd of=/tmp/cmos.bin obs=1 seek=103 conv=notrunc bs=1           
291                #nvramtool -B /tmp/cmos.bin
292
293                reboot -f
294                ;;
295 
296        "(hd0,2)")    #arranque en windows7     
297                if [ -r /dev/sda3 ]
298                then
299                        echo "Montado $DiscoArranque"
300                        mkdir /mnt/sda3
301                        mount /dev/sda3 /mnt/sda3
302                fi
303                #hay que detectar si es windows7
304                touch ${root}boot.win           
305                #echo "Modificando Cmos para arrancar Macosx...."       
306                #modificamos nvram
307                #nvramtool -b /tmp/cmos.bin
308                #echo -e \\x02 | dd of=/tmp/cmos.bin obs=1 seek=103 conv=notrunc bs=1           
309                #nvramtool -B /tmp/cmos.bin
310
311                reboot -f
312                ;;
313 
314        *)
315                echo "Imposible determinar particion de arranque"
316                echo "          Imposible determinar particion de arranque para $DiscoArranque" >> ${root}ClientePXE.log
317                echo "          Saliendo a modo interactivo " >> ${root}ClientePXE.log
318                echo ""
319                echo "  Log de arranque"       
320                echo "  ==============="
321                cat ${root}ClientePXE.log
322                echo ""
323                ;;
324        esac
325
326fi
327
328
329       
330        #Montamos particion hfs+
331        #if [ -r /dev/sda1 ]
332        #then
333                #echo "Montado $DiscoArranque"
334                #mkdir /mnt/${DiscoArranque}
335                #mount /dev/${Efi} /mnt/${DiscoArranque}
336                #Cargramos Grub local / o Refit
337                #kexec -d -e -f -x $root/efi/boot/grub.exe --append=--config-file= "insmod hfsplus ; root=${DiscoArranque}; chainloader /System/Library/CoreServices/boot.efi"
338                #kexec -d -e -f -x $root/efi/boot/grub.exe --append=--config-file= "insmod hfsplus ; root=${DiscoArranque}; chainloader ${root}+1"
339               
340        #else
341                #*buscamos otra particion efi (sdb???)
342        #       echo "no se ha encontrado la efi"
343        #       echo "probamos un arranque directo"
344               
345        #fi     
346
347       
348
349