Sistema de ficheros

El sistema de ficheros guarda de forma persistente la información que necesita el sistema informático. En los sistemas operativos tipo Unix, el árbol de ficheros es una metáfora que permite acceder a todos los elementos del sistema. Los datos, los programas, los procesos y los dispositivos están representados en el árbol de ficheros.

Como se explicó en la introducción al sistema de ficheros, en el SO coexisten distintas visiones del sistema de ficheros. La de más alto nivel es la que se expresa mediante el árbol de ficheros y directorios (que en Unix tiene una sola raiz, / ) y la de más bajo nivel concreta cómo se guardan la información físicamente en el dispositivo que contiene el sistema de ficheros.

 

Tipos de sistemas de ficheros

La función básica de un sistema de ficheros (en inglés file system) es preservar la información en un dispositivo de almacenamiento como un disco duro, o un DVD. Esta tarea se puede realizar de diferentes modos en función de la información que se va a guardar, las características del medio y el tipo de accesos que se van a realizar.

No obstante, existen sistemas de ficheros especializados que pueden tener otras funciones, como servir de interfaz entre el administrador y el núcleo del sistema informático, u otras funciones.

Tipos de sistemas de archivos:

De disco:
Tienen por función guardar ficheros en un dispositivo de almacenamiento. Algunos FS pueden soportar Journaling, una técnica que utiliza un diario para guardar los datos necesarios para restablecer un estado consistente del sistema de archivos tras un fallo.
Algunos FS de disco son:  EXT, FAT, ISO9660, NTFS, JFS, ReiserFS y XFS.
De red:
Permiten compartir ficheros entre diferentes dispositivos conectados a una red.
Algunos FS de red son: CIFS y NFS.
De base de datos:
En lugar de guardar los ficheros de forma jerárquica, se utiliza una base de datos para guardar los ficheros indexados por su metainformación (nombre, permisos, tipo de fichero, etc..). Es posible realizar búsquedas de ficheros en SQL o un lenguaje natural.
Algunos FS de base de datos son: BFS, Gnome VFS y WinFS.
De propósito específico:
Sistemas de ficheros que, por ejemplo, tienen por función mostrar ficheros de dispositivo (Udev), permitir que el núcleo muestre los procesos que controla (procfs) o permitir que núcleo utilice un espacio de almacenamiento secundario para la gestión de la memoria virtual (swap).

 

Administración de sistemas de ficheros

Desde el punto de vista del administrador, las operaciones a realizar con los sistemas de ficheros incluyen:

  • Creación
  • Montado/Desmontado
  • Copias de seguridad
  • Comprobaciones/reparaciones

 

Creación de un sistema de ficheros

Antes de utilizar un dispositivo de almacenamiento debe crearse un sistema de ficheros en su interior. Por ejemplo, un disco duro puede dividirse en 2 particiones, cada partición es un dispositivo de almacenamiento, en cada una de ellas se debe crear un sistema de archivos antes de poder escribir/ficheros.

En GNU/Linux se utiliza la herramienta mkfs para crear sistemas de ficheros. mkfs es símplemente una interfaz para llamar a la herramienta encargada de crear el tipo de sistema de ficheros especificado (mkfs.bfs, mkfs.ext2, mkfs.ext3, mkfs.minix, mkfs.msdos, mkfs.vfat, mkfs.xfs, ...). Para cada sistema de ficheros se pueden especificar diferentes opciones durante su creación, las páginas de manual del comando mkfs.* correspondiente enumeran los detalles.

Ejemplo: Creación de un sistema EXT3 con registro en el interior de un fichero (se utiliza un dispositivo loop)

