source: client/engine/Cache.lib @ 31c92b6

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacion
Last change on this file since 31c92b6 was d959834, checked in by Ramón M. Gómez <ramongomez@…>, 6 years ago

#906: Declaring new variables as local.

  • Property mode set to 100755
File size: 15.1 KB
RevLine 
[311532f]1#!/bin/bash
2#/**
3#@file    Cache.lib
4#@brief   Librería o clase Cache
5#@class   Cache
6#@brief   Funciones para gestión de la caché local de disco.
[d959834]7#@version 1.1.1
[311532f]8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
[de088a3]13#         ogCreateCache [int_ndisk] int_partsize
[80519e1]14#@brief   Define la caché local, por defecto en partición 4 del disco 1.
[de088a3]15#@param   int_ndisk  numero de disco donde crear la cache, si no se indica es el 1 por defecto
[80519e1]16#@param   int_npart      número de partición (opcional, 4 por defecto)
[311532f]17#@param   int_partsize   tamaño de la partición (en KB)
18#@return  (nada, por determinar)
19#@exception OG_ERR_FORMAT   formato incorrecto.
20#@note    Requisitos: sfdisk, parted, awk, sed
[4c475a32]21#@warning El tamaño de caché debe estar entre 50 MB y la mitad del disco.
22#@warning La caché no puede solaparse con las particiones de datos.
[f4b737d]23#@version 0.9.1 - Definición de caché local.
[311532f]24#@author  Ramon Gomez, ETSII Universidad de Sevilla
25#@date    2010/03/09
[f4b737d]26#@version 0.9.2 - Corrección definición de límites.
27#@author  Ramon Gomez, ETSII Universidad de Sevilla
28#@date    2010/06/01
[d1f50e9]29#@version 1.0.4 - Soporte para discos GPT.
30#@author  Universidad de Huelva
31#@date    2012/03/13
[de088a3]32#@version 1.0.5 - Posibilidad de crear la cache en cualquier disco duro
33#@author  Universidad de Huelva
34#@date    2012/09/18
[80519e1]35#@version 1.1.0 - Posibilidad de crear la caché en cualquier partición.
36#@author  Ramon Gomez, ETSII Universidad de Sevilla
37#@date    2016/05/25
[9f9a3b8]38#@version 1.1.0 - Soporte discos con sectores de 4k
39#@date    2017/01/09
40#@version 1.0.6b - Al crear las particiones ordenamos los dispositivos en el fichero auxiliar.
41#@author  Irina Gomez, ETSII Universidad de Sevilla
42#@date    2017/01/09
[311532f]43#*/ ##
44function ogCreateCache ()
45{
46# Variables locales.
[d959834]47local FINDCACHE IOSIZE NDSK SIZECACHE PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE
48local PTTYPE ID TMPFILE NVME_PREFIX
[311532f]49# Si se solicita, mostrar ayuda.
50if [ "$*" == "help" ]; then
[80519e1]51    ogHelp "$FUNCNAME" "$FUNCNAME [int_ndisk [int_npart]] int_partsize" \
52           "$FUNCNAME 10000000" "$FUNCNAME 1 10000000" "$FUNCNAME 1 4 10000000"
[311532f]53    return
54fi
[de088a3]55# Si se recibe un parametro, sera el tamano de la cache
56case $# in
57    1)  # Error, si no es un entero positivo
58        [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
59        NDSK=1
[80519e1]60        PART=4
[de088a3]61        SIZECACHE=$1
62        ;;
63    2)  # Error, si no son enteros positivos
64        [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
65        [[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $?
66        NDSK=$1
[80519e1]67        PART=4
[de088a3]68        SIZECACHE=$2
69        ;;
[80519e1]70    3)  # Error, si no son enteros positivos
71        [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
72        [[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $?
73        [[ $3 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$3" || return $?
74        NDSK=$1
75        PART=$2
76        SIZECACHE=$3
77        ;;
[de088a3]78    *)  ogRaiseError $OG_ERR_FORMAT
79        return $?
80        ;;
81esac
82
[16f28b7]83TMPFILE=/tmp/sfdisk$$
[b1f1311]84DISK=$(ogDiskToDev $NDSK) || return $?
[30fa5b4]85
86 # PATCH Para discos nvme la particion debe ser p1, p2, etc...en lugar de 1,2, sino falla sfdisk
87NVME_PREFIX=""
88if [[ $DISK == *"nvme"* ]]; then
89        NVME_PREFIX="p"
90fi
91
92
[5792125]93END=$[$(ogGetLastSector $NDSK 2>/dev/null)]  # Sector final del disco.
[de088a3]94SIZE=$[$SIZECACHE*2]                            # Tamaño en sectores de 512 B.
[9f9a3b8]95# Inicio partición cache según el disco tenga sectores de 4k o menores
96IOSIZE=$(fdisk -l $DISK | awk '/I\/O/ {print $4}')
97if [ $IOSIZE -eq 4096 ]; then
98    END=$[$END-8192]
[8076226]99    START=$[END-SIZE+2048-(END-SIZE)%2048]
[9f9a3b8]100else
101    START=$[END-SIZE+1]
102fi
[5792125]103ENDPREVPART=$[$(ogGetLastSector $NDSK $[PART-1] 2>/dev/null)]
[b1f1311]104# Error si tamaño no está entre límites permitidos o si se solapa con la partición anterior.
[de088a3]105MINSIZE=25000                   # Error de formateo si tamaño < 50 MB.
106MAXSIZE=$END                    # Para restringir tamaño > mitad del disco:  MAXSIZE=$[END/2]
[d1f50e9]107if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPREVPART ]; then
[311532f]108    ogRaiseError $OG_ERR_FORMAT "$1" || return $?
109fi
110
111# Desmontar todos los sistemas de archivos del disco.
[de088a3]112ogUnmountAll $NDSK 2>/dev/null
[311532f]113# Definir particiones y notificar al kernel.
[5792125]114# En el caso de ser disco GPT, de momento se borra la particion y se vuelve a crear,
115# por lo que se pierden los datos.
116PTTYPE=$(ogGetPartitionTableType $NDSK)
117if [ -z "$PTTYPE" ]; then
118    PTTYPE="MSDOS"                      # Por defecto para discos vacíos.
119    ogCreatePartitionTable $NDSK $PTTYPE
120fi
[b1f1311]121case "$(ogGetPartitionTableType $NDSK)" in
[d1f50e9]122    GPT)
123        # Si la tabla de particiones no es valida, volver a generarla.
[80519e1]124        [ ! $(sgdisk -p $DISK &>/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK
[d1f50e9]125        # Si existe la cache se borra previamente
[a39c456]126        [ -n "$(ogFindCache)" ] && ogDeleteCache
[d1f50e9]127        # Capturamos el codigo de particion GPT para cache
[5af5d5f]128        ID=$(ogTypeToId CACHE GPT)
[9f9a3b8]129        sgdisk $DISK -n$PART:$START:$END -c$PART:CACHE -t$PART:$ID 2>/dev/null
[d1f50e9]130        ;;
131    MSDOS)
132        # Si la tabla de particiones no es valida, volver a generarla.
[80519e1]133        parted -s $DISK print &>/dev/null || fdisk $DISK <<< "w"
[d1f50e9]134        # Definir particiones y notificar al kernel.
[5af5d5f]135        ID=$(ogTypeToId CACHE MSDOS)
[16f28b7]136        # Salvamos la configuración de las particiones e incluimos la cache.
137        trap "rm -f $TMPFILE" 1 2 3 9 15
138        sfdisk --dump $DISK | grep -v $DISK$PART > $TMPFILE
[30fa5b4]139        echo  "$DISK$NVME_PREFIX$PART : start= $START, size= $SIZE, Id=$ID" >> $TMPFILE
[9f9a3b8]140        # Ordenamos las líneas de los dispositivos
141        UNIT=$(grep unit $TMPFILE)
142        grep ^/dev $TMPFILE|sort -o $TMPFILE
143        sed -i "1i $UNIT\n" $TMPFILE
[16f28b7]144        # Guardamos nueva configuración en el disco.
[9f9a3b8]145        sfdisk --no-reread  $DISK < $TMPFILE
[16f28b7]146        rm -f $TMPFILE
[d1f50e9]147        ;;
148esac
[9f9a3b8]149# Actualiza la tabla de particiones en el kernel.
150ogUpdatePartitionTable
[311532f]151}
152
153
154#/**
155#         ogDeleteCache
156#@brief   Elimina la partición de caché local.
157#@return  (nada, por determinar)
158#@exception OG_ERR_FORMAT   formato incorrecto.
[c59b3d1]159#@note    Requisitos: fdisk, sgdisk, partprobe
[311532f]160#@version 0.91 - Definición de caché local.
161#@author  Ramon Gomez, ETSII Universidad de Sevilla
162#@date    2010/03/11
[d1f50e9]163#@version 1.0.4 - Soporte para discos GPT.
164#@author  Universidad de Huelva
165#@date    2012/03/13
[64a9cb5]166#@version 1.0.6b - llamada correcta a ogUpdatePartitionTable
167#@author  Antonio Doblas Universidad de Málaga
168#@date    2016/11/16
[c59b3d1]169#@version 1.1.0 - Sustituir "sfdisk" por "fdisk" para discos MSDOS.
170#@author  Ramon Gomez, ETSII Universidad de Sevilla
171#@date    2016/05/25
[311532f]172#*/ ##
173function ogDeleteCache ()
174{
175# Variables locales.
176local NDISK NPART DISK
177# Si se solicita, mostrar ayuda.
178if [ "$*" == "help" ]; then
179    ogHelp "$FUNCNAME" "$FUNCNAME"
180    return
181fi
182# Error si no se encuentra partición de caché.
183read NDISK NPART <<<"$(ogFindCache)"
[5a4f399]184[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
[311532f]185DISK=$(ogDiskToDev $NDISK)
186
187# Desmontar todos los sistemas de archivos del disco.
188ogUnmountAll $NDISK 2>/dev/null
[eb1f900]189case "$(ogGetPartitionTableType $NDISK)" in
[d1f50e9]190    GPT)
191        # Si la tabla de particiones no es valida, volver a generarla.
192        [ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK
[64a9cb5]193        sgdisk $DISK -d$NPART 2>/dev/null
[d1f50e9]194        ;;
195    MSDOS)
196        # Si la tabla de particiones no es valida, volver a generarla.
[c59b3d1]197        parted -s $DISK print &>/dev/null || fdisk $DISK <<< "w"
198        # Eliminar la partición de caché.
[64a9cb5]199        echo -e "d\n$NPART\nw" | fdisk $DISK 2>/dev/null
[80519e1]200        ;;
[d1f50e9]201esac
[311532f]202# Borrar etiqueta de la caché.
203rm -f /dev/disk/by-label/CACHE
[64a9cb5]204#Actualiza la tabla de particiones en el kernel.
205ogUpdatePartitionTable $NDISK
[311532f]206}
207
208
209#/**
210#         ogFindCache
211#@brief   Detecta la partición caché local.
212#@param   No requiere parametros
213#@return  int_ndisk int_npart - devuelve el par nº de disco-nº de partición .
214#@warning Si no hay cache no devuelve nada
[985bef0]215#@version 0.1 - Integracion para Opengnsys - EAC: FindCache() en ATA.lib -  HIDRA: DetectarCache.sh
216#@author Ramon Gomez, ETSII Universidad de Sevilla
217#@Date    2008/06/19
218#@author  Antonio J. Doblas Viso. Universidad de Malaga
219#@Date    2008/10/27
220#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
[311532f]221#@author  Ramon Gomez, ETSII Universidad de Sevilla
222#@date    2010/03/16
[3156760]223#@version 1.0.5 - Obtener caché en discos GPT.
224#@author  Alberto García, Universidad de Málaga y Ramon Gomez, ETSII Universidad de Sevilla
225#@date    2014/05/28
[311532f]226#*/ ##
227function ogFindCache ()
228{
229# Variables locales
[3156760]230local DISK PART
[311532f]231# Si se solicita, mostrar ayuda.
232if [ "$*" == "help" ]; then
233    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  1 4"
234    return
235fi
[3156760]236# Obtener el dispositivo del sistema de archivos etiquetado como "CACHE".
237PART=$(blkid -L "CACHE")
238
239# Si no se detecta, obtener particiones marcadas de tipo caché en discos MSDOS.
[ad3f531]240PART=${PART:-$(sfdisk -l 2>/dev/null | awk '$6~/ca|a7/ {print $1}')}
[311532f]241
[3156760]242# Por último revisar todos los discos GPT y obtener las particiones etiquetadas como caché.
243if [ -z "$PART" ]; then
244    for DISK in $(ogDiskToDev); do
[786fc3a]245        # Nota: se añade espacio separador solo si existe valor previo.
246        PART="${PART:+"$PART "}$(sgdisk -p $DISK 2>/dev/null | awk -v d=$DISK '$7~/CACHE/ {printf "%s%s",d,$1;}')"
[3156760]247    done 
248fi
[1cbf9e0]249
[3156760]250# Devolver número de disco y número de partición de la 1ª partición encontrada.
251ogDevToDisk ${PART%% *} 2>/dev/null
[311532f]252}
253
254
255#/**
256#         ogFormatCache
257#@brief   Formatea el sistema de ficheros para la caché local.
258#@return  (por determinar)
259#@warning Prueba con formato Reiser.
260#@attention
261#@note    El sistema de archivos de la caché se queda montado.
[985bef0]262#@version 0.1 -  Integracion para Opengnsys  - EAC: FormatCache() en ATA.lib
[311532f]263#@author  Antonio J. Doblas Viso. Universidad de Malaga
[985bef0]264#@date   2008/10/27
265#@version 0.91 - Creacion cache local.
[311532f]266#@author  Ramon Gomez, ETSII Universidad de Sevilla
267#@date    2010-03-11
[bd597f6]268#@version 1.1.0 - llamada a updateBootCache.
269#@author  Antonio J. Doblas Viso. Universidad de Malaga
270#@date    2018-01-21
271
[311532f]272#*/ ##
273function ogFormatCache ()
274{
275# Variables locales.
276local DEV MNTDIR
277# Si se solicita, mostrar ayuda.
278if [ "$*" == "help" ]; then
279    ogHelp "$FUNCNAME" "$FUNCNAME"
280    return
281fi
282
[b0a4c8c]283# Error si no hay definida partición de caché.
284DEV=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
285DEV=$(ogDiskToDev $DEV) || return $?
286
287# Formatear sistema de ficheros.
288ogUnmountCache 2>/dev/null
289mkfs.ext4 -q -F $DEV -L "CACHE" -O extent,large_file 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $?
290
291# Crear estructura básica.
292MNTDIR=$(ogMountCache)
293mkdir -p $MNTDIR/$OGIMG
[bd597f6]294
295# Incluir kernel e Initrd del ogLive
296updateBootCache 2>&1>/dev/null
[311532f]297}
298
299
300#/**
301#         ogGetCacheSize
302#@brief   Devuelve el tamaño definido para la partición de caché.
303#@return  int_partsize   tamaño de la partición (en KB)
304#@exception OG_ERR_PARTITION  No existe partición de caché.
[985bef0]305#@version 0.1 -  Integracion para Opengnsys  -  EAC: InfoCache() en FileSystem.lib
306#@author  Antonio J. Doblas Viso. Universidad de Malaga
307#@date   2008/10/27
308#@version 0.91 - Definicion de cache local.
[311532f]309#@author  Ramon Gomez, ETSII Universidad de Sevilla
310#@date    2010/03/09
311#*/ ##
312function ogGetCacheSize ()
313{
314# Variables locales
315local PART
316
317# Si se solicita, mostrar ayuda.
318if [ "$*" == "help" ]; then
319    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  10000000"
320    return
321fi
322# Error si no se encuentra partición de caché.
[5a4f399]323PART=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
[311532f]324
325# Devuelve tamaño de la partición de caché.
326ogGetPartitionSize $PART
327}
328
329
330#/**
331#         ogGetCacheSpace
332#@brief   Devuelve el espacio de disco disponible para la partición de caché.
333#@return  int_size   tamaño disponible (en KB)
334#@note    El espacio disponible es el que hay entre el límite superior de la partición 3 del disco 1 y el final de dicho disco, y no puede ser superior a la mitad de dicho disco.
[985bef0]335#@version 0.1 -  Integracion para Opengnsys  -  EAC: InfoCache() en FileSystem.lib
336#@author  Antonio J. Doblas Viso. Universidad de Malaga
337#@date   2008/10/27
338#@version 0.91 - Definicion de cache local.
[311532f]339#@author  Ramon Gomez, ETSII Universidad de Sevilla
340#@date    2010/03/09
[de088a3]341#@version 1.0.5 - Uso de ogFindCache para detectar disco y particion
342#@author  Universidad de Huelva
343#@date    2012/09/18
[311532f]344#*/ ##
345function ogGetCacheSpace ()
346{
347# Variables locales.
[de088a3]348local NDISK DISK NPART SECTORS CYLS ENDPART3
[311532f]349# Si se solicita, mostrar ayuda.
350if [ "$*" == "help" ]; then
351    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  =>  23165386"
352    return
353fi
[de088a3]354# Parche UHU para usar ogFindCache en lugar de 1
355# Error si no se encuentra partición de caché.
356read NDISK NPART <<<"$(ogFindCache)"
357[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
358DISK=$(ogDiskToDev $NDISK) || return $?
[311532f]359
360SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
361CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
362SECTORS=$[SECTORS/CYLS*CYLS-1]
363ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
364# Mostrar espacio libre en KB (1 KB = 2 sectores)
365if [ $ENDPART3 -gt $[SECTORS/2] ]; then
366    echo $[(SECTORS-ENDPART3)/2]
367else
368    echo $[SECTORS/4]
369fi
370}
371
372
373#/**
374#         ogMountCache
375#@brief   Monta la partición Cache y exporta la variable $OGCAC
376#@param   sin parametros
377#@return  path_mountpoint - Punto de montaje del sistema de archivos de cache.
378#@warning Salidas de errores no determinada
[985bef0]379#@version 0.1 -  Integracion para Opengnsys  -  EAC: MountCache() en FileSystem.lib - HIDRA: MontarCache.sh
380#@author  Ramon Gomez, ETSII Universidad de Sevilla
381#@date    2008/06/19
[311532f]382#@author  Antonio J. Doblas Viso. Universidad de Malaga
[985bef0]383#@Date    2008/10/27
384#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
[311532f]385#@author  Ramon Gomez, ETSII Universidad de Sevilla
386#@date    2010/03/16
[92a6c37]387#@version 1.0 - Correccion multiples montajes de cache.
388#@author  Antonio J. Doblas Viso, Universidad de Malaga
389#@date    2011/02/24
[311532f]390#*/ ##
391function ogMountCache ()
392{
393# Si se solicita, mostrar ayuda.
394if [ "$*" == "help" ]; then
395    ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME  ==>  /mnt/sda4"
396    return
397fi
398
[92a6c37]399ogMountFs $(ogFindCache) 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
[311532f]400}
401
402
403#/**
404#         ogUnmountCache
405#@brief   Desmonta la particion Cache y elimina la variable $OGCAC
406#@param   sin parametros
407#@return  nada
408#@warning Salidas de errores no determinada
[985bef0]409#@version 0.1 -  Integracion para Opengnsys  -  EAC: UmountCache() en FileSystem.lib
[311532f]410#@author  Antonio J. Doblas Viso. Universidad de Malaga
[985bef0]411#@Date    2008/10/27
412#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
[311532f]413#@author  Ramon Gomez, ETSII Universidad de Sevilla
414#@date    2010/03/16
[92a6c37]415#@version 1.0 - Correccion multiples montajes de cache.
416#@author  Antonio J. Doblas Viso, Universidad de Malaga
417#@date    2011/02/24
[311532f]418#*/ ##
419function ogUnmountCache ()
420{
[5a4f399]421# Variables locales.
422local CACHE
[311532f]423# Si se solicita, mostrar ayuda.
424if [ "$*" == "help" ]; then
425    ogHelp "$FUNCNAME" "$FUNCNAME"
426    return
427fi
428
[5a4f399]429CACHE=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE"
[92a6c37]430ogIsMounted $CACHE || return 0
[5a4f399]431ogUnmountFs $CACHE
432# Borrar enlace simbólico de /mnt/ParticiónCache.
433rm -f $(ogDiskToDev $CACHE | sed 's/dev/mnt/')
[311532f]434}
435
Note: See TracBrowser for help on using the repository browser.