sistema de archivos

De Wikiunix

Sistema de archivos
Información de los directorios base que conforman el sistema de archivos de los sistemas Unix
Tiempo 3 horas
Nivel Usuario iniciado
Bibliografía Organizacion de los directorios en LinuxIntroducción a Linux. Directorios y archivos en Wikilibros
Prerrequisitos Jerarquía de directoriosSoporte para pruebas

Todo en el sistema Unix son archivos, por lo que el sistema de archivos es indispensable para el éxito y utilidad del sistema Unix.

Es la parte del núcleo más visible por los usuarios; se encarga de abstraer propiedades físicas de diferentes dispositivos para proporcionar una interfaz única de almacenamiento: el archivo. Cada sistema Unix tiene su sistema de archivos nativo (por ejemplo, ext2 en Linux, UFS en Solaris o EFS en IRIX), por lo que para acceder a todos ellos de la misma forma el núcleo de Unix incorpora una capa superior denominada VFS (Virtual File System) encargada de proporcionar un acceso uniforme a diferentes tipos de sistema de ficheros.


Contenido

Conceptos básicos sobre archivos

El sistema no impone estructura alguna a los archivos, ni asigna significado a su contenido; el significado de los bytes depende únicamente de los programas que interpretan el archivo. Esto es así tanto para archivos en disco como para dispositivos periféricos.

Cada byte de un archivo contiene un número de tamaño suficiente para representar un carácter. El código empleado en la mayoría de los sistemas Unix es ASCII (Código Norteamericano Estándar para Intercambio de Información), pero algunos equipos, entre los que sobresalen los de IBM, usan un código llamado EBCDIC (Código Extendido de Intercambio Decimal Codificado en Binario).

Los programas obtienen los datos de un archivo por medio de una llamada al sistema (una rutina del núcleo) llamada read . Cada vez que se invoca a read , esta regresa la siguiente porción de un archivo, la siguiente línea de texto tecleada en la terminal , por ej. read también indica cuantos bytes trae el archivo, por lo que al final del archivo es identificado en el momento en que read dice “ se traen cero bytes”. Si se hubieran quedado algunos bytes en el archivó, read los hubiera leído. En realidad , tiene sentido no representar el final de un archivo con algún valor en especial, ya que, como se menciono anteriormente , el significado de los bytes depende de como se vaya a interpretar el archivo. Pero todos los archivos tienen un final, y como todos los archivos deben accesarse por medio de read , regresar un cero es una manera de representar el final de un archivo ( independientemente de cualquier representación ) sin introducir ningún carácter especial.


Tipos de archivo

En un sistema Unix típico existen tres tipos básicos de archivos:

  • ficheros planos: son secuencias de bytes que a priori no poseen ni estructura interna ni contenido significante para el sistema: su significado depende de las aplicaciones que interpretan su contenido.
  • directorios: archivos cuyo contenido son otros ficheros de cualquier tipo (planos, más directorios, o ficheros especiales).
  • ficheros especiales (dispositivos): ficheros que representan dispositivos del sistema.
    • dispositivos orientados a carácter
    • dispositivos orientados a bloque
La principal diferencia entre ambos es la forma de realizar operaciones de entrada/salida: mientras que los dispositivos orientados a carácter las realizan byte a byte (esto es, carácter a carácter), los orientados a bloque las realizan en bloques de caracteres.

Nota: Generalmente, al hablar de ficheros nos solemos referir a todos ellos si no se especifica lo contrario.


Sistemas de ficheros

Respecto a los sistemas de ficheros soportados debemos destacar la gran variedad de ellos, actualmente podemos encontrar (entre otros):

  • Sistemas asociados a GNU/Linux: como el estándar ext2 y el ext3, evolución del anterior con concepto de journaling (soporte de log de operaciones realizadas en el sistema de fichero que puede permitir su recuperación en caso de algún desastre que lo haga inconsistente).
  • Compatibilidad con entornos no GNU/Linux: msdos, vfat, ntfs, acceso a los diferentes sistemas de fat16, fat32 y ntfs. En ciertos casos está limitado a lectura, pero existen soluciones en espacio de usuario (mediante FUSE, un componente que permite escribir sistemas de ficheros en espacio de usuario). También se dispone de compatibilidad a otros entornos como Mac con hfs y hfsplus.
  • Sistems asociados a soportes físicos: como CD/DVD como los iso9660 y udf.
  • Sistemas usados en diferentes Unix: ofrecen generalmente mejor rendimiento (a veces a costa de mayor consumo de recursos, en CPU por ejemplo), como JFS2 (IBM), XFS (SGI) o ReiserFS.
  • Sistemas de ficheros en red: NFS, Samba (smbfs, cifs) permiten acceder a sistemas de ficheros disponibles en otras máquinas de forma transparente por red.
  • Sistemas distribuidos en red: como GFS, Coda.
  • Pseudo Sistemas de ficheros: como procfs (/proc) o sysfs (/sys).