[root@localhost ~]# dd if=/dev/zero of=fichero_100M bs=1M count=100
100+0 registros leídos
100+0 registros escritos
[root@localhost ~]# ll -h
total 101M
drwx------ 2 root root 4,0K dic 11 16:52 drakx/
-rw-r--r-- 1 root root 100M mar 5 14:17 fichero_100M
drwx------ 2 root root 4,0K feb 28 12:51 tmp/
drwxr-xr-x 3 root root 4,0K ene 15 17:06 workspace/
[root@localhost ~]# losetup /dev/loop0 fichero_100M
[root@localhost ~]# losetup -a
/dev/loop/0: [0301]:1586203 (fichero_100M)
[root@localhost ~]# mkfs.ext3 -v -L "Prueba" -j /dev/loop0
mke2fs 1.38 (30-Jun-2005)
Etiqueta del sistema de ficheros=Prueba
Tipo de SO: Linux
Tamaño del bloque=1024 (bitácora=0)
Tamaño del fragmento=1024 (bitácora=0)
25688 nodos i, 102400 bloques
5120 bloques (5.00%) reservados para el súper usuario
Primer bloque de datos=1
13 bloque de grupos
8192 bloques por grupo, 8192 fragmentos por grupo
1976 nodos i por grupo
Respaldo del súper bloque guardado en los bloques:
8193, 24577, 40961, 57345, 73729

Mientras se escribían las tablas de nodos i: terminado
Creando el fichero de transacciones (4096 bloques): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho

Este sistema de ficheros se revisará automáticamente cada 25 meses o
180 dias, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.
[root@localhost ~]#

 

Montado/Desmontado

Antes de que se pueda utilizar un sistema de archivos, debe montarse. Cuando se monta, se establece la conexión entre el árbol de directorios y los datos que contiene el sistema de archivos, para ello se utiliza un punto de montaje. Cuando se desmonta el sistema de archivos se termina el vínculo creado durante el montaje, y el contenido del sistema de archivos desmontado ya no es accesible.

En los ordenadores personales, la operación de montado y desmontado algunas veces es automática. Al introducir un CD o un dispositivo USB puede que el ordenador lo monte automáticamente, en tal caso cuando lo retiramos se desmonta el sistema de ficheros. Sin embargo, en los servidores hay que prestar atención especial a qué sistemas de archivos se montan, cuando y cómo. Normalmente es el administrador quien debe tomar estas decisiones.

El punto de montaje es el directorio de nuestro árbol de directorios que permitirá acceder a los contenidos del nuevo sistema de archivos montado. Montar un sistema de archivos es parecido a extender una alfombra, mientras está desplegada nos tapa el suelo, así que si montamos un sistema de archivos en un directorio que no está vacío, mientras tengamos el sistema de archivos montado no podremos ver los contenidos originales del directorio. Sin embargo al desmontar el sistema de archivos, es decir al recoger la alfombra, volveremos a ver lo que estaba oculto.

En Unix normalmente se utiliza el directorio /mnt para contener a los puntos de montaje de los dispositivos removibles.

En principio sólo el administrador del sistema puede montar/desmontar sistemas de archivos, pues se trata de una operación potencialmente peligrosa.

Sistemas de archivos montados

El comando mount ejecutado sin argumentos muestra una lista de los sistemas de archivos montados y sus opciones.

[root@localhost ~]# mount
/dev/hda1 on / type ext3 (rw)
none on /proc type proc (rw)
none on /proc/bus/usb type usbfs (rw)
none on /sys type sysfs (rw)
none on /mnt/floppy type supermount (rw,sync,dev=/dev/fd0,fs=ext2:vfat,--)
[root@localhost ~]#

En el ejemplo anterior se puede ver que la raíz del sistema (/) actúa como punto de montaje para el sistema de archivos, de tipo ext3, contenido en /dev/hda1. Además se puede ver que en /proc y en /proc/bus/usb están montados respectivamente un sistema de ficheros tipo proc y uno tipo usbfs, ambos son sistemas de archivos de propósito especial. El directorio /mnt/floppy está controlado por el software supermount que controla de manera automática el montado/desmontado del floppy.

