source: client/engine/Cache.lib @ a6d6d6f

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 a6d6d6f was 16f28b7, checked in by irina <irinagomez@…>, 9 years ago

#724 ogCreateCache: se modifica la función para adaptarla a los cambios del comando sfdisk. initCache: se resuelve errata cuando no había cache intentaba borrarla.

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