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ón | Funció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ón | Funció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:
Programa | Funció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:
Comando | Funció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:
Campo | Comentario |
---|---|
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
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.
- 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. - 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 ~]# - 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/
NOTA: Es importante que mientras quotacheck escanea el sistema de ficheros nadie lo esté modificando.
[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 ~]# - 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 - 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]# - 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:
- Wikipedia: Comparison of file systems
- RHEL4: File Systems
- Practical File System Design with the Be File System
- http://en.wikipedia.org/wiki/Comparison_of_file_systems
- File System design, part 1: XFS
- Wikipedia: Sistema de archivos ZFS
- Nexenta OS: La primera distribución GNU/OpenSolaris
- Particiones cifradas con dm-crypt