Montado de un sistema de archivos

El comando mount se utiliza para montar el sistema de archivos, contenido en un dispositivo, en un punto de montaje.

[root@localhost mnt]# losetup -a
/dev/loop/0: [0301]:1586203 (fichero_100M)
[root@localhost mnt]# mount /dev/loop0 /mnt/fichero0/
[root@localhost mnt]# mount
/dev/hda1 on / type ext3 (rw)
none on /proc type proc (rw)
none on /proc/bus/usb type usbfs (rw)
none on /sys type sysfs (rw)
none on /mnt/floppy type supermount (rw,sync,dev=/dev/fd0,fs=ext2:vfat,--)
/dev/loop0 on /mnt/fichero0 type ext3 (rw)
[root@localhost mnt]#

Apartir de este momento en /mnt/fichero0 se mostrará el contenido del sistema de archivos contenido en /dev/loop0 (que está conectado con el fichero /root/fichero_100M).

Cuando se monta un sistema de archivos se pueden especificar opciones de montado, algunas de ellas son genéricas a todos los sistemas de archivos (montar en modo lectura/escritura o sólo lectura), otras dependen del sistema de archivos que se esté utilizando. La página de manual de mount enumera las diferentes opciones.

Algunas opciones de montado son:

OpciónFunción
-r o bien -o ro
Monta en modo de sólo lectura
-w o bien -o rw
Monta en modo de lectura/escritura. Es el modo por defecto.
-o
Permite especificar un conjunto de opciones separadas por comas
async Entrada/salida asíncrona
atime Actualiza la fecha de acceso para cada acceso. Activada por defecto.
defaults
Equivalente a: rw, suid, dev, exec, auto, nouser, async
dev
Interpreta ficheros que representan a dispositivos de bloques o carácteres
exec
Permite la ejecución de binarios
noatime
No actualiza la fecha de acceso para los ficheros de este sistema de ficheros. Se incrementa la velocidad de trabajo.
nodev
No se interpretan ficheros que representan a dispositivos
noexec
No se permite la ejecución de binarios
sync
Toda la entrada/salida será sincrona

Cuando se montan sistemas de ficheros que no tienen soporte para la metainformación típica de Unix (usuario, grupo, permisos...), se decide qué valores se deben suponer para estos datos.

Así al montar un sistema de archivos FAT, es posible indicar cosas como:

  • Todos los ficheros tendrán por usuario el UID x
  • Todos los ficheros tendrán por grupo el GID y
  • Los permisos de los ficheros serán z


Algunas opciones muy comunes de FAT son:

Opción
Función
uid UID para los ficheros. Por defecto se utiliza el del proceso que monta el sistema de ficheros
gid GID para los ficheros. Por defecto se utiliza el del proceso que monta el sistema de ficheros
umask Máscara de permisos para los ficheros (Se indican los permisos que no están concedidos)
dmask Máscara de permisos para los directorios
fmask Máscara de permisos para los ficheros regulares

Desmontar un sistema de ficheros

Para desmontar un sistema de ficheros se utiliza el comando umount y se pasa como argumento el directorio que es el punto de montaje a desmontar. Es muy importante tener en cuenta que un sistema de archivos ocupado, porque tiene ficheros abiertos o algún proceso tiene el directorio actual en su interior, no puede ser desmontado.

Algunas opciones comunes del comando umount son:

OpciónFunción
r Si no se puede desmontar, se intenta volver a montar en modo de sólo lectura
d Si el dispositivo era un /dev/loop, se libera
l Desconecta el sistema de archivos del árbol de directorios ahora, y limpia todas las referencias
al sistema de archivos tan pronto como sea posible

Ejemplo: Desmontando un sistema de ficheros

