source: client/engine/Cache.lib @ f8a75f18

opengnsys-1.0.6b
Last change on this file since f8a75f18 was f2ac15a, checked in by ramon <ramongomez@…>, 8 years ago

#754: Congelar versión de mantenimiento en rama tags/opengnsys-1.0.6b.

git-svn-id: https://opengnsys.es/svn/tags/opengnsys-1.0.6b@5144 a21b9725-9963-47de-94b9-378ad31fedc9

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