source: client/engine/Cache.lib @ f7f7a21

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-instalacionwebconsole3
Last change on this file since f7f7a21 was bd597f6, checked in by adv <adv@…>, 7 years ago

#822 ogFormatCache realizar una llamada a updateBootCache

git-svn-id: https://opengnsys.es/svn/branches/version1.1@5568 a21b9725-9963-47de-94b9-378ad31fedc9

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