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" 55 # Si se recibe un parametro, sera el tamano de la cache 57 1) # Error, si no es un entero positivo
58 [[ $1 =~ ^[1-9][0-9]*$ ]] ||
ogRaiseError $OG_ERR_FORMAT
"$1" ||
return $?
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 $?
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 $?
86 # PATCH Para discos nvme la particion debe ser p1, p2, etc...en lugar de 1,2, sino falla
sfdisk 88 if [[ $DISK == *
"nvme"* ]]; then
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
99 START=$[END-SIZE+2048-(END-SIZE)%2048]
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
111 # Desmontar todos los sistemas de archivos del disco. 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. 117 if [ -z
"$PTTYPE" ]; then
118 PTTYPE=
"MSDOS" # Por defecto para discos vacíos.
121 case "$(ogGetPartitionTableType $NDSK)" in
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 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) 130 sgdisk $DISK -n$PART:$START:$END -c$PART:CACHE -t$PART:$ID 2>/dev/null
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.
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
150 # Actualiza la tabla de particiones en el kernel.
151 ogUpdatePartitionTable
177 local NDISK NPART DISK
178 # Si se solicita, mostrar ayuda. 179 if [
"$*" ==
"help" ]; then
180 ogHelp "$FUNCNAME" "$FUNCNAME" 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 $?
188 # Desmontar todos los sistemas de archivos del disco.
189 ogUnmountAll $NDISK 2>/dev/null
190 case "$(ogGetPartitionTableType $NDISK)" in
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
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
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
232 # Si se solicita, mostrar ayuda. 233 if [
"$*" ==
"help" ]; then
234 ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 1 4" 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}')}
244 # Por último revisar todos los discos GPT y obtener las particiones etiquetadas como caché. 245 if [ -z
"$PART" ]; then
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;}')" 252 # Devolver número de disco y número de partición de la 1ª partición encontrada. 278 local DEV MNTDIR OPTIONS
279 # Si se solicita, mostrar ayuda. 280 if [
"$*" ==
"help" ]; then
281 ogHelp "$FUNCNAME" "$FUNCNAME" 285 # Error si no hay definida partición de caché. 289 # Formatear sistema de ficheros. 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 $?
295 # Crear estructura básica.
297 mkdir -p $MNTDIR/$OGIMG
299 # Incluir kernel e Initrd del ogLive 300 updateBootCache 2>&1>/dev/null
321 # Si se solicita, mostrar ayuda. 322 if [
"$*" ==
"help" ]; then
323 ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 10000000" 326 # Error si no se encuentra partición de caché. 329 # Devuelve tamaño de la partición de caché.
330 ogGetPartitionSize $PART
352 local NDISK DISK NPART SECTORS CYLS ENDPART3
353 # Si se solicita, mostrar ayuda. 354 if [
"$*" ==
"help" ]; then
355 ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 23165386" 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 $?
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]
397 # Si se solicita, mostrar ayuda. 398 if [
"$*" ==
"help" ]; then
399 ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME ==> /mnt/sda4" 427 # Si se solicita, mostrar ayuda. 428 if [
"$*" ==
"help" ]; then
429 ogHelp "$FUNCNAME" "$FUNCNAME" 436 # Borrar enlace simbólico de /mnt/ParticiónCache.
function ogDiskToDev()
Devuelve la equivalencia entre el nº de orden del dispositivo (dicso o partición) y el nombre de fich...
function ogUnmountFs()
Desmonta un sistema de archivos. #.
function ogFormatCache()
Formatea el sistema de ficheros para la caché local. #.
function ogDevToDisk()
Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o ...
function ogGetPartitionTableType()
Devuelve el tipo de tabla de particiones del disco (GPT o MSDOS) #.
function ogRaiseError()
Devuelve el mensaje y el código de error correspondiente. #.
function ogHelp()
Muestra mensaje de ayuda para una función determinda. #.
function ogUnmountCache()
Desmonta la particion Cache y elimina la variable $OGCAC #.
function ogTypeToId()
Devuelve el identificador correspondiente a un tipo de partición. #.
function ogGetCacheSize()
Devuelve el tamaño definido para la partición de caché. #.
function ogIsMounted()
Comprueba si un sistema de archivos está montado. #.
function ogCreatePartitionTable()
Genera una tabla de particiones en caso de que no sea valida, si es valida no hace nada...
function ogMountFs()
Monta un sistema de archivos. #.
function ogDeleteCache()
Elimina la partición de caché local. #.
function ogGetLastSector()
Devuelve el último sector usable del disco o de una partición. #.
function ogMountCache()
Monta la partición Cache y exporta la variable $OGCAC #.
function ogCreateCache()
Define la caché local, por defecto en partición 4 del disco 1. #.
function ogFindCache()
Detecta la partición caché local. #.
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é. #.