source: client/engine/Cache.lib @ 30fa5b4

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 30fa5b4 was 30fa5b4, checked in by Ramón M. Gómez <ramongomez@…>, 6 years ago

#906 Operations with partitions and images support NVMe

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