source: client/engine/Cache.lib @ 927f98c

918-git-images-111dconfigure-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-instalacion
Last change on this file since 927f98c was 102a50e, checked in by Ramón M. Gómez <ramongomez@…>, 6 years ago

#906: Fix bug when defining a cache partition on NVMe disks.

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