[root@localhost ~]# df -h
S.ficheros Tamaño Usado Disp Uso% Montado en
/dev/hda1 27G 8,2G 18G 32% /
/dev/loop0 97M 4,1M 88M 5% /mnt/fichero0
[root@localhost ~]# umount /mnt/fichero0/
[root@localhost ~]# df -h
S.ficheros Tamaño Usado Disp Uso% Montado en
/dev/hda1 27G 8,2G 18G 32% /
[root@localhost ~]# losetup -a
/dev/loop/0: [0301]:1586203 (/root/fichero_100M)
[root@localhost ~]#

 

Copias de seguridad

La cuestión no es si fallará un disco duro, es cuando lo hará. Además los problemas hardware no son los únicos que nos podemos encontrar. Cualquier descuido en el manejo de los fichero puede hacer que perdamos datos valiosos, así que siempre debemos tener copias de seguridad desde la que podamos restaurar la información.

Las copias de seguridad son un aspecto clave en la administración de sistemas informáticos, se merecen un capítulo propio, pero a modo de introducción debemos distinguir entre:

  • Información instalada de forma automática: Los programas y herramientas que acompañan al sistema operativo pueden volverse a instalar en caso de desastre desde el soporte original.
  • Información creada por los usuarios: Los datos de los usuarios, aquella información que generan no es posible recuperarla si no realiza una copia de seguridad previa al desastre.

 

Por otro lado, son muchas las opciones a la hora de realizar una copia de seguridad, per podemos distinguir entre:

  • Copias integrales o totales: Una copia completa que por sí sola permite restaurar el estado de la información previo al desastre
  • Copias parciales o diferenciales: Una copia que sólo guarda las modificaciones realizadas desde la última copia. Por lo tanto, para recuperarla es necesaria la copia completa y las diferentes copias parciales realizadas.


Algunos programas que se pueden utilizar en el proceso de backup son:

ProgramaFunción
tar Muy utilizado para crear archivos en ficheros normales. Originalmente se creó para realizar copias de seguridad en cinta (Tape ARchive)
cpio Similar a tar
dd Diseñado para leer y escribir bloques. Puede realizar conversiones de formato en el proceso
xfsdump/xfsrestore Copia/Restaura sistemas de archivos XFS en bloque
rsync
Copia ficheros/cambios en local o de forma remota
Amanda, Bacula, Clonezilla
Software que permite la realización automática de copias de seguridad en red

Comprobaciones y reparaciones

Una de las peores situaciones con las que nos podemos encontrar es con un sistema de archivos corrupto. La causa más común es un fallo en la alimentación eléctrica mientras se estaba escribiendo. Los sistemas de archivos con diario, como EXT3, XFS, JFS o ReiserFS, son mucho más tolerantes a estas caidas.

Algunos comandos utilizados para combrobar y reparar errores en los sistemas de ficheros son:

ComandoFunción
fsck Comprueba y repara sistemas de archivos.
Es una interfaz para diferentes fsck.* propios de cada sistema de archivos
badblocks Busca bloques defectuosos en un dispositivo
dumpe2fs Obtiene información sobre un sistema de archivos
tune2fs Permite ajustar propiedades de un sistema de archivos EXT2/3
blkid Muestra el UUID y tipo de sistema de ficheros de un dispositivo además de otros atributos
filefrag Muestra información sobre la fragmentación de un fichero

Ficheros de configuración

Existen diferentes ficheros que definen:

  • /etc/fstab -> Los sistemas de archivos a montar durante el arranque
  • /etc/mtab -> Los sistemas de archivos que se encuentran montados
  • /proc/filesystem -> Los sistemas de archivos reconocidos por el núcleo

 

/etc/fstab

Define los sistemas de archivos a montar durante el arranque.

En una de nuestras máquinas, tiene el siguiente contenido:

