diff options
author | Irina Gómez <irinagomez@us.es> | 2019-01-29 11:26:10 +0100 |
---|---|---|
committer | Irina Gómez <irinagomez@us.es> | 2019-01-29 11:26:10 +0100 |
commit | 20e5aa9e4558004d6d46fddd033f04d59afe61a0 (patch) | |
tree | 2b6a38de99fc49ca2b91dba0dbc5e6f51a8bfbdf /client | |
parent | 7dc06be98d438dc20709a764103bf384cbd5dd7a (diff) |
#802 #889 configureOs can relocale Windows in different partition. ogWindowsBootParameters: include the bootpartition to configure BCD
Diffstat (limited to 'client')
-rwxr-xr-x | client/engine/Boot.lib | 131 | ||||
-rw-r--r-- | client/engine/UEFI.lib | 1 | ||||
-rwxr-xr-x | client/shared/scripts/configureOs | 58 | ||||
-rw-r--r-- | client/shared/scripts/configureOsCustom.template | 2 | ||||
-rwxr-xr-x | client/shared/scripts/deployImage | 2 |
5 files changed, 99 insertions, 95 deletions
diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib index c49b08a4..09337657 100755 --- a/client/engine/Boot.lib +++ b/client/engine/Boot.lib @@ -119,18 +119,20 @@ case "$TYPE" in Windows) # Comprobar tipo de sistema. if ogIsEfiActive; then + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) # Obtener parcición EFI. read -e EFIDISK EFIPART <<<"$(ogGetEsp)" [ -n "$EFIPART" ] || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? EFIDIR=$(ogMount $EFIDISK $EFIPART) || exit $? # Comprobar cargador (si no existe buscar por defecto en ESP). - LOADER=$(ogGetPath $1 $2 /Boot/bootmgfw.efi) - [ -z "$LOADER" ] && LOADER=$(ogGetPath $EFIDIR/EFI/Microsoft/Boot/bootmgfw.efi) + #LOADER=$(ogGetPath $1 $2 /Boot/bootmgfw.efi) + LOADER=$(ogGetPath $EFIDIR/EFI/$BOOTLABEL/Boot/bootmgfw.efi) + [ -z "$LOADER" ] && BOOTLABEL=Microsoft && LOADER=$(ogGetPath $EFIDIR/EFI/Microsoft/Boot/bootmgfw.efi) [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE, EFI)" || return $? - # Crear directorio para el cargador y copiar los ficheros. - BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) - mkdir -p $EFIDIR/EFI/$BOOTLABEL - cp -a $(dirname "$LOADER") $EFIDIR/EFI/$BOOTLABEL + # El directorio se crea en la postconfiguración + ## Crear directorio para el cargador y copiar los ficheros. + #mkdir -p $EFIDIR/EFI/$BOOTLABEL + #cp -a $(dirname "$LOADER") $EFIDIR/EFI/$BOOTLABEL # Borrar cargador guardado con la misma etiqueta. BOOTNO=$(efibootmgr -v | awk -v L=$BOOTLABEL '{if ($2==L) print $1}') [ -n "$BOOTNO" ] && efibootmgr -B -b ${BOOTNO:4:4} @@ -141,7 +143,7 @@ case "$TYPE" in [ -n "$BOOTNO" ] && efibootmgr -n ${BOOTNO:4:4} reboot else - # Arranque BIOS: compruebar si hay un cargador de Windows. + # Arranque BIOS: comprueba si hay un cargador de Windows. for f in io.sys ntldr bootmgr; do FILE="$(ogGetPath $1 $2 $f 2>/dev/null)" [ -n "$FILE" ] && LOADER="$f" @@ -479,7 +481,7 @@ fi #TODO, solo si es ntfs o fat PARTYPE=$(ogGetPartitionId $1 $2) case "$PARTYPE" in - 1|4|6|7|b|c|e|f|17|700) + 1|4|6|7|b|c|e|f|17|700|EF00) ;; *) return $(ogRaiseError $OG_ERR_PARTITION; echo $?) @@ -498,9 +500,7 @@ main_part=$PART fix_first_sector=yes EOF -spartlnx.run -cui -nm -a -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -a -f $FILE rm -f $FILE } @@ -526,12 +526,15 @@ rm -f $FILE #@version 1.1.0 - Soporte para Windows 10. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2016-01-19 +#@version 1.1.1 - Compatibilidad con UEFI (ticket #802 #889) +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2019-01-28 #*/ ## function ogWindowsBootParameters () { # Variables locales. -local PART DISK FILE WINVER MOUNT +local PART DISK BOOTLABEL BCDFILE BOOTDISK BOOTPART FILE WINVER MOUNT # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -549,6 +552,19 @@ ogDiskToDev $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) let DISK=$1-1 PART=$2 FILE=/tmp/temp$$ +if [ ogIsEfiActive ]; then + read BOOTDISK BOOTPART <<< $(ogGetEsp) + ogUnmount $BOOTDISK $BOOTPART || ogRaiseError $OG_ERR_PARTITION "ESP: $BOOTDISK $BOOTPART" || return $? + + let BOOTDISK=$BOOTDISK-1 + BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) + BCDFILE="boot_BCD_file=/EFI/$BOOTLABEL/Boot/BCD" +else + BOOTDISK=$DISK + BOOTPART=$PART + BCDFILE="" +fi + # Obtener versión de Windows. WINVER=$(ogGetOsVersion $1 $2 | awk -F"[: ]" '$1=="Windows" {if ($3=="Server") print $2,$3,$4; else print $2,$3;}') @@ -567,69 +583,94 @@ ogUnmount $1 $2 || return $(ogRaiseError $OG_ERR_PARTITION; echo $?) #Preparando instruccion Windows Resume Application cat > $FILE <<EOF -boot_disk=$DISK -boot_main_part=$PART +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE disk=$DISK main_part=$PART boot_entry=Windows Resume Application EOF -spartlnx.run -cui -nm -w -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE - #Preparando instruccion tipo windows cat > $FILE <<EOF -boot_disk=$DISK -boot_main_part=$PART +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE disk=$DISK main_part=$PART boot_entry=$WINVER EOF -spartlnx.run -cui -nm -w -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null - +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE ##Preparando instruccion Ramdisk Options cat > $FILE <<EOF -boot_disk=$DISK -boot_main_part=$PART +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE disk=$DISK main_part=$PART boot_entry=Ramdisk Options EOF -spartlnx.run -cui -nm -w -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE +##Preparando instruccion Recovery Environment +cat > $FILE <<EOF +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE +disk=$DISK +main_part=$PART +boot_entry=Windows Recovery Environment +EOF +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE -#Preparando instruccion Windows Boot Manager +##Preparando instruccion Recovery cat > $FILE <<EOF -boot_disk=$DISK -boot_main_part=$PART +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE disk=$DISK main_part=$PART -boot_entry=Windows Boot Manager +boot_entry=Windows Recovery EOF -spartlnx.run -cui -nm -w -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE +#Preparando instruccion Windows Boot Manager +cat > $FILE <<EOF +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE +disk=$BOOTDISK +main_part=$BOOTPART +boot_entry=Windows Boot Manager +EOF +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE #Preparando instruccion Herramienta de diagnóstico de memoria de Windows cat > $FILE <<EOF -boot_disk=$DISK -boot_main_part=$PART -disk=$DISK -main_part=$PART +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE +disk=$BOOTDISK +main_part=$BOOTPART boot_entry=Herramienta de diagnóstico de memoria de Windows EOF -spartlnx.run -cui -nm -w -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE + +#Preparando instruccion Herramienta de diagnóstico de memoria de Windows +cat > $FILE <<EOF +boot_disk=$BOOTDISK +boot_main_part=$BOOTPART +$BCDFILE +disk=$BOOTDISK +main_part=$BOOTPART +boot_entry=Herramienta de diagn<f3>stico de memoria de Windows +EOF +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -w -f $FILE +rm -f $FILE } @@ -703,9 +744,7 @@ main_part=$REGISTREDPART ;ext_part part_letter=$REGISTREDVOL EOF -spartlnx.run -cui -nm -u -f $FILE & -sleep 5 -ps aux > /dev/null | grep $! | grep -E "T|S" | kill -9 $! > /dev/null +timeout --foreground --signal=SIGKILL 5s spartlnx.run -cui -nm -u -f $FILE } diff --git a/client/engine/UEFI.lib b/client/engine/UEFI.lib index cfd818f5..7a1afb6d 100644 --- a/client/engine/UEFI.lib +++ b/client/engine/UEFI.lib @@ -142,7 +142,6 @@ esac #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (partición de sistema o EFI). #@exception OG_ERR_NOTOS sin sistema operativo. -#@note Si existe el cargador en la partición de sistema puede no ser válido #*/ ## function ogRestoreEfiBootLoader () { # Variables locales diff --git a/client/shared/scripts/configureOs b/client/shared/scripts/configureOs index 3170a994..388cc0f6 100755 --- a/client/shared/scripts/configureOs +++ b/client/shared/scripts/configureOs @@ -5,8 +5,6 @@ #@brief Script para realizar la configuracion del sistema operativo restaurado. #@param 1 disco #@param 2 particion -#@param 3 Repositorio (CACHE, REPO o dirección IP) -#@param 4 Nombre canónico de la imagen (sin extensión) #@return #@TODO comprobar que el tipo de particion corresponde con el sistema de archivos. #@exception OG_ERR_FORMAT # 1 formato incorrecto. @@ -34,7 +32,7 @@ #@version 1.0.6b - llamadas opcionales para mejoras varias. Descomentar la instruccion para su activacion. ogConfigureFstab #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2016-11-03 -#@version 1.1.1 - Equipos UEFI: cambia uuid de las particiones y restaura el cargador de arranque (Windows) (tickect #802) +#@version 1.1.1 - Equipos UEFI: para Windows copia cargador de arranque a partición UEFI, para linux configura particion ESP en fstab. (ticket #802 #889 #890) #@author Irina Gomez, ETSII Universidad de Sevilla #@date 2019-01-08 #*/ ## @@ -43,36 +41,6 @@ [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg [ -f $DEVICECFG ] && source $DEVICECFG -PROG="$(basename $0)" - -# Para Windows en equipos EFI son necesarios cuatro parámetros -OSTYPE="$(ogGetOsType $1 $2)" -if [ ogIsEfiActive -a "$OSTYPE" == "Windows" ]; then - if [ $# -lt 4 ]; then - ogRaiseError session $OG_ERR_FORMAT - ogHelp "$PROG:" \ - "$PROG ndisco nparticion [ REPO|CACHE|IPSERVER ] [imagename]" \ - "$PROG 1 1" \ - "$PROG 1 2 REPO Windows (UEFI)" - exit $OG_ERR_FORMAT - fi - - REPO="${3^^}" - REPO=${REPO:-"REPO"} - IMGNAME="$4" - # Cambio de repositorio - if [ "$REPO" == "$(ogGetIpAddress)" -o "$REPO" == "CACHE" ]; then - REPO="CACHE" - else - ogCheckIpAddress "$REPO" - if [ $? == 0 -o "$REPO" == "REPO" ]; then - # Si falla el cambio -> salimos con error repositorio no valido - ogChangeRepo $REPO ${OGUNIT} || exit $(ogRaiseError $OG_ERR_NOTFOUND "$REPO $OGUNIT"; echo $?) - REPO="REPO" - fi - fi -fi - # Si el sistema de archivos no esta extendido, ampliarlo al tamaño de su partición. PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $? FSSIZE=$(ogGetFsSize $1 $2) @@ -96,18 +64,21 @@ fi HOST="$(ogGetHostname)" # Post-configuración personalizada para cada tipo de sistema operativo. +OSTYPE="$(ogGetOsType $1 $2)" case "$OSTYPE" in Windows) # Postconfiguración de Windows. - # Si es UEFI pongo el UUID de la partición del modelo - if ogIsEfiActive; then - echo ogRestoreUuidPartitions $REPO $IMGNAME $1 $2 - ogRestoreUuidPartitions $REPO $IMGNAME $1 $2 - fi # Cambiar nombre en sistemas Windows. HOST=${HOST:-"pc"} ogSetWindowsName $1 $2 "$HOST" - # Configurar el boot sector de la partición Windows. - ogFixBootSector $1 $2 + # Si es UEFI copio el cargador de arranque a la partición EFI + if ogIsEfiActive; then + ogRestoreEfiBootLoader $1 $2 + # Configurar el boot sector de la partición Windows. + ogFixBootSector $(ogGetEsp) + else + # Configurar el boot sector de la partición Windows. + ogFixBootSector $1 $2 + fi # Configurar el gestor de arranque de Windows XP/Vista/7. ogWindowsBootParameters $1 $2 # Registrar en Windows que la partición indicada es su nueva unidad C:\ @@ -119,14 +90,9 @@ case "$OSTYPE" in ogInstallMiniSetup $1 $2 postconf.cmd ogUninstallWindowsClient $1 $2 postconf.cmd fi - # Si es UEFI copio el cargador de arranque a la partición EFI - if ogIsEfiActive; then - echo ogRestoreEfiBootLoader $1 $2 - ogRestoreEfiBootLoader $1 $2 - fi ;; Linux) # Postconfiguración de GNU/Linux. - # Configuro fstab: particion de Swap y si es UEFI la partición EFI. + # Configuro fstab: particion de Swap y si es UEFI además la partición EFI. ogConfigureFstab $1 $2 ## Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen) ogGrubInstallPartition $1 $2 diff --git a/client/shared/scripts/configureOsCustom.template b/client/shared/scripts/configureOsCustom.template index d5603a34..f1c8e2a6 100644 --- a/client/shared/scripts/configureOsCustom.template +++ b/client/shared/scripts/configureOsCustom.template @@ -28,7 +28,7 @@ IMGNAME="$4" # Nombre canónico de imagen (sin extensión). # Nota: incluye llamada al script "configureOs" para realizar previamente una configuración estándar. # Configurarción típica. -configureOs "$DISK" "$PART" "$REPO" "$IMGNAME" +configureOs "$1" "$2" # Postconfiguración personalizada para cada tipo de sistema operativo. OSTYPE="$(ogGetOsType $1 $2)" case "$OSTYPE" in diff --git a/client/shared/scripts/deployImage b/client/shared/scripts/deployImage index 59188f22..824da2af 100755 --- a/client/shared/scripts/deployImage +++ b/client/shared/scripts/deployImage @@ -220,7 +220,7 @@ if which configureOsCustom &>/dev/null; then configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME" else ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " - configureOs "$DISK" "$PART" "$REPO" "$IMGNAME" + configureOs "$DISK" "$PART" fi TIME=$[SECONDS-TIME1] |