OpenGnsys  1.1.1
Cache.lib
Ir a la documentación de este archivo.
1 #!/bin/bash
2 #
12 # ##
44 function ogCreateCache ()
45 {
46 # Variables locales.
47 local FINDCACHE IOSIZE NDSK SIZECACHE PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE
48 local PTTYPE ID TMPFILE NVME_PREFIX
49 # Si se solicita, mostrar ayuda.
50 if [ "$*" == "help" ]; then
51  ogHelp "$FUNCNAME" "$FUNCNAME [int_ndisk [int_npart]] int_partsize" \
52  "$FUNCNAME 10000000" "$FUNCNAME 1 10000000" "$FUNCNAME 1 4 10000000"
53  return
54 fi
55 # Si se recibe un parametro, sera el tamano de la cache
56 case $# 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  ;;
81 esac
82 
83 TMPFILE=/tmp/sfdisk$$
84 DISK=$(ogDiskToDev $NDSK) || return $?
85 
86  # PATCH Para discos nvme la particion debe ser p1, p2, etc...en lugar de 1,2, sino falla sfdisk
87 NVME_PREFIX=""
88 if [[ $DISK == *"nvme"* ]]; then
89  NVME_PREFIX="p"
90 fi
91 
92 
93 END=$[$(ogGetLastSector $NDSK 2>/dev/null)] # Sector final del disco.
94 SIZE=$[$SIZECACHE*2] # Tamaño en sectores de 512 B.
95 # Inicio partición cache según el disco tenga sectores de 4k o menores
96 IOSIZE=$(fdisk -l $DISK | awk '/I\/O/ {print $4}')
97 if [ $IOSIZE -eq 4096 ]; then
98  END=$[$END-8192]
99  START=$[END-SIZE+2048-(END-SIZE)%2048]
100 else
101  START=$[END-SIZE+1]
102 fi
103 ENDPREVPART=$[$(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.
105 MINSIZE=25000 # Error de formateo si tamaño < 50 MB.
106 MAXSIZE=$END # Para restringir tamaño > mitad del disco: MAXSIZE=$[END/2]
107 if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPREVPART ]; then
108  ogRaiseError $OG_ERR_FORMAT "$1" || return $?
109 fi
110 
111 # Desmontar todos los sistemas de archivos del disco.
112 ogUnmountAll $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.
116 PTTYPE=$(ogGetPartitionTableType $NDSK)
117 if [ -z "$PTTYPE" ]; then
118  PTTYPE="MSDOS" # Por defecto para discos vacíos.
119  ogCreatePartitionTable $NDSK $PTTYPE
120 fi
121 case "$(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  ;;
149 esac
150 # Actualiza la tabla de particiones en el kernel.
151 ogUpdatePartitionTable
152 }
153 
154 
155 # ##
174 function ogDeleteCache ()
175 {
176 # Variables locales.
177 local NDISK NPART DISK
178 # Si se solicita, mostrar ayuda.
179 if [ "$*" == "help" ]; then
180  ogHelp "$FUNCNAME" "$FUNCNAME"
181  return
182 fi
183 # Error si no se encuentra partición de caché.
184 read NDISK NPART <<<"$(ogFindCache)"
185 [ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
186 DISK=$(ogDiskToDev $NDISK)
187 
188 # Desmontar todos los sistemas de archivos del disco.
189 ogUnmountAll $NDISK 2>/dev/null
190 case "$(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  ;;
202 esac
203 # Borrar etiqueta de la caché.
204 rm -f /dev/disk/by-label/CACHE
205 #Actualiza la tabla de particiones en el kernel.
206 ogUpdatePartitionTable $NDISK
207 }
208 
209 
210 # ##
228 function ogFindCache ()
229 {
230 # Variables locales
231 local DISK PART
232 # Si se solicita, mostrar ayuda.
233 if [ "$*" == "help" ]; then
234  ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 1 4"
235  return
236 fi
237 # Obtener el dispositivo del sistema de archivos etiquetado como "CACHE".
238 PART=$(blkid -L "CACHE")
239 # En discos nvme con particiones GPT la partición se detecta usando el tag PARTLABEL
240 PART=${PART:-$(blkid -t PARTLABEL=CACHE | awk -F: '{print $1}')}
241 # Si no se detecta, obtener particiones marcadas de tipo caché en discos MSDOS.
242 PART=${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é.
245 if [ -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
250 fi
251 
252 # Devolver número de disco y número de partición de la 1ª partición encontrada.
253 ogDevToDisk ${PART%% *} 2>/dev/null
254 }
255 
256 
257 # ##
275 function ogFormatCache ()
276 {
277 # Variables locales.
278 local DEV MNTDIR OPTIONS
279 # Si se solicita, mostrar ayuda.
280 if [ "$*" == "help" ]; then
281  ogHelp "$FUNCNAME" "$FUNCNAME"
282  return
283 fi
284 
285 # Error si no hay definida partición de caché.
286 DEV=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
287 DEV=$(ogDiskToDev $DEV) || return $?
288 
289 # Formatear sistema de ficheros.
290 ogUnmountCache 2>/dev/null
291 OPTIONS="extent,large_file"
292 [[ $(uname -r) =~ ^5 ]] && OPTIONS+=",uninit_bg,^metadata_csum,^64bit"
293 mkfs.ext4 -q -F $DEV -L "CACHE" -O "$OPTIONS" 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $?
294 
295 # Crear estructura básica.
296 MNTDIR=$(ogMountCache)
297 mkdir -p $MNTDIR/$OGIMG
298 
299 # Incluir kernel e Initrd del ogLive
300 updateBootCache 2>&1>/dev/null
301 }
302 
303 
304 # ##
316 function ogGetCacheSize ()
317 {
318 # Variables locales
319 local PART
320 
321 # Si se solicita, mostrar ayuda.
322 if [ "$*" == "help" ]; then
323  ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 10000000"
324  return
325 fi
326 # Error si no se encuentra partición de caché.
327 PART=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
328 
329 # Devuelve tamaño de la partición de caché.
330 ogGetPartitionSize $PART
331 }
332 
333 
334 # ##
349 function ogGetCacheSpace ()
350 {
351 # Variables locales.
352 local NDISK DISK NPART SECTORS CYLS ENDPART3
353 # Si se solicita, mostrar ayuda.
354 if [ "$*" == "help" ]; then
355  ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 23165386"
356  return
357 fi
358 # Parche UHU para usar ogFindCache en lugar de 1
359 # Error si no se encuentra partición de caché.
360 read NDISK NPART <<<"$(ogFindCache)"
361 [ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
362 DISK=$(ogDiskToDev $NDISK) || return $?
363 
364 SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
365 CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
366 SECTORS=$[SECTORS/CYLS*CYLS-1]
367 ENDPART3=$(sfdisk -uS -l $DISK | awk -v P="${DISK}3" '{if ($1==P) print $3}')
368 # Mostrar espacio libre en KB (1 KB = 2 sectores)
369 if [ $ENDPART3 -gt $[SECTORS/2] ]; then
370  echo $[(SECTORS-ENDPART3)/2]
371 else
372  echo $[SECTORS/4]
373 fi
374 }
375 
376 
377 # ##
395 function ogMountCache ()
396 {
397 # Si se solicita, mostrar ayuda.
398 if [ "$*" == "help" ]; then
399  ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME ==> /mnt/sda4"
400  return
401 fi
402 
403 ogMountFs $(ogFindCache) 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
404 }
405 
406 
407 # ##
423 function ogUnmountCache ()
424 {
425 # Variables locales.
426 local CACHE
427 # Si se solicita, mostrar ayuda.
428 if [ "$*" == "help" ]; then
429  ogHelp "$FUNCNAME" "$FUNCNAME"
430  return
431 fi
432 
433 CACHE=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE"
434 ogIsMounted $CACHE || return 0
435 ogUnmountFs $CACHE
436 # Borrar enlace simbólico de /mnt/ParticiónCache.
437 rm -f $(ogDiskToDev $CACHE | sed 's/dev/mnt/')
438 }
439 
function ogDiskToDev()
Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fich...
Definition: Disk.lib:484
function ogUnmountFs()
Desmonta un sistema de archivos. #.
function ogFormatCache()
Formatea el sistema de ficheros para la caché local. #.
Definition: Cache.lib:275
function ogDevToDisk()
Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o ...
Definition: Disk.lib:403
function ogGetPartitionTableType()
Devuelve el tipo de tabla de particiones del disco (GPT o MSDOS) #.
Definition: Disk.lib:962
function ogRaiseError()
Devuelve el mensaje y el código de error correspondiente. #.
Definition: System.lib:188
function ogHelp()
Muestra mensaje de ayuda para una función determinda. #.
Definition: System.lib:153
function ogUnmountCache()
Desmonta la particion Cache y elimina la variable $OGCAC #.
Definition: Cache.lib:423
function ogTypeToId()
Devuelve el identificador correspondiente a un tipo de partición. #.
Definition: Disk.lib:1522
function ogGetCacheSize()
Devuelve el tamaño definido para la partición de caché. #.
Definition: Cache.lib:316
function ogIsMounted()
Comprueba si un sistema de archivos está montado. #.
Definition: FileSystem.lib:581
function ogCreatePartitionTable()
Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada...
Definition: Disk.lib:289
function ogMountFs()
Monta un sistema de archivos. #.
Definition: FileSystem.lib:766
function ogDeleteCache()
Elimina la partición de caché local. #.
Definition: Cache.lib:174
function ogGetLastSector()
Devuelve el último sector usable del disco o de una partición. #.
Definition: Disk.lib:735
function ogMountCache()
Monta la partición Cache y exporta la variable $OGCAC #.
Definition: Cache.lib:395
function ogCreateCache()
Define la caché local, por defecto en partición 4 del disco 1. #.
Definition: Cache.lib:44
function sfdisk()
Definition: ToolsGNU.c:139
function ogFindCache()
Detecta la partición caché local. #.
Definition: Cache.lib:228
function mkfs()
Definition: ToolsGNU.c:117
function ogUnmountAll()
Desmonta todos los sistema de archivos de un disco, excepto el caché local. #.
function ogGetCacheSpace()
Devuelve el espacio de disco disponible para la partición de caché. #.
Definition: Cache.lib:349
function fdisk()
Definition: ToolsGNU.c:101
function parted()
Definition: Disk.lib:13
function awk()
Definition: ToolsGNU.c:89