# This file is edited by fstab-sync - see 'man fstab-sync' for details
/dev/hda1 / ext3 defaults 1 1
/dev/hdc /mnt/cdrom auto umask=0022,user,iocharset=iso8859-15,codepage=850,noauto,ro,exec,users 0 0
/dev/hdd /mnt/cdrom2 auto umask=0022,user,iocharset=iso8859-15,codepage=850,noauto,ro,exec,users 0 0
none /mnt/floppy supermount dev=/dev/fd0,fs=ext2:vfat,--,umask=0022,iocharset=iso8859-15,sync,codepage=850 0 0
none /proc proc defaults 0 0
/dev/hda5 swap swap defaults 0 0

 

Cada línea define un sistema de archivos con los siguientes campos:

CampoComentario
Dispositivo Dispositivo de almacenamiento que contiene al sistema de ficheros
Punto de montaje
Directorio del árbol de directorios a partir del cual se accede al sistema de archivos
Tipo Sistema de ficheros, o bien auto para detectarlo automáticamente
Opciones Opciones de montado, son las mismas que se pueden indicar con el parámetro -o en el comando mount
FS Freq
Valor numérico que indica a dump si se debe hacer un volcado de este sistema de archivos
FS passno
Valor numérico que indica el orden en el que se deben comprobar (con fsck) los sistemas de archivos durante
el arranque.
La raíz debe tener un valor 1 y el resto de sistemas de ficheros 2. Si el valor es 0 significa que no es necesario
realizar ninguna coprobación.

/etc/mtab

Con una sintáxis idéntica a /etc/fstab muestra qué sistemas de archivos están montados

 

Cuotas de disco

Ventana de administración de las cuotas de disco en Windows NT. Gentileza de la Wikipedia

El sistema de cuotas de disco permite limitar el uso de espacio de almacenamiento en un sistema de ficheros tanto a usuarios como a grupos. Los límites se imponen a usuarios y grupos de un sistema de ficheros. Cada sistema de ficheros puede tener sus propios límites.

Normalmente se pueden imponer dos tipos de límites:

  • Límite blando: El usuario o el grupo lo puede rebasar, durante un periodo de gracia. El sistema avisa cuando el usuario lo rebasa.
  • Límite duro: El usuario o el grupo no lo puede rebasar. No debe ser inferior al límite blando.


Se pueden limitar dos conceptos:

  • El consumo, en bloques, de espacio de almacenamiento: Se limita el tamaño máximo que puede  ocupar el conjunto de ficheros en el sistema de archivos.
  • El número de inodos utilizados: Se limita el número de ficheros que se pueden tener.

 

Activando las cuotas de disco:

Evidentemente para que las cuotas de disco estén disponibles se debe utilizar un FS que las soporte, por ejemplo: NTFS, EXT, XFS, JFS o ReiserFS. También es necesario montar el sistema de archivos con las opciones usrquota y grpquota según se vayan a utilizar las cuotas de usuario, grupo o ambas.

Normalmente el paquete quota proporciona las herramientas de administración para las cuotas de disco. Si no está instalado hay que instalarlo.

