source: client/engine/Cache.lib @ c21abbc

Last change on this file since c21abbc was 4181251, checked in by ramon <ramongomez@…>, 9 years ago

Versión 1.0.6a, #730: Integrar código y liberar la versión de mantenimiento OpenGnSys 1.0.6a.

git-svn-id: https://opengnsys.es/svn/trunk@4820 a21b9725-9963-47de-94b9-378ad31fedc9

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