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.

sábado, 23 de noviembre de 2013

Creación masiva de usuarios

Cuando se instala un servidor de ficheros, de FTP o similar, uno de los pasos posteriores consiste en crear un número razonablemente alto de usuarios en nuestro sistema Linux. Veamos una forma asequible de conseguir esto.

Crearemos un fichero de texto, usuarios.txt en nuestro caso, en el que cada linea corresponderá a un usuario:

login01:password01:1001:1001:Nombre del usuario 01:/var/ftp/:/bin/false
login02:password02:1002:1002:Nombre del usuario 02:/var/ftp/:/bin/false
login03:password03:1003:1003:Nombre del usuario 03:/var/ftp/:/bin/false
[...]

Los campos, separados por ":", significan lo siguiente:

  • login-01: el login del usuario que se quiere crear
  • password01: el password de dicho usuario, en texto claro
  • 1001: ID que va a tener el usuario. Tendremos que llevar cuidado para no elegir uno en uso (ver fichero /etc/passwd para comprobar los que están en uso)
  • 1001: ID del grupo al que va a pertenecer el usuario. Tendremos que llevar cuidado para no elegir uno en uso (ver fichero /etc/group para comprobar los que están en uso)
  • Nombre del usuario 01: Nombre completo del usuario
  • /var/ftp/: Directorio home del usuario. Este ejemplo podría ser adecuado para crear usuarios destinados a usar un servicio FTP.
  • /bin/false: Shell que usará el usuario al logarse en el sistema. En caso de usuarios que solo deban conectarse por FTP o por SAMBA podría ser adecuado, pues no permite acceder a un shell. En caso de necesitar shell, se podría poner /bin/bash o cualquier otro.

Y por último, hacemos la magia:

# newusers usuarios.txt

Todos los usuarios serán creados con los datos especificados. Y además, podemos guardarnos este fichero a modo de backup, por si el servidor se fastidia y hay que montar uno similar.

Comentar que esta forma de crear usuarios masivamente viene muy bien para ser usada con algún script que genere usuarios y contraseñas (aleatorias u obtenidas de una base de datos).

Como pega, si los usuarios se están creando para que accedan por SAMBA al servidor, habrá que hacer por cada uno de ellos un smbpasswd -a login01 para crearles la contraseña y permitirles el acceso vía SAMBA.