lunes, 23 de diciembre de 2013

Liberar espacio reservado para root

Alguna vez nos puede ocurrir que una partición se nos queda pequeña. Inicialmente se plantean unos tamaños para cada una de las particiones del sistema, pero por un motivo u otro, con el tiempo, se nos queda pequeña.

Hay un método rápido para "aumentar" como máximo un 5% el espacio libre de esta partición: liberar bloques reservados para el usuario root. Para el que no lo sepa, cuando se crea una partición y se formatea en ext3 o ext4 siempre se reserva un 5% de su capacidad para ser usada exclusivamente por el usuario root, y solo en el caso en que el espacio restante (95%) se haya llenado. Esta característica sirve para que un sistema con la partición raíz al 100% de uso (en realidad 95% de uso) permita que el usuario root acceda al servidor y pueda liberar espacio. Y es que algo tan básico como un login en un servidor requiere escritura en logs, y si no hay espacio disponible no se podría acceder al sistema.

Como ejemplo, veamos este servidor con una partición raiz muy pequeña:

root@servidor:~# df -h
S.ficheros            Tamaño Usado  Disp Uso% Montado en
/dev/sda1             3,8G  1,9G  1,7G  53% /

Ahora mismo dispone de 1'7 GB libres y su porcentaje de uso es del 53%.

Para comprobar qué cantidad de bloques tiene reservados para root ejecutamos:

root@servidor:~# tune2fs -l /dev/sda1
tune2fs 1.41.11 (14-Mar-2010)
Filesystem volume name:  
Last mounted on:          /
Filesystem UUID:          c43a6eba-bf59-457b-91fb-47fb191c6ba7
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              247504
Block count:              988160
Reserved block count:     49408
Free blocks:              524078
Free inodes:              171389
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      241
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         7984
Inode blocks per group:   499
Flex block group size:    16
Filesystem created:       Mon Jul 11 12:36:10 2011
Last mount time:          Sat Jul  6 15:57:59 2013
Last write time:          Wed Apr 10 19:15:59 2013
Mount count:              2
Maximum mount count:      27
Last checked:             Wed Apr 10 19:15:59 2013
Check interval:           15552000 (6 months)
Next check after:         Mon Oct  7 19:15:59 2013
Lifetime writes:          242 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      11342c1f-9c65-4104-98dd-1fa1f9235977
Journal backup:           inode blocks

Si nos fijamos en estas dos lineas:

Block count:              988160
Reserved block count:     49408

Y dividimos 49408/988160 nos sale 0'05, es decir, un 5% del total de bloques están reservados para root.

Vamos a reducir este porcentaje al 2% con el fin de "liberar" un poco de espacio. En caliente, sin desmontar la partición, ejecutamos:

root@servidor:~# tune2fs -m 2 /dev/sda1
tune2fs 1.41.11 (14-Mar-2010)
Se pone el porcentaje de bloques reservados a 2% (19763 bloques)

Si volvemos a ejecutar el comando tune2fs -l /dev/sda1 obtendremos los siguientes valores:

Block count:              988160
Reserved block count:     19763

Y 19763/988160 da un porcentaje de 2%.

Con df -h podemos ver el ligero aumento de espacio disponible:

root@servidor:~# df -h
S.ficheros            Tamaño Usado  Disp Uso% Montado en
/dev/sda1             3,8G  1,9G  1,8G  52% /

Cuanto mayor sea la partición, mayor será el espacio liberado. Por ejemplo, para una partición de 500 GB, un 5% supone 25 GB. Es una cantidad muy importante.

Por último, comentar que este espacio reservado también se puede dejar a 0:

# tune2fs -m 0 /dev/sda1

domingo, 8 de diciembre de 2013

Función para sh "Bytes to Human Readable" (bytestohr)

El otro día estaba escribiendo un script en el que quería mostrar en pantalla, entre otras cosas, la cantidad de información traspasada por rsync entre dos máquinas. La cantidad la tenía en bytes y me interesaba mostrarla en KB, MB o GB.

Dicen que reinventar la rueda es una pérdida de tiempo, así que me puse a buscar alguna función en sh que lo hiciese. Y me tropecé con esta: bytestohr escrita en ksh.

Tras unos pequeños ajustes para que funcionase en sh, aquí va:

bytestohr()
{
    # Convert input parameter (number of bytes)
    # to Human Readable form
    #
    SLIST="bytes,KB,MB,GB,TB,PB,EB,ZB,YB"

    POWER=1
    VAL=$( echo "scale=2; $1 / 1" | bc)
    VINT=$( echo $VAL / 1024 | bc )
    while [ $VINT -gt 0 ]
    do
        POWER=$(expr $POWER + 1)
        VAL=$( echo "scale=2; $VAL / 1024" | bc)
        VINT=$( echo $VAL / 1024 | bc )
    done

    echo $VAL $( echo $SLIST | cut -f $POWER -d, )
}

Como cualquier otra función en sh, la forma de llamarla es la siguiente:

$ bytestohr 65456456
62.42 MB

Simple pero efectiva.