[39b84ff] | 1 | #!/bin/bash |
---|
| 2 | # Libreria provisional para uso de UEFI |
---|
| 3 | # Las funciones se incluirán las librerías ya existentes |
---|
| 4 | |
---|
| 5 | #/** |
---|
[30238ab] | 6 | # ogGrubUefiConf int_ndisk int_part str_dir_grub |
---|
[39b84ff] | 7 | #@brief Genera el fichero grub.cfg de la ESP |
---|
| 8 | #@param int_ndisk nº de orden del disco |
---|
| 9 | #@param int_part nº de partición |
---|
[7dc06be9] | 10 | #@param str_dir_grub prefijo del directorio de grub en la partición de sistema. ej: /boot/grubPARTITION |
---|
[39b84ff] | 11 | #@return (nada, por determinar) |
---|
| 12 | #@exception OG_ERR_FORMAT formato incorrecto. |
---|
| 13 | #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. |
---|
| 14 | #@TODO Confirmar si el fichero "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" es necesario. |
---|
| 15 | #*/ ## |
---|
[30238ab] | 16 | function ogGrubUefiConf () { |
---|
[7dc06be9] | 17 | local EFIDIR BOOTLABEL GRUBEFI UUID DEVICE PREFIXSECONDSTAGE EFIGRUBDIR |
---|
[39b84ff] | 18 | |
---|
| 19 | # Si se solicita, mostrar ayuda. |
---|
| 20 | if [ "$*" == "help" ]; then |
---|
| 21 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" \ |
---|
| 22 | "$FUNCNAME 1 2" \ |
---|
[7dc06be9] | 23 | "$FUNCNAME 1 3 /boot/grubPARTITION" |
---|
[39b84ff] | 24 | return |
---|
| 25 | fi |
---|
| 26 | |
---|
| 27 | # Error si no se reciben al menos 2 parámetros. |
---|
| 28 | [ $# -ge 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part [ str_dir_grub ]" || return $? |
---|
| 29 | |
---|
| 30 | # Directorio del grub en la partición de sistema |
---|
[7dc06be9] | 31 | PREFIXSECONDSTAGE="$3" |
---|
[39b84ff] | 32 | |
---|
| 33 | EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? |
---|
| 34 | BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
[7dc06be9] | 35 | EFIGRUBDIR="$EFIDIR/EFI/$BOOTLABEL/boot/grub" |
---|
[39b84ff] | 36 | # Comprobamos que existe directorio |
---|
[7dc06be9] | 37 | [ -d "$EFIGRUBDIR" ] || mkdir -p "$EFIGRUBDIR" |
---|
[39b84ff] | 38 | # Parcheamos uuid y particion en grub.cfg |
---|
| 39 | UUID=$(blkid -o value -s UUID $(ogDiskToDev $1 $2)) |
---|
| 40 | DEVICE="hd$(expr $1 - 1 ),gpt$2" |
---|
| 41 | |
---|
[7dc06be9] | 42 | cat << EOT > $EFIGRUBDIR/grub.cfg |
---|
[39b84ff] | 43 | set root='$DEVICE' |
---|
[7dc06be9] | 44 | set prefix=(\$root)'${PREFIXSECONDSTAGE}/boot/grub' |
---|
[39b84ff] | 45 | configfile \$prefix/grub.cfg |
---|
| 46 | EOT |
---|
| 47 | |
---|
| 48 | # Provisional: confirmar si el segundo archivo se utiliza |
---|
[7dc06be9] | 49 | #cp $EFIGRUBDIR/grub.cfg "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" |
---|
[39b84ff] | 50 | } |
---|
| 51 | |
---|
| 52 | #/** |
---|
[30238ab] | 53 | # ogUuidChange int_ndisk str_repo |
---|
[39b84ff] | 54 | #@brief Reemplaza el UUID de un sistema de ficheros. |
---|
| 55 | #@param int_ndisk nº de orden del disco |
---|
| 56 | #@param int_part nº de partición |
---|
| 57 | #@return (nada, por determinar) |
---|
| 58 | #@exception OG_ERR_FORMAT formato incorrecto. |
---|
| 59 | #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. |
---|
| 60 | #*/ ## |
---|
[30238ab] | 61 | function ogUuidChange () { |
---|
[39b84ff] | 62 | local MNTDIR DEVICE UUID NEWUUID f |
---|
| 63 | |
---|
| 64 | # Si se solicita, mostrar ayuda. |
---|
| 65 | if [ "$*" == "help" ]; then |
---|
| 66 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ |
---|
| 67 | "$FUNCNAME 1 2" |
---|
| 68 | return |
---|
| 69 | fi |
---|
| 70 | |
---|
| 71 | # Error si no se reciben al menos 2 parámetros. |
---|
| 72 | [ $# -eq 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? |
---|
| 73 | |
---|
| 74 | # Comprobamos que exista la partición |
---|
| 75 | MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_NOTFOUND "Device $1 $2" || return $? |
---|
| 76 | DEVICE=$(ogDiskToDev $1 $2) |
---|
| 77 | UUID=$(blkid -o value -s UUID $DEVICE) |
---|
[7dc06be9] | 78 | NEWUUID=$(cat /proc/sys/kernel/random/uuid) |
---|
[39b84ff] | 79 | |
---|
| 80 | # Cambiamos UUID a la partición |
---|
| 81 | ogUnmount $1 $2 |
---|
| 82 | tune2fs $DEVICE -U $NEWUUID |
---|
| 83 | |
---|
| 84 | # Cambiamos UUID en la configuración (fstab y grub) |
---|
| 85 | ogMount $1 $2 |
---|
| 86 | for f in $MNTDIR/etc/fstab $MNTDIR/{,boot/}{{grubMBR,grubPARTITION}/boot/,}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg}; do |
---|
| 87 | [ -r $f ] && sed -i s/$UUID/$NEWUUID/g $f |
---|
| 88 | done |
---|
| 89 | } |
---|
[30238ab] | 90 | |
---|
| 91 | #/** |
---|
| 92 | # ogCopyEfiBootLoader int_ndisk str_repo path_image |
---|
| 93 | #@brief Copia el cargador de arranque desde la partición EFI a la de sistema. |
---|
| 94 | #@param int_ndisk nº de orden del disco |
---|
| 95 | #@param int_part nº de partición |
---|
| 96 | #@return (nada, por determinar) |
---|
| 97 | #@exception OG_ERR_FORMAT formato incorrecto. |
---|
| 98 | #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. |
---|
| 99 | #@note Si existe el cargador en la partición de sistema no es válido |
---|
| 100 | #*/ ## |
---|
| 101 | function ogCopyEfiBootLoader () { |
---|
| 102 | # Variables locales |
---|
| 103 | local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f |
---|
| 104 | |
---|
| 105 | # Si se solicita, mostrar ayuda. |
---|
| 106 | if [ "$*" == "help" ]; then |
---|
| 107 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ |
---|
| 108 | "$FUNCNAME 1 2" |
---|
| 109 | return |
---|
| 110 | fi |
---|
| 111 | |
---|
| 112 | # Error si no se reciben 2 arámetros. |
---|
| 113 | [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? |
---|
| 114 | |
---|
| 115 | # Comprobamos que exista partición de sistema y la ESP |
---|
| 116 | MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? |
---|
| 117 | EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? |
---|
| 118 | |
---|
| 119 | # Comprobamos que exista el cargador |
---|
| 120 | BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
| 121 | OSVERSION=$(ogGetOsVersion $1 $2) |
---|
| 122 | case $OSVERSION in |
---|
| 123 | *Windows\ 10*) |
---|
| 124 | for f in $EFIDIR/EFI/{$BOOTLABEL,Microsoft}/Boot/bootmgfw.efi; do |
---|
| 125 | [ -r $f ] && LOADER=$f |
---|
| 126 | done |
---|
| 127 | [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? |
---|
| 128 | # Si existe el directorio Boot lo borramos |
---|
| 129 | [ -d $MNTDIR/Boot ] && rm -rf $MNTDIR/Boot |
---|
| 130 | DIRLOADER=$(realpath "${LOADER%/*}/..") |
---|
| 131 | cp -r ${DIRLOADER}/Boot $MNTDIR |
---|
| 132 | ;; |
---|
| 133 | esac |
---|
| 134 | } |
---|
| 135 | |
---|
| 136 | #/** |
---|
| 137 | # ogRestoreEfiBootLoader int_ndisk str_repo |
---|
| 138 | #@brief Copia el cargador de arranque de la partición de sistema a la partición EFI. |
---|
| 139 | #@param int_ndisk nº de orden del disco |
---|
| 140 | #@param int_part nº de partición |
---|
| 141 | #@return (nada, por determinar) |
---|
| 142 | #@exception OG_ERR_FORMAT formato incorrecto. |
---|
| 143 | #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado (partición de sistema o EFI). |
---|
| 144 | #@exception OG_ERR_NOTOS sin sistema operativo. |
---|
| 145 | #*/ ## |
---|
| 146 | function ogRestoreEfiBootLoader () { |
---|
| 147 | # Variables locales |
---|
| 148 | local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f UUID DEVICE |
---|
| 149 | |
---|
| 150 | # Si se solicita, mostrar ayuda. |
---|
| 151 | if [ "$*" == "help" ]; then |
---|
| 152 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ |
---|
| 153 | "$FUNCNAME 1 2" |
---|
| 154 | return |
---|
| 155 | fi |
---|
| 156 | |
---|
| 157 | # Error si no se reciben 2 arámetros. |
---|
| 158 | [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? |
---|
| 159 | |
---|
| 160 | # Comprobamos que exista partición de sistema y la ESP |
---|
| 161 | MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? |
---|
| 162 | EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? |
---|
| 163 | |
---|
| 164 | # Comprobamos que exista el cargador |
---|
| 165 | #BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
| 166 | OSVERSION=$(ogGetOsVersion $1 $2) |
---|
| 167 | case $OSVERSION in |
---|
| 168 | *Windows\ 10*) |
---|
| 169 | BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
| 170 | LOADER=$(ogGetPath $MNTDIR/Boot/bootmgfw.efi) |
---|
| 171 | [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? |
---|
| 172 | [ -r $EFIDIR/$BOOTLABEL ] && rm -rf $EFIDIR/$BOOTLABEL |
---|
| 173 | mkdir -p $EFIDIR/EFI/$BOOTLABEL |
---|
| 174 | cp -r "${LOADER%/*}" $EFIDIR/EFI/$BOOTLABEL |
---|
| 175 | ;; |
---|
| 176 | esac |
---|
| 177 | } |
---|
| 178 | |
---|
| 179 | |
---|
| 180 | # ogRestoreUuidPartitions |
---|
| 181 | #@brief Restaura los uuid de las particiones y la tabla de particiones |
---|
| 182 | #@param int_ndisk nº de orden del disco |
---|
| 183 | #@param int_nfilesys nº de orden del sistema de archivos |
---|
| 184 | #@param REPO|CACHE repositorio |
---|
| 185 | #@param str_imgname nombre de la imagen |
---|
| 186 | #@exception OG_ERR_FORMAT Formato incorrecto. |
---|
| 187 | #@exception OG_ERR_NOTFOUND No encontrado fichero de información de la imagen (con uuid) |
---|
| 188 | function ogRestoreUuidPartitions () { |
---|
[a31f7a9] | 189 | local DISK PART IMGNAME INFOFILE DEVICE DATA GUID UUID IMGGUID |
---|
| 190 | local EFIDEVICE EFIDATA EFIGUID EFIUUID EFIUUID IMGEFIGUID |
---|
[30238ab] | 191 | |
---|
| 192 | # Si se solicita, mostrar ayuda. |
---|
| 193 | if [ "$*" == "help" ]; then |
---|
| 194 | ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" \ |
---|
| 195 | "$FUNCNAME REPO Windows 1 2" |
---|
| 196 | return |
---|
| 197 | fi |
---|
| 198 | # Error si no se reciben 4 parámetros. |
---|
| 199 | [ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" || return $? |
---|
| 200 | |
---|
| 201 | # Sólo se ejecuta si es UEFI |
---|
| 202 | [ ogIsEfiActive ] || return |
---|
| 203 | |
---|
| 204 | # Parámetros de entrada |
---|
| 205 | IMGNAME="$2" |
---|
| 206 | INFOFILE="$OGIMG/.$IMGNAME.img.json" |
---|
| 207 | [ "${1^^}" == "CACHE" ] && INFOFILE="$OGCAC$INFOFILE" |
---|
| 208 | # TODO: que la función getPath soporte archivos ocultos |
---|
| 209 | ls $INFOFILE &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "$INFOFILE" || return $? |
---|
| 210 | DISK=$3 |
---|
| 211 | PART=$4 |
---|
| 212 | |
---|
| 213 | DEVICE=$(ogDiskToDev $DISK) |
---|
| 214 | read -e EFIDISK EFIPART <<<"$(ogGetEsp)" |
---|
| 215 | |
---|
| 216 | # Datos de la imagen |
---|
| 217 | IMGGUID=$(jq .guid $INFOFILE|tr -d \") |
---|
| 218 | IMGEFIGUID=$(jq .espguid $INFOFILE|tr -d \") |
---|
| 219 | |
---|
| 220 | # Datos actuales |
---|
| 221 | DATA=$(sfdisk -J $DEVICE) |
---|
| 222 | GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") |
---|
| 223 | |
---|
| 224 | if [ "$IMGGUID" != "$GUID" ]; then |
---|
| 225 | echo sgdisk -U "$IMGGUID" "$DEVICE" |
---|
| 226 | sgdisk -U "$IMGGUID" "$DEVICE" |
---|
| 227 | partprobe |
---|
| 228 | fi |
---|
| 229 | |
---|
| 230 | if [ $DISK -eq $EFIDISK ]; then |
---|
| 231 | EFIDATA=$DATA |
---|
| 232 | EFIDEVICE=$DEVICE |
---|
| 233 | else |
---|
| 234 | EFIDEVICE=$(ogDiskToDev $EFIDISK) || return $? |
---|
| 235 | EFIDATA=$(sfdisk -J $EFIDEVICE) |
---|
| 236 | EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") |
---|
| 237 | if [ "$IMGEFIGUID" != "$EFIGUID" ]; then |
---|
| 238 | echo sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" |
---|
| 239 | sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" |
---|
| 240 | partprobe |
---|
| 241 | fi |
---|
| 242 | fi |
---|
| 243 | |
---|
| 244 | } |
---|
| 245 | |
---|
| 246 | # ogSaveImageInfo |
---|
| 247 | #@brief Crea un fichero con la información de la imagen. |
---|
| 248 | #@param int_ndisk nº de orden del disco |
---|
| 249 | #@param int_nfilesys nº de orden del sistema de archivos |
---|
| 250 | #@param REPO|CACHE repositorio |
---|
| 251 | #@param str_imgname nombre de la imagen |
---|
| 252 | #@exception OG_ERR_FORMAT formato incorrecto. |
---|
| 253 | #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. |
---|
| 254 | function ogSaveImageInfo () { |
---|
[a31f7a9] | 255 | local DISK PART IMGDIR IMGNAME INFO INFOFILE DEVICE DATA GUID |
---|
| 256 | local EFIPARTDEVICE EFIDEVICE EFIDATA EFIGUID |
---|
[30238ab] | 257 | |
---|
| 258 | # Si se solicita, mostrar ayuda. |
---|
| 259 | if [ "$*" == "help" ]; then |
---|
| 260 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys REPO|CACHE str_imgname" \ |
---|
| 261 | "$FUNCNAME 1 2 REPO Windows" |
---|
| 262 | return |
---|
| 263 | fi |
---|
| 264 | # Error si no se reciben 4 parámetros. |
---|
| 265 | [ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys REPO|CACHE str_imgname" || return $? |
---|
| 266 | |
---|
| 267 | DISK=$1 |
---|
| 268 | PART=$2 |
---|
| 269 | IMGDIR="$(ogGetParentPath "$3" "/$4")" |
---|
| 270 | # Si no existe el directorio de la imagen me salgo |
---|
| 271 | [ "$IMGDIR" != "" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? |
---|
| 272 | IMGNAME="$(basename "$4")" |
---|
| 273 | INFOFILE="$IMGDIR/.$IMGNAME.img.json" |
---|
| 274 | |
---|
| 275 | DEVICE=$(ogDiskToDev $DISK) || return $? |
---|
| 276 | DATA=$(sfdisk -J $DEVICE) |
---|
| 277 | GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") |
---|
| 278 | |
---|
| 279 | # Información de la imagen. Valor inicial de efi: false |
---|
| 280 | INFO=$(cat << EOT | jq . |
---|
[a31f7a9] | 281 | {"name":"$IMGNAME","efi":"false","guid":"$GUID"} |
---|
[30238ab] | 282 | EOT |
---|
| 283 | ) |
---|
| 284 | |
---|
| 285 | if ogIsEfiActive; then |
---|
| 286 | # Cambio valor de efi a true |
---|
| 287 | INFO=$(echo $INFO| jq --arg aux true '. + {efi: $aux}') |
---|
| 288 | |
---|
| 289 | # Obtener partición EFI. |
---|
| 290 | read -e EFIDISK EFIPART <<<"$(ogGetEsp)" |
---|
| 291 | EFIPARTDEVICE=$(ogDiskToDev $EFIDISK $EFIPART) || return $? |
---|
| 292 | if [ $DISK -eq $EFIDISK ]; then |
---|
| 293 | EFIDEVICE=$DEVICE |
---|
| 294 | EFIDATA=$DATA |
---|
| 295 | EFIGUID=$GUID |
---|
| 296 | else |
---|
[a31f7a9] | 297 | EFIDEVICE=$(ogDiskToDev $EFIDISK) |
---|
[30238ab] | 298 | EFIDATA=$(sfdisk -J $EFIDEVICE) |
---|
| 299 | EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") |
---|
| 300 | fi |
---|
| 301 | |
---|
| 302 | # Incluyo valor de EFIGUID (por si partición EFI en distinto disco que la de sistema) |
---|
| 303 | INFO=$(echo $INFO| jq --arg aux $EFIGUID '. + {espguid: $aux}') |
---|
| 304 | fi |
---|
| 305 | |
---|
| 306 | cat << EOT | jq . > $INFOFILE |
---|
| 307 | $INFO |
---|
| 308 | EOT |
---|
| 309 | } |
---|