source: client/engine/Cache.lib @ 0a735488

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 0a735488 was 786fc3a, checked in by ramon <ramongomez@…>, 11 years ago

#541: Función ogFindCache recoge todas las particiones caché en discos GPT (aunque solo devuelve la primera).

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

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