Introducción al sistema de ficheros
En el sistema informático, se denomina sistema de ficheros a dos conceptos diferentes:
- La manera en la que se utiliza el espacio, físico, de almacenamiento disponible. Algunos sistemas de ficheros comunes son: FAT, NTFS, EXT4, XFS, JFS, ZFS y Btrfs.
- La manera en la que se estructuran, lógicamente, los ficheros desde el punto de vista del usuario.
Sistema de ficheros tipo Unix
Uno de los principios de Unix es que todo se representa como un fichero. Y el sistema de ficheros representa el universo en el que se encuentran todos los objetos.
El sistema de ficheros en Unix:
- Tiene una sola raíz y se representa por el carácter /
- Es jerárquico
- Para cada fichero, o directorio, se guarda metainformación: nombre, usuario, grupo, permisos, fecha de modificación...
Árbol de ficheros GNU/Linux
/
|-bin <- Ficheros ejecutables del sistema
|-boot <- Guarda la imagen del kernel que se utiliza en el arranque
|-dev <- Contiene los ficheros que representan a los dispositivos físicos
|-etc <- Contiene los ficheros de configuración
|-home <- Contiene los directorios personales de los usuarios
| |-usuario1
| :
| |-usuarioN
|-mnt <- Contiene los puntos de montaje para diferentes dispositivos
| |-floppy
| |-cdrom
| |-cdrw
|-proc <- VIRTUAL: Permite explorar/cambiar parámetros de funcionamiento del núcleo
|-root <- Directorio personal del superusuario
|-sbin <- Ficheros ejecutables del administrador
|-sys <- VIRTUAL: Permite explorar/cambiar parámetros de funcionamiento del núcleo
|-tmp <- Datos temporales
|-usr <- Datos compartidos por los usuarios
|-var <- Datos variables en el tiempo (colas de impresión, correo electrónico...)
El árbol de directorios estructura la información de acuerdo a dos criterios:
- Datos compartidos o datos privados: Los datos personales de cada usuario normalmente son privados, sin embargo, los datos con los que trabajan varios usuarios, o bien las aplicaciones instaladas en el sistema, deben estar disponibles para todos los usuarios.
- Datos cambiantes o datos invariables: Hay datos que no cambian con frecuencia, de hecho pueden ser inmutables hasta la próxima reinstalación del SO. También hay datos que cambian con frecuencia, como los mensajes de correo electrónico, o los documentos que se mandan a imprimir.
Los directorios /proc y /sys son el punto de entrada a unos sistemas de ficheros virtuales propios del núcleo Linux. Mediante los ficheros contenidos, el kernel Linux, expone al usuario y al resto de aplicaciones los parámetros de configuración y de funcionamiento propios del núcleo. La función de estos sistemas de ficheros no es almanecenar información, sino componer una interfaz para el núcleo.
Listado de ficheros
[vcarceler@gondolin ~]$ ll
total 444
drwx------ 3 vcarceler vcarceler 4096 sep 26 20:27 Desktop/
drwxrwxr-x 10 vcarceler vcarceler 4096 sep 26 20:30 Imaging-1.1.5/
-rw-rw-r-- 1 vcarceler vcarceler 429570 sep 26 20:27 Imaging-1.1.5.tar.gz
drwxrwxr-x 5 vcarceler vcarceler 4096 sep 13 13:18 media_antigua_web/
drwxrwxr-x 5 vcarceler vcarceler 4096 sep 12 11:47 plone-2.1/
drwx------ 3 vcarceler vcarceler 4096 sep 26 20:29 tmp/
[vcarceler@gondolin ~]$
[vcarceler@gondolin ~]$ ls
Desktop/ Imaging-1.1.5/ Imaging-1.1.5.tar.gz media_antigua_web/ plone-2.1/ tmp/
[vcarceler@gondolin ~]$
En el listado completo, para cada fichero se indica:
- Tipo de ficheros: Un carácter -> d, -, l, b, c, s, p (directorio, f. regular, enlace simbólico, disp. bloques, disp. carácteres, socket, pipe)
- Permisos: rwxrwxrwx
- Número de enlaces: 3 en el caso del primer directorio del listado
- Usuario: vcarceler
- Grupo: vcarceler
- Tamaño: 429570 Bytes en el caso del fichero Imaging-1.1.5.tar.gz
- Nombre de fichero
Nombre de los ficheros
En Unix el nombre de un fichero está formado por una sucesión de carácteres entre los que no se encuentra el carácter / que representa a la raíz.
Los nombres de los ficheros pueden contener espacios, mayúsculas, minúsculas, números y símbolos (exceptuando a la raíz), pero algunos carácteres (como *,?, ,",',`,[,],... pueden tener significados especiales en el shell, por lo que es necesario escaparlos).
Algunos sistemas de ficheros, como FAT, pueden imponer limitaciones a los nombres de los ficheros. Por ejemplo, en FAT se utilizan nombres de ficheros de hasta 8 carácteres más 3 de extensión.
Ficheros ocultos
Se consideran ficheros ocultos todos los que tienen un nombre que comienza con el carácter punto.
Un fichero oculto no es un fichero secreto, es sólo un fichero que por comodidad no aparece en los listados a no ser que se incluya la opción explícita. Si se quiere obtener el listado de un directorio, incluyendo los ficheros ocultos, se utilizará el parámetro -a del comando ls.
[vcarceler@gondolin ~]$ ls
Desktop/ Imaging-1.1.5/ Imaging-1.1.5.tar.gz media_antigua_web/ plone-2.1/ tmp/
[vcarceler@gondolin ~]$ ls -a
./ Desktop/ .gnome2/ .mailcap .oofficerc* .sversionrc
../ .dmrc .gnome2_private/ .mcop/ .openoffice/ .thumbnails/
.bash_history .fonts.cache-1 .ICEauthority .MdkOnline/ plone-2.1/ tmp/
.bash_logout .gconf/ Imaging-1.1.5/ media_antigua_web/ .qt/ .viminfo
.bash_profile .gconfd/ Imaging-1.1.5.tar.gz .mime.types .screenrc .Xauthority
.bashrc .gnome/ .kde/ .mozilla/ .ssh/ .xsession-errors
[vcarceler@gondolin ~]$
Entre los usos habituales de los ficheros ocultos tenemos:
- Los directorios . y .. que están contenidos en cualquier directorio y apuntan respectivamente al propio directorio y al directorio padre.
- Los ficheros de configuración o temporales que crean algunas aplicaciones.
Camino (o ruta) absoluto y camino relativo
En el árbol de ficheros, un archivo está identificado por su camino absoluto. El camino absoluto indica cómo está catalogado el fichero, es decir a qué directorios pertenece, desde la raíz del árbol de directorios.
El camino relativo indica cómo llegar a determinado fichero a partir del directorio actual.
/home/vcarceler/documento1.txt <- Camino absoluto
../fotos/marte.jpg <- Camino relativo
Algunos comandos Unix
Cuando nos movamos por el árbol de directorios y trabajemos con ficheros, encontraremos de utilidad los siguientes comandos:
Comando | Función |
---|---|
ls | Muestra un listado corto |
ls -l | Muestra un listado detallado |
ls -a | Muestra los ficheros ocultos |
pwd | Muestra el camino absoluto del directorio actual |
cd | Ejecutado sin argumentos, nos lleva a nuestro directorio personal |
cd - | Nos lleva al último directorio en el que estuvimos |
cd .. | Cambia al directorio padre del directorio actual |
cd /home | Nos lleva al directorio indicado (/home) |
cat <fichero> | Vuelca por la salida estándard el contenido del fichero |
mkdir <directorio> | Crea un directorio nuevo |
touch <fichero> | Si el fichero no existe lo crea, si existe le cambia la fecha al momento actual |
rm <fichero> | Borra el fichero |
cp <origen> <destino> | Copia el el fichero indicado en el lugar indicado |
mv <origen> <destino> | Mueve el fichero origen al lugar indicado. Cambia el nombre. |
du -hs <elemento> | Muestra el espacio consumido en disco por los ficheros o directorios |
mount | Muestra los sistemas de archivos montados (disponibles) |
df | Muestra información sobre el uso de los sistemas de archivos montados |
Permisos, dueño, grupo y resto del mundo
El sistema de permisos de Unix es sencillo, pero flexible y eficaz. Cada fichero (o directorio, los directorios son un tipo de fichero) cuenta con:
- Permisos especificados en la forma: rwxrwxrwx
- Usuario dueño del fichero
- Grupo al que pertenece el fichero
Por ejemplo, en el siguiente directorio (de nombre 'catman'), los permisos son 'rwxrwxr-x', el dueño del fichero es 'root' y el grupo al que pertenece el fichero es 'man'.
drwxrwxr-x 14 root man 4096 may 10 2005 catman/
Los permisos ('rwxrwxr-x' en el ejemplo) se aplican:
- Al dueño del fichero: Los tres primeros (rwx en el ejemplo)
- Al grupo al que pertenece el fichero: La segunda terna (rwx en el ejemplo)
- Al resto del mundo: La tercera y última terna (r-x en el ejemplo)
Cada permiso puede estar concedido (en cuyo caso se visualiza el carácter r,w o x según corresponda) o no (en cuyo caso se muestra un guión '-'). El significado de los permisos es muy directo, pero cambia según se trate de un fichero normal o de un directorio.
permiso | ficheros | directorios |
---|---|---|
r - (Read, lectura) | Se puede leer | Se puede obtener la lista de contenidos |
w - (Write, escritura) | Se puede escribir | Se pueden crear entradas en su interior, y es posible borrar el propio directorio. El propietario de un directorio siempre puede borrar el contenido, aunque no le pertenezca. |
x - (eXecution, ejecución) | Se puede ejecutar | Se puede acceder (entrar) al directorio |
El propietario de un fichero, o el administrador, puede cambiar los permisos y el grupo del fichero. El administrador puede cambiar el dueño de un fichero.
Los comandos utilizados son:
Comando | función |
---|---|
chmod <permisos> <fichero> | Cambia los permisos de un fichero. Ejemplos: chmod u+rwx fichero.txt |
chgrp <grupo> <fichero> | Cambia el grupo de un fichero. El usuario debe pertenecer al grupo indicado, el administrador puede realizar cualquier cambio. Ejemplo: chgrp usuarios fichero.txt |
chown <dueño> <fichero> chown .<grupo> <fichero> chown [dueño].[grupo] <fichero> |
Cambia el usuario y/o el grupo de un fichero. Sólo el administrador puede cambiar el dueño. Se debe pertenecer al grupo indicado. Ejemplos: chown alumno2 fichero.txt |
Algunos ejemplos prácticos:
Fichero en el que el dueño puede leer y escribir, quien pertenezca al grupo y el resto del mundo leer:
-rw-r--r-- 1 vcarceler vcarceler 0 nov 11 14:07 fichero
Fichero en el que sólo el dueño puede leer y escribir:
-rw------- 1 vcarceler vcarceler 0 nov 11 14:07 fichero
Fichero en el que todo el mundo puede leer, pero nadie escribir:
-r--r--r-- 1 vcarceler vcarceler 22 nov 11 14:12 fichero
Fichero que el dueño puede ejecutar, y el resto del mundo no:
---x------ 1 vcarceler vcarceler 7696 nov 11 14:20 hola*
Directorio en el que es posible consultar su contenido (lista de ficheros), pero no acceder:
dr-------- 2 vcarceler vcarceler 4096 nov 11 14:23 directorio/
[vcarceler@localhost pruebas]$ ll directorio/
total 0
[vcarceler@localhost pruebas]$ cd directorio/
bash: cd: directorio/: Permission denied
[vcarceler@localhost pruebas]$
Directorio en el que no es posible consultar su lista de ficheros, pero sí es posible acceder. Si supiesemos el nombre de uno de los ficheros que contiene, podriamos utilizarlo (si el fichero cuenta con los permisos adecuados):
[vcarceler@localhost pruebas]$ ll
total 4
d--x------ 2 vcarceler vcarceler 4096 nov 11 14:23 directorio/
[vcarceler@localhost pruebas]$ cd directorio/
[vcarceler@localhost directorio]$ ll
ls: .: Permission denied
[vcarceler@localhost directorio]$ cat hola
HoLa
[vcarceler@localhost directorio]$
Enlaces
Los enlaces son entradas en el árbol de directorios que apuntan a determinados datos guardados en disco.
Cada fichero normal y corriente es un enlace a los datos que contiene, pero es posible crear más enlaces que apunten a esos datos, de modo que en el árbol de directorios se cuenta con diferentes entradas (ficheros) que en realidad son los mismos datos en el disco.
Así es posible simular que un fichero se encuentra en varios directorios, o bien tiene distintos nombres, sin tener que duplicar sus datos.
Los subdirectorios . y .. que están en cada directorio de Unix, son enlaces a:
- El propio directorio
- El directorio padre
De esta manera es posible moverse por el árbol de directorios. Todos los ficheros regulares (y los directorios) de Unix son enlaces duros.
En Unix existen dos tipos de enlaces:
- Enlaces duros:
- Son los que se utilizan para crear los ficheros normales (o directorios). Cuando se muestra un listado largo (con ls -l) se indica el número de enlaces duros de cada fichero. Dos ficheros que apuntan a los mismos datos físicos (es decir, dos enlaces duros a los mismos datos) tienen el mismo número de i-nodo. Es posible verificar el número de i-nodo de un fichero con la órden ls -i.
- Enlaces simbólicos (o blandos):
- Los enlaces simbólicos son pequeños ficheros que guardan la ruta (path) a un elemento del sistema de archivos.
Características de los enlaces:
hard links (ln) | symbolic links (ln -s) |
---|---|
Son ficheros regulares | Son un tipo de fichero especial de Unix, la letra 'l' los distingue en los listados. |
Sólo pueden realizarse entre elementos del mismo sistema de archivos. (misma partición o volumen) | Pueden apuntar a cualquier elemento del árbol de ficheros. |
Se puede utilizar el número de i-nodo para saber a dónde apuntan. | Cada enlace simbólico, guarda la ruta a un objeto del árbol de directorios. |
En los listados largos se indica el número de enlaces. | |
No existe original y copia. Si hay dos enlaces a unos datos, los dos son originales. | Existen el fichero original, el enlace sólo es un enlace. |
Si se borra uno de los enlaces, no se borran los datos originales mientras quede algún enlace que los referencie. | Si se borra el fichero original, permanece el enlace apuntando a un objeto que ya no existe. Borrar el enlace, no implica nunca borrar el fichero original. |
Cada enlace cuenta con sus propios permisos. Pero estos permisos son los mismos para todos los elementos enlazados, si se cambian los permisos en un fichero cambian en todos. | Los enlaces no tienen permisos, se aplican los permisos del objeto con el que se enlaza. |
Sólo el administrador puede realizar enlaces a directorios. Pero normalmente es una opción bloqueada por seguridad. Consulte la opción -d de ln. | Cualquier usuario puede enlazar a ficheros o directorios. |
Ejemplo:
[vcarceler@localhost pruebas]$ vi fichero
[vcarceler@localhost pruebas]$ ll
total 4
-rw-r--r-- 1 vcarceler vcarceler 5 nov 12 17:14 fichero
[vcarceler@localhost pruebas]$ ln fichero enlace_a_fichero
[vcarceler@localhost pruebas]$ ln -s fichero enlace_simbólico_a_fichero
[vcarceler@localhost pruebas]$ ll -i
total 8
3117146 -rw-r--r-- 2 vcarceler vcarceler 5 nov 12 17:14 enlace_a_fichero
3117143 lrwxrwxrwx 1 vcarceler vcarceler 7 nov 12 17:15 enlace_simbólico_a_fichero -> fichero
3117146 -rw-r--r-- 2 vcarceler vcarceler 5 nov 12 17:14 fichero
[vcarceler@localhost pruebas]$
En esta captura de una sesión Unix, se puede ver:
- Como se edita y crea el fichero de nombre fichero
- Como se construye un enlace duro, de nombre enlace_a_fichero, que apunta a los datos de fichero
- A partir de ahora, no existe diferencia entre fichero y enlace_a_fichero. Ambos son un fichero original. Los datos no están duplicados en disco, si obtenemos un listado largo, observamos que el número de i-nodo (la primera columna) es el mismo para los dos ficheros. Además el número de enlaces, la tercera columna, es 2 para los dos elementos.
- Se crea un enlace simbólico de nombre enlace_simbólico_a_fichero que apunta a fichero. En el listado detallado se observa que el enlace simbólico tiene por tipo de fichero el carácter l -> link. Observe los permisos del enlace simbólico.
Preguntas:
- Qué ocurre si se hace un cat de cada uno de estos elementos. Hay diferencia ?
- Qué ocurre si se borra fichero ? Es posible acceder a enlace_a_fichero ? y a enlace_simbólico_a_fichero ?
- Si se crea un subdirectorio vacío ? cual es el número de enlaces de este subdirectorio ? porqué ?
Para saber más:
- Wikipedia: Sistema de archivos