Permisos

Cada archivo tiene un conjunto de permisos asociados con él, los cuales determinan qué puede hacerse con el archivo y quien puede hacerlo.

Existe un usuario especial en cada sistema UNIX, llamado superusuario, quien puede leer o modificar cualquier archivo en el sistema. La clase de acceso especial root posee privilegios de superusuario: esta la emplean los administradores del sistema cuando llevan a cabo el mantenimiento del mismo. Existe también un comando llamado su que otorga un status de superusuario si se conoce la contraseña de root. Por eso no es recomendable guarda ningún material confidencial en el sistema de archivos.

Existen tres tipos de permisos para cada archivo:

  • lectura (r): examinar su contenido
  • escritura (w): modificar su contenido
  • ejecución (x)

Se puede aplicar un permiso diferente a cada persona. Como dueño (user) de un archivo, el lector posee un conjunto de permisos de lectura, escritura y ejecución. Su grupo (group) tiene otro conjunto. Los demás (others) tienen un tercer conjunto.

Nota: Los permisos para borrar archivos son independientes del archivo mismo. Si el usuario tiene permiso de escritura en un directorio, puede borrar archivos contenidos en éste, incluso los que estén protegidos contra escritura.

Notación simbólica

El esquema de notación simbólica se compone de 10 caracteres, donde el primer carácter indica el tipo de fichero:

Valor Descripción
- Fichero regular
d Directorio
b Fichero especial como dispositivo de bloque
c Fichero de carácter especial
l Enlace simbólico
p Tubería nombrada (FIFO)
s Socket

Entonces el esquema completo de la notación sería:

Tipo de fichero Permisos
User Group Others
Lectura Escritura Ejecución Lectura Escritura Ejecución Lectura Escritura Ejecución
- d b c l p s r - w - x - r - w - x - r - w - x -


Notación octal

La notación octal se compone de valores de tres a cuatro dígitos en base 8. Con la notación octal de tres dígitos cada número representa un componente diferente de permisos a establecer: clase de usuario, clase de grupo y clase de otros respectivamente. Cada uno de estos dígitos es la suma de sus bits que lo componen (en el sistema numeral binario). Como resultado, bits específicos se añaden a la suma conforme son representados por un numeral:

  • El bit de ejecución añade 1 a la suma.
  • El bit de escritura añade 2 a la suma
  • El bit de lectura añade 4 a la suma.

Estos valores nunca producen combinaciones ambiguas y cada una representa un conjunto de permisos específicos, que se pueden observar en la siguiente tabla:

Valor Notación simbólica Permisos
0 - Ninguno
1 x Ejecución
2 w Escritura
3 wx Escritura, ejecución
4 r Lectura
5 rx Lectura, ejecución
6 rw Lectura, escritura
7 rwx Lectura, escritura, ejecución


Permisos adicionales

Acabamos de hablar de la forma de tres dígitos, pero hay otra de cuatro dígitos. Bajo este esquema el estándar de tres dígitos anterior se convierte en los últimos tres dígitos del conjunto. El dígito restante (el primero) representa los permisos adicionales.

Nota: En los casos en que este primer dígito no puede omitirse porque tenga que mostrarse el conjunto de cuatro completo, se establece cero para dicho valor.

  • Permiso SUID (o bit setuid): cuando se ha establecido ejecución, el proceso resultante asumirá la identidad del propietario.
  • Permiso SGID (o bit setgid): cuando se ha establecido ejecución, el proceso resultante asumirá la identidad del grupo al que pertenece el propietario. Cuando se aplica a un directorio, todos los nuevos ficheros creados debajo de este directorio heredarán el grupo propietario de este mismo directorio.

Nota: Cuando no se ha establecido setgid, el comportamiento predefinido es asignar el grupo del usuario al crear nuevos elementos.

  • Bit sticky: un usuario solo podrá modificar y eliminar ficheros y directorios subordinados dentro de un directorio que le pertenezca. Los directorios a los cuales se les ha establecido bit sticky restringen las modificaciones de los usuarios. Así cada usuario mantiene el control total sobre sus propios ficheros pudiendo crear nuevos ficheros; sin embargo, solo puede adjuntar o añadir contenido a los ficheros de otros usuarios. Se utiliza en directorios como /tmp y /var/spool/mail.

Nota: En ausencia del bit sticky se aplican las reglas generales y el derecho de acceso de escritura por sí solo permite al usuario crear, modificar y eliminar ficheros y directorios subordinados dentro de un directorio.


Cuando un fichero no tiene permisos de ejecución en alguna de las clases y se le es asignado un permiso especial, éste se representa con una letra mayúscula.

Permiso Afectado Ejecuta No ejecuta
SETUID Usuario s S
SETGID Grupo s S
Sticky Otros t T


Al igual que en el formato de tres dígitos, el primer dígito del conjunto de cuatro es también la suma de los bits que lo componen:

  • El bit sticky añade 1 a la suma.
  • El bit setgid añade 2 a la suma.
  • El bit setuid añade 4 a la suma.

Así en formato octal, tendríamos:

Valor Notación simbólica Permisos
1 --- --- --t Bit sticky
2 --- -s- --- Bit SETGID
3 --- -s- --t Bit SETGID y sticky
4 s-- --- --- Bit SETUID
5 s-- --- --t Bit SETUID y sticky
6 s-- -s- --- Bit SETUID y SETGID
7 s-- -s- --t Bit SETUID, SETGID y sticky


Órdenes

Para controlar los permisos que queremos establecer en ficheros y directorios, nos serán útiles las siguientes órdenes (en todos los casos puede resultar más cómodo el modo recursivo -R).

Nota: Recuerda que el caracter x denota permiso de ejecución en el caso de los ficheros y permiso de acceso (búsqueda) para los directorios.

Si queremos ser más específicos en cuanto a qué ficheros/directorios queremos modificar en este sentido. podemos combinar estas órdenes con otras como find.

chown

sirve para cambiar propietario (y grupo) de los archivos y directorios de nuestro sistema. La sintaxis es:

chown [OPCIÓN]... [PROPIETARIO][:[GRUPO]] FICHERO...
Por ejemplo:
chown www-data:www-data /var/www/index.html
chown -R www-data:www-data /var/www/*


chgrp

La orden chgrp (cambiar grupo) sirve para cambiar el grupo propietario de los ficheros.

Sintaxis

La sintaxis es:
chgrp [OPCIÓN]... GRUPO ARCHIVO...

Opciones

Destacamos las siguientes opciones:

  • -R: Cambia de forma recursiva el grupo todos los ficheros que pertenecen al directorio.
  • -c,--changes: Muestra únicamente la acción de cuyos ficheros se cambia realmente el grupo y omite los que ya forman parte de éste.
  • -f,--silence,--quiet: Omite los mensajes de error de cuyos ficheros no pueda cambiarse el grupo.
  • -v,--verbose: Describe la acción efectuada o no para cada fichero que procesa.

Ejemplos de uso

Miramos el grupo de f1

ls -l f1 -rw-r--r-- 1 admin grupo 0 2011-05-30 09:30 f1
Cambiamos el grupo a otrogrupo
chgrp otrogrupo f1
Comprobamos los cambios
ls -l f1 -rw-r--r-- 1 admin otrogrupo 0 2011-05-30 09:32 f1

Ejemplos avanzados

Si queremos cambiar el grupo de todos los ficheros del directorio actual

chgrp otrogrupo *
Si además de eso queremos que se cambie el grupo recursivamente de todos los ficheros de los directorios del directorio actual
chgrp -R otrogrupo *
También podemos comprobar cuáles se cambian realmente y cuáles ya pertenecían al otrogrupo
chgrp -c otrogrupo *

Programas relacionados

  • Chown. Ya que éste cambia el propietario de los ficheros, aunque sólo puede ser usado en modo superusuario.
  • Chmod. Ya que controla los permisos que tiene el grupo al que pertenece el fichero.

Notas sobre el uso

Solo el propietario de un fichero o el usuario con los privilegios apropiados puede cambiar el grupo del fichero. Algunas implementaciones restringen el uso de esta orden con los privilegios adecuados cuando el grupo especificado no es el del usuario o uno de los grupos suplementarios de éste.

Referencias

Enlaces externos

chmod

sirve para cambiar permisos específicos (rwx) de los archivos, pudiendo especificarse el modo tanto en notación simbólica como en notación octal (simplemente introduciendo el valor numérico). 

Sintaxis

La sintaxis es:
chmod [OPCIÓN]... MODO... FICHERO...

La notación simbólica se especifica de la forma [ugo[[Categoría:Programas]]*([-+=]([rwxXs[[Categoría:Programas]]*|[ug[[Categoría:Programas]]))+, siendo:

  • Clases de usuarios:
    • u: usuario propietario
    • g: grupo propietario
    • o: otros
    • a: todos
  • Permisos básicos:
    • r: lectura
    • w: escritura
    • x: ejecución/acceso
  • Caracteres especiales:
    • +: añade un permiso
    • -: elimina un permiso
    • =: especifica un nuevo modo sobreescribiendo el anterior

Ejemplos de uso

  1. Dar permisos de ejecución a todos los usuarios (no es necesario especificar a):
    chmod +x script.py
  2. Dar todos los permisos a todos los usuarios en notación octal:
    chmod 777 visible.txt
  3. Dar todos los permisos al propietario, de ejecución al grupo y ninguno a los demás:
    chmod u+rwx,g+x,o= fich.txt


Alternativas al modelo de permisos clásico

Existen desde hace tiempo diversas alternativas la modelo clásico de permisos en UNIX, como las Linux kernel capabilities[1]

Nodo-i

Un archivo está compuesto de:

  • un nombre
  • contenido
  • información administrativa como permiso
  • fechas de modificación

La información administrativa está almacenada en el nodo-i(también se suele llamar inodo), junto con datos esenciales para el sistema tales como su longitud, la región del disco en la que se encuentra almacenado el contenido del archivo y otros elementos.

Existen tres fechas en un inodo:

  • la fecha en la que se hizo la última modificación (escrita) al contenido del archivo
  • la fecha en la que dicho contenido fue usado (leído o ejecutado) por última vez
  • la fecha en la que el inodo fue alterado por última vez, por ejemplo, para definir los permisos

El nombre de archivo en un directorio se llama enlace (link), ya que une un nombre en la jerarquía de directorio al inodo y, en consecuencia, a los datos. El mismo numero-i puede aparecer en más de un directorio.

Por lo tanto, el inodo es un registro que almacena información sobre el archivo determinado y contiene:

  1. Identificación de usuario y de grupos de archivos.
  2. Instantes del ultimo acceso y de la ultima modificación.
  3. Contador con él numero de HORD-LINK al archivo.
  4. El tipo de archivo.
  5. 15 apuntadores a bloques de disco.

Los primeros 12 bloques apuntan a bloques directos, o sea que se puede referenciar inmediatamente a 12 directorios de bloques de datos de archivos (ya que existe una copia del inodo en memoria principal, mientras el archivo está abierto).

Los siguientes tres apuntan a bloques indirectos (del tamaño del bloque grande):

  • El primero es la dirección de un bloque indirecto simple (bloques de direcciones de bloques de datos)
  • El segundo apunta a un bloque indirecto doble (bloque de direcciones de bloques que apuntan a bloques de datos)
  • El tercero apunta a un bloque indirecto triple (no se lo necesita)


Acceso

Si el primer carácter del nombre del camino es "/" es el directorio raiz, sino el directorio de partida es el proceso actual. El final es el nombre de un archivo, se realiza el proceso en busca de este nombre y si no se lo encuentra, se emite un mensaje de error.

Para los archivos que no estén en disco se designan controladores apropiados para manejar su entrada/salida.


Mapeado

Se utiliza para indexar en una tabla de archivos abiertos el proceso actual. Cada entrada en la tabla contiene unos apuntados a una estructura de archivos, que a su vez apunta al inodo.

La estructura del inodo es un copia en memoria que hay en disco, con campos extras.

Referencias

  1. Documentación de las Linux kernel capabilities en el código fuente de Linux 2.4


Ejercicios

Ejercicios de la sección de sistema de archivos
Aspectos pedagógicos: Permiten la modificación de permisos y propietarios de los ficheros. Son muy útiles para la comprensión a fondo del sistema de permisos que existe en este tipo de sistemas y para valorar un buen control de éstos, así como qué importancia tienen.
Preparación previa: Para hacer estos ejercicios debes acceder al sistema con el usuario por defecto usuario (recuerda que la contraseña es unix). A continuación:
  • Ve al directorio casa del usuario actual. Comprueba que existe un directorio llamado unix y dentro de éste un subdirectorio llamado archivos. Para ello ejecuta:
    ls unix
    Debe aparecer el directorio archivos. En caso de que no exista alguno de estos elementos, puedes hacer varias cosas:
    1. Descargar el archivo comprimido con la jerarquía de elementos de comprobación que se encuentra en la portada del wiki y descomprimirlo en el directorio casa del usuario actual.
    2. Apagar la máquina virtual y restaurar el snapshot que funcionaba bien.
    3. Apagar la máquina virtual y borrarla eliminando el disco duro virtual. A continuación, descargar el disco duro y volver a configurar la máquina de nuevo.
  • Ve al subdirectorio unix/archivos. Limpia el sistema antes de realizar los demás ejercicios para prevenir posibles incongruencias:
    sudo python archivos.py -c
    o
    sudo python archivos.py --clean
  1. Consulta qué usuarios y grupos posee el directorio inicio y todo su contenido.
    Ojo: Apúntalo si es necesario o guarda los resultados en un fichero de texto, puesto que esta información te será útil más adelante.
  2. Consulta qué permisos posee el directorio inicio y todo su contenido.
  3. Consulta cuál es la máscara de permisos actual.
    Pista: Existe una orden para visualizar y modificar la máscara de permisos de usuario (piensa en inglés).
  4. Modifica la máscara de permisos para que tan sólo puedan leer y modificar ficheros el usuario y grupo propietarios.
    Ojo: El resto de permisos deben estar desactivados, no son irrelevantes.
  5. Crea un archivo foo.bar en el directorio archivos y comprueba que la máscara del sistema funciona.
  6. Vuelve al directorio inicial (archivos) y ejecuta el primer control intermedio:
    sudo python archivos.py -p 1
    o
    sudo python archivos.py --partial 1
Debes haber aprendido a: Queda por aprender:
Máscara de permisos Cambiar permisos
  1. Cambia el usuario y el grupo propietarios del directorio inicio/root y todo su contenido por el administrador.
  2. Cambia los permisos de los ficheros (únicamente los ficheros, no los directorios) que se encuentran en inicio y en inicio/valores para que todos los usuarios puedan leer y ejecutar los ficheros, pero ninguno pueda modificarlos.
  3. Cambia el grupo propietario del directorio inicio/tmp y todo su contenido por www-data.
  4. Dale permisos de lectura (únicamente) a todos los usuarios al fichero passwd.dat que se encuentra en inicio/tmp/root.
  5. Cambiar el usuario propietario de los ficheros contenidos en inicio/valores por invitado y el grupo propietario por users.
  6. Añade pemisos de ejecución para el usuario propietario al fichero foo.bar.
  7. Vuelve al directorio inicial (archivos) y ejecuta el segundo control intermedio:
    sudo python archivos.py -p 2
    o
    sudo python archivos.py --partial 2
Debes haber aprendido a: Queda por aprender:
Máscara de permisos y cambio de permisos y usuarios/grupos propietarios. Limpieza final del directorio: restaurar permisos y propietarios.
  1. Borra el fichero foo.bar que ya no es necesario.
  2. Restaura el usuario y el grupo propietario para el directorio inicio y todo su contenido.
  3. Restaura los permisos básicos para el directorio inicio y todo su contenido.
  4. Restaura la máscara de permisos de usuario.
  5. Vuelve al directorio inicial (archivos) y ejecuta el control final:
    sudo python archivos.py
Tras la realización de estos ejercicios debes tener clara la utilización y el manejo de las siguientes órdenes:
chmodchownchgrp • otro


Si aún sigues teniendo dudas puedes:

  1. Releer el artículo Sistema de archivos de nuevo al completo, o tan sólo las secciones en las que tengas dudas.
  2. Volver a desarrollar los ejercicios de nuevo.
  3. Revisar los artículos creados en el wiki para cada una de las órdenes.
  4. Revisar el manual de las órdenes implicadas (recuerda que tienes los enlaces en los artículos del wiki de cada una y además en está el manual del sistema).
Herramientas personales