summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xclient/engine/Boot.lib131
-rw-r--r--client/engine/UEFI.lib1
-rwxr-xr-xclient/shared/scripts/configureOs58
-rw-r--r--client/shared/scripts/configureOsCustom.template2
-rwxr-xr-xclient/shared/scripts/deployImage2
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]