En el siguiente ejemplo se utilizará un dispositivo loop para crear un sistema de archivos en un fichero. Después, se montará el sistema de archivos con opciones de soporte de cuota.

  1. Inicializamos el dispositivo de almacenamiento con un sistema de archivos:
    [root@localhost ~]# dd if=/dev/zero of=fichero_100M.iso bs=1M count=100
    100+0 registros leídos
    100+0 registros escritos
    [root@localhost ~]# ll -h fichero_100M.iso
    -rw-r--r-- 1 root root 100M mar 8 11:50 fichero_100M.iso
    [root@localhost ~]# losetup /dev/loop0 fichero_100M.iso
    [root@localhost ~]# mkfs.ext3 -L prueba /dev/loop0
    mke2fs 1.38 (30-Jun-2005)
    Etiqueta del sistema de ficheros=prueba
    Tipo de SO: Linux
    Tamaño del bloque=1024 (bitácora=0)
    Tamaño del fragmento=1024 (bitácora=0)
    25688 nodos i, 102400 bloques
    5120 bloques (5.00%) reservados para el súper usuario
    Primer bloque de datos=1
    13 bloque de grupos
    8192 bloques por grupo, 8192 fragmentos por grupo
    1976 nodos i por grupo
    Respaldo del súper bloque guardado en los bloques:
    8193, 24577, 40961, 57345, 73729

    Mientras se escribían las tablas de nodos i: terminado
    Creando el fichero de transacciones (4096 bloques): hecho
    Escribiendo superbloques y la información contable del sistema de ficheros: hecho

    Este sistema de ficheros se revisará automáticamente cada 21 meses o
    180 dias, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.
  2. Montamos el sistema de ficheros con las opciones de soporte para cuotas de usuario y grupo:
    [root@localhost ~]# mount -o usrquota,grpquota /dev/loop0 /mnt/prueba/
    [root@localhost ~]# mount
    /dev/hda1 on / type ext3 (rw)
    none on /proc type proc (rw)
    none on /proc/bus/usb type usbfs (rw)
    none on /sys type sysfs (rw)
    none on /mnt/floppy type supermount (rw,sync,dev=/dev/fd0,fs=ext2:vfat,--)
    /dev/loop0 on /mnt/prueba type ext3 (rw,usrquota,grpquota)
    [root@localhost ~]#
  3. Utilizamos el comando quotacheck para crear los archivos de control de cuotas. Estos archivos (aquota.user y aquota.group) estarán en la raíz del sistema de archivos que controlan. Si se utiliza XFS no existen estos archivos,pues la información de control de cuotas se almacena como metadatos.
    [root@localhost ~]# quotacheck -ugc /mnt/prueba/
    [root@localhost ~]# ll /mnt/prueba/
    total 24
    -rw------- 1 root root 6144 mar 8 12:05 aquota.group
    -rw------- 1 root root 6144 mar 8 12:05 aquota.user
    drwx------ 2 root root 12288 mar 8 11:53 lost+found/
    [root@localhost ~]#
    NOTA: Es importante que mientras quotacheck escanea el sistema de ficheros nadie lo esté modificando.
  4. Editamos las cuotas para un usuario o grupo con edquota.
    [root@localhost ~]# edquota -u -f /mnt/prueba/ vcarceler

    Se utilizará el editor declarado por la variable EDITOR (normalmente vi) para editar la cutoa del usuario. Al guardar y cerrar el editor se actualizan los valores de cuota.
    Disk quotas for user vcarceler (uid 500):
    Filesystem blocks soft hard inodes soft hard
    /dev/loop0 0 5000 10000 0 0 0
  5. Comprobamos la aplicación de las cuotas. Podemos utilizar quotaon para comprobar que las cuotas están activas en el sistema de ficheros, si no lo estuviesen las activamos.
    [root@localhost mnt]# quotaon -pgu /mnt/prueba/
    group quota on /mnt/prueba (/dev/loop0) is off
    user quota on /mnt/prueba (/dev/loop0) is off
    [root@localhost mnt]# quotaon -gu /mnt/prueba/
    [root@localhost mnt]# quotaon -pgu /mnt/prueba/
    group quota on /mnt/prueba (/dev/loop0) is on
    user quota on /mnt/prueba (/dev/loop0) is on
    [root@localhost mnt]# repquota -ua
    *** Report for user quotas on device /dev/loop0
    Block grace time: 7days; Inode grace time: 7days
    Block limits File limits
    User used soft hard grace used soft hard grace
    ----------------------------------------------------------------------
    root -- 4127 0 0 3 0 0
    vcarceler -- 0 5000 10000 0 0 0


    [root@localhost mnt]#
  6. A partir de ahora, las cuotas están en marcha. El usuario puede utilizar el comando quota para comprobar la disponibilidad de recursos y el administrador puede utilizar las herramientas de administración (repquota, quotastats, quotaon, quotaoff, quotacheck)

 

Más información: