1 | #!/bin/bash |
---|
2 | # Libreria provisional para uso de UEFI |
---|
3 | # Las funciones se incluirán las librerías ya existentes |
---|
4 | |
---|
5 | #/** |
---|
6 | # ogGrubUefiConf int_ndisk int_part str_dir_grub |
---|
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 |
---|
10 | #@param str_dir_grub prefijo del directorio de grub en la partición de sistema. ej: /boot/grubPARTITION |
---|
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 | #*/ ## |
---|
16 | function ogGrubUefiConf () { |
---|
17 | local EFIDIR BOOTLABEL GRUBEFI UUID DEVICE PREFIXSECONDSTAGE EFIGRUBDIR |
---|
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" \ |
---|
23 | "$FUNCNAME 1 3 /boot/grubPARTITION" |
---|
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 |
---|
31 | PREFIXSECONDSTAGE="$3" |
---|
32 | |
---|
33 | EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? |
---|
34 | BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
35 | EFIGRUBDIR="$EFIDIR/EFI/$BOOTLABEL/boot/grub" |
---|
36 | # Comprobamos que existe directorio |
---|
37 | [ -d "$EFIGRUBDIR" ] || mkdir -p "$EFIGRUBDIR" |
---|
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 | |
---|
42 | cat << EOT > $EFIGRUBDIR/grub.cfg |
---|
43 | set root='$DEVICE' |
---|
44 | set prefix=(\$root)'${PREFIXSECONDSTAGE}/boot/grub' |
---|
45 | configfile \$prefix/grub.cfg |
---|
46 | EOT |
---|
47 | |
---|
48 | # Provisional: confirmar si el segundo archivo se utiliza |
---|
49 | #cp $EFIGRUBDIR/grub.cfg "$EFIDIR/EFI/$BOOTLABEL/grub.cfg" |
---|
50 | } |
---|
51 | |
---|
52 | #/** |
---|
53 | # ogUuidChange int_ndisk str_repo |
---|
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 | #*/ ## |
---|
61 | function ogUuidChange () { |
---|
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) |
---|
78 | NEWUUID=$(cat /proc/sys/kernel/random/uuid) |
---|
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 | } |
---|
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 | #@note Si existe el cargador en la partición de sistema puede no ser válido |
---|
146 | #*/ ## |
---|
147 | function ogRestoreEfiBootLoader () { |
---|
148 | # Variables locales |
---|
149 | local MNTDIR EFIDIR BOOTLABEL OSVERSION LOADER f UUID DEVICE |
---|
150 | |
---|
151 | # Si se solicita, mostrar ayuda. |
---|
152 | if [ "$*" == "help" ]; then |
---|
153 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_part" \ |
---|
154 | "$FUNCNAME 1 2" |
---|
155 | return |
---|
156 | fi |
---|
157 | |
---|
158 | # Error si no se reciben 2 arámetros. |
---|
159 | [ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_part" || return $? |
---|
160 | |
---|
161 | # Comprobamos que exista partición de sistema y la ESP |
---|
162 | MNTDIR=$(ogMount $1 $2) || ogRaiseError $OG_ERR_PARTITION "$DISK $PART" || return $? |
---|
163 | EFIDIR=$(ogMount $(ogGetEsp)) || ogRaiseError $OG_ERR_PARTITION "ESP" || return $? |
---|
164 | |
---|
165 | # Comprobamos que exista el cargador |
---|
166 | #BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
167 | OSVERSION=$(ogGetOsVersion $1 $2) |
---|
168 | case $OSVERSION in |
---|
169 | *Windows\ 10*) |
---|
170 | BOOTLABEL=$(printf "Part-%02d-%02d" $1 $2) |
---|
171 | LOADER=$(ogGetPath $MNTDIR/Boot/bootmgfw.efi) |
---|
172 | [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($OSVERSION, EFI)" || return $? |
---|
173 | [ -r $EFIDIR/$BOOTLABEL ] && rm -rf $EFIDIR/$BOOTLABEL |
---|
174 | mkdir -p $EFIDIR/EFI/$BOOTLABEL |
---|
175 | cp -r "${LOADER%/*}" $EFIDIR/EFI/$BOOTLABEL |
---|
176 | ;; |
---|
177 | esac |
---|
178 | } |
---|
179 | |
---|
180 | |
---|
181 | # ogRestoreUuidPartitions |
---|
182 | #@brief Restaura los uuid de las particiones y la tabla de particiones |
---|
183 | #@param int_ndisk nº de orden del disco |
---|
184 | #@param int_nfilesys nº de orden del sistema de archivos |
---|
185 | #@param REPO|CACHE repositorio |
---|
186 | #@param str_imgname nombre de la imagen |
---|
187 | #@exception OG_ERR_FORMAT Formato incorrecto. |
---|
188 | #@exception OG_ERR_NOTFOUND No encontrado fichero de información de la imagen (con uuid) |
---|
189 | function ogRestoreUuidPartitions () { |
---|
190 | local DISK PART IMGNAME INFOFILE DEVICE DATA GUID UUID IMGGUID |
---|
191 | local EFIDEVICE EFIDATA EFIGUID EFIUUID EFIUUID IMGEFIGUID |
---|
192 | |
---|
193 | # Si se solicita, mostrar ayuda. |
---|
194 | if [ "$*" == "help" ]; then |
---|
195 | ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" \ |
---|
196 | "$FUNCNAME REPO Windows 1 2" |
---|
197 | return |
---|
198 | fi |
---|
199 | # Error si no se reciben 4 parámetros. |
---|
200 | [ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME REPO|CACHE str_imgname int_ndisk int_npart" || return $? |
---|
201 | |
---|
202 | # Sólo se ejecuta si es UEFI |
---|
203 | [ ogIsEfiActive ] || return |
---|
204 | |
---|
205 | # Parámetros de entrada |
---|
206 | IMGNAME="$2" |
---|
207 | INFOFILE="$OGIMG/.$IMGNAME.img.json" |
---|
208 | [ "${1^^}" == "CACHE" ] && INFOFILE="$OGCAC$INFOFILE" |
---|
209 | # TODO: que la función getPath soporte archivos ocultos |
---|
210 | ls $INFOFILE &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "$INFOFILE" || return $? |
---|
211 | DISK=$3 |
---|
212 | PART=$4 |
---|
213 | |
---|
214 | DEVICE=$(ogDiskToDev $DISK) |
---|
215 | read -e EFIDISK EFIPART <<<"$(ogGetEsp)" |
---|
216 | |
---|
217 | # Datos de la imagen |
---|
218 | IMGGUID=$(jq .guid $INFOFILE|tr -d \") |
---|
219 | IMGEFIGUID=$(jq .espguid $INFOFILE|tr -d \") |
---|
220 | |
---|
221 | # Datos actuales |
---|
222 | DATA=$(sfdisk -J $DEVICE) |
---|
223 | GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") |
---|
224 | |
---|
225 | if [ "$IMGGUID" != "$GUID" ]; then |
---|
226 | echo sgdisk -U "$IMGGUID" "$DEVICE" |
---|
227 | sgdisk -U "$IMGGUID" "$DEVICE" |
---|
228 | partprobe |
---|
229 | fi |
---|
230 | |
---|
231 | if [ $DISK -eq $EFIDISK ]; then |
---|
232 | EFIDATA=$DATA |
---|
233 | EFIDEVICE=$DEVICE |
---|
234 | else |
---|
235 | EFIDEVICE=$(ogDiskToDev $EFIDISK) || return $? |
---|
236 | EFIDATA=$(sfdisk -J $EFIDEVICE) |
---|
237 | EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") |
---|
238 | if [ "$IMGEFIGUID" != "$EFIGUID" ]; then |
---|
239 | echo sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" |
---|
240 | sgdisk -U "$IMGEFIGUID" "$EFIDEVICE" |
---|
241 | partprobe |
---|
242 | fi |
---|
243 | fi |
---|
244 | |
---|
245 | } |
---|
246 | |
---|
247 | # ogSaveImageInfo |
---|
248 | #@brief Crea un fichero con la información de la imagen. |
---|
249 | #@param int_ndisk nº de orden del disco |
---|
250 | #@param int_nfilesys nº de orden del sistema de archivos |
---|
251 | #@param REPO|CACHE repositorio |
---|
252 | #@param str_imgname nombre de la imagen |
---|
253 | #@exception OG_ERR_FORMAT formato incorrecto. |
---|
254 | #@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado. |
---|
255 | function ogSaveImageInfo () { |
---|
256 | local DISK PART IMGDIR IMGNAME INFO INFOFILE DEVICE DATA GUID |
---|
257 | local EFIPARTDEVICE EFIDEVICE EFIDATA EFIGUID |
---|
258 | |
---|
259 | # Si se solicita, mostrar ayuda. |
---|
260 | if [ "$*" == "help" ]; then |
---|
261 | ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys REPO|CACHE str_imgname" \ |
---|
262 | "$FUNCNAME 1 2 REPO Windows" |
---|
263 | return |
---|
264 | fi |
---|
265 | # Error si no se reciben 4 parámetros. |
---|
266 | [ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys REPO|CACHE str_imgname" || return $? |
---|
267 | |
---|
268 | DISK=$1 |
---|
269 | PART=$2 |
---|
270 | IMGDIR="$(ogGetParentPath "$3" "/$4")" |
---|
271 | # Si no existe el directorio de la imagen me salgo |
---|
272 | [ "$IMGDIR" != "" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? |
---|
273 | IMGNAME="$(basename "$4")" |
---|
274 | INFOFILE="$IMGDIR/.$IMGNAME.img.json" |
---|
275 | |
---|
276 | DEVICE=$(ogDiskToDev $DISK) || return $? |
---|
277 | DATA=$(sfdisk -J $DEVICE) |
---|
278 | GUID=$(echo $DATA|jq ".partitiontable|.id"|tr -d \") |
---|
279 | |
---|
280 | # Información de la imagen. Valor inicial de efi: false |
---|
281 | INFO=$(cat << EOT | jq . |
---|
282 | {"name":"$IMGNAME","efi":"false","guid":"$GUID"} |
---|
283 | EOT |
---|
284 | ) |
---|
285 | |
---|
286 | if ogIsEfiActive; then |
---|
287 | # Cambio valor de efi a true |
---|
288 | INFO=$(echo $INFO| jq --arg aux true '. + {efi: $aux}') |
---|
289 | |
---|
290 | # Obtener partición EFI. |
---|
291 | read -e EFIDISK EFIPART <<<"$(ogGetEsp)" |
---|
292 | EFIPARTDEVICE=$(ogDiskToDev $EFIDISK $EFIPART) || return $? |
---|
293 | if [ $DISK -eq $EFIDISK ]; then |
---|
294 | EFIDEVICE=$DEVICE |
---|
295 | EFIDATA=$DATA |
---|
296 | EFIGUID=$GUID |
---|
297 | else |
---|
298 | EFIDEVICE=$(ogDiskToDev $EFIDISK) |
---|
299 | EFIDATA=$(sfdisk -J $EFIDEVICE) |
---|
300 | EFIGUID=$(echo $EFIDATA|jq ".partitiontable|.id"|tr -d \") |
---|
301 | fi |
---|
302 | |
---|
303 | # Incluyo valor de EFIGUID (por si partición EFI en distinto disco que la de sistema) |
---|
304 | INFO=$(echo $INFO| jq --arg aux $EFIGUID '. + {espguid: $aux}') |
---|
305 | fi |
---|
306 | |
---|
307 | cat << EOT | jq . > $INFOFILE |
---|
308 | $INFO |
---|
309 | EOT |
---|
310 | } |
---|