Linux #02.06 Sistema de Ficheros en Linux

QUÉ ES UN SISTEMA DE FICHEROS

Un sistema de ficheros es el responsable de los siguientes aspectos relacionados con los ficheros:

  • Organización (secuencias de bytes, registros, …)
  • Almacenamiento (contiguo, enlazado, …)
  • Recuperación (tablas de ficheros, caches, …)
  • Denominación (nombres de los ficheros)
  • Compartición (enlaces)
  • Protección (mecanismos de protección)

ESTRUCTURA DE UN SISTEMA DE FICHEROS

  • La capa de conexión puede ser:
  • Memoria compartida > En los sistemas operativos tradicionales
  • Una red de alta velocidad > En los sistemas operativos en red
  • Los servicios de directorios y ficheros están en el núcleo. En la actualidad no siempre es así.
  • Los directorios se implementan como ficheros, aunque algunos sistemas los implementan de forma independiente.

CONCEPTO DE FICHERO

Los usuarios ven un fichero como una recopilación de información almacenada en un dispositivo secundario. Cada fichero tiene un nombre.

Sin embargo, para los programadores un fichero es un tipo abstracto de datos, usado mediante una serie de operaciones.

Y para los implementadores un fichero es una colección de bloques de disco, donde cada fichero tiene un identificador binario.

Sistemas de Ficheros en un Sistema Gnu/linux

Linux aporta una gran cantidad de sistemas de ficheros. Ejemplos: ext, ext2, ext3, reiserfs, msdos, vfat, xia, minix, umsdos, proc, smb, ncp, iso9660, sysv, hpfs, affs y ufs.

El sistema de ficheros propio de Linux es el ext2 y más recientemente, el ext3. Los elementos de dicho sistema de ficheros se pueden clasificar en:

  • Ficheros
  • Directorios
  • Enlaces simbólicos
  • Dispositivos de caracteres y de bloques
  • Tuberías (pipes) y sockets

Un fichero no se almacena de forma continua en los dispositivos físicos. Aunque Linux en la medida de lo posible, procura hacerlo así, a veces existen ficheros que se ven fragmentados en diferentes bloques. Debido a esta posible fragmentación, es necesaria una estructura que direccione los bloques de los ficheros. Es lo que se conoce en Linux como al estructura i-nodo, almacena las direcciones físicas de los bloques que forman un fichero. Cada i-nodo ocupa 4K, pequeña y continua, identificada a través de un número entero. La estructura de un i-nodo es la siguiente:

  • Tipo del fichero y sus permisos.
  • Identificador del usuario dueño y del grupo del fichero.
  • Cantidad de bytes del fichero.
  • Tiempos de: último acceso al fichero (lectura o ejecución), última modificación del fichero (escritura), última modificación del i-nodo.
  • Direcciones de los 20 bloques directos del fichero, del indirecto de primer nivel, del indirecto de segundo nivel y del indirecto de tercer nivel. (Ver fotografíaVer imagen

El sistema de ficheros de Linux tiene una estructura de árbol, donde la raíz es única y es representada por. La figura se muestra un esquema general de los principales directorios del sistema de ficheros de Linux.

Para nombrar los ficheros se puede emplear hasta 256 caracteres, pudiendo ser de cualquier tipo con excepción de /, por ser el separador de caminos. Linux es un sistema case sensitive, es decir, diferencia entre mayúsculas y minúsculas. Los ficheros «ocultos» en Linux son aquellos cuyo nombre comienza con el carácter “.” (punto).

Los directorios siempre tienen dos ficheros ocultos representados por “.” y “…” representa el directorio actual y el directoriopadre.

Una de las configuraciones posibles de Linux es tener dos particiones, una Linux Swap, memoria de intercambio y otra con nuestro sistema GNU/Linux, pudiendo ser el sistema ext2, o el mejorado ext3, este es una mejora del ext2 compatible con journaling.

Otra posible configuración serían tres particiones: swap, /home (dedicada a las cuentas de usuarios) y la raíz.

Ya por ultimo, otro ejemplo muy utilizado de configuración es separar las partes estáticas del sistema de las partes dinámicas. En un partición pondremos la raiz con la parte estática (/bin, /sbin y /usr en algunos casos) y en la otra la parte dinámica (/var , /tmp, /home).

Puntos de montaje

Además del sistema de ficheros raíz y sus posibles particiones, se tendría en cuenta posibilidad de otros puntos de montaje preparados para otros posibles sistemas de ficheros, particiones o cualquier otro dispositivo de almacenamiento.

En las maquinas que se comparten varios sistemas operativos, se suele asignar a casa uno de estos una partición.

A veces es necesario e interesante compartir datos de un sistema a otro, a diferencia de otros sistemas operativos, GNU/Linux posee un gran número de sistemas de ficheros y es capaz de compartir información con otros sistemas operativos.

GNU/Linux es capaz de leer datos de todos los sistemas de ficheros y escribir en la mayoría de ellos. En el caso de NTFS,existen ciertas incompatibilidades, aún no solucionadas, que podrían hacer los datos corruptos o provocar errores en el sistema. En las próximas versiones del kernel se espera que Linux tenga soporte para dicho sistema de ficheros, siempre y cuando, Windows no siga haciendo modificaciones.

Recuerda: Para que se puedan leer o escribir los datos, la partición tiene que estar disponible dentro de nuestro sistema de ficheros raíz (/). Por lo tanto, hay que llevar a cabo un proceso de “montaje” del sistema de ficheros en algún punto de nuestro árbol de directorios. Se seguirá el mismo proceso si se trata de un dispositivo de almacenamiento, ya sea disquete o floppy.

Dependiendo de la distribución, hay unos u otros puntos de montaje. Normalmente suelen existir o bien como subdirectorios de la raíz, por ejemplo /cdrom /win /floppy, o bien son subdirectorios dentro de /mnt, el punto estándar de montaje (aparecen como /mnt/cdrom /mnt/floppy…).

PROCESO DE MONTAJE DE DISPOSITIVOS.

Se realiza mediante la orden mount con el siguiente formato:

mount -t filesystem-type device mount-point

  • El filesystem puede ser msdos (fat), vfat (fat32), ntfs (ntfs lectura), iso9660 (para cdrom), …
  • El dispositivo es la entrada correspondiente en el directorio /dev a la localización del dispositivo, los IDE tenían /dev/hdxy donde x es a,b,c, o d (1 master, 1 slave, 2 master, 2 slave) e y, el número de partición, los SCSI (/dev/sdx) donde x es a,b,c,d … (según el ID SCSI asociado 0,1,2,3,4 …).

Nota: man mount , para más información.

Ejemplos:

Mount -T Iso9660 /Dev/Hdc /Mnt/Cdrom

Montaría el CD-ROM (si es el IDE que está en el segundo IDE de forma master) en el punto /mnt/cdrom.

Mount -T Iso9660 /Dev/Cdrom /Mnt/Cdrom

Montaría el CD-ROM; /dev/cdrom se usa como sinónimo (es un link) del dispositivo donde está conectado.

Mount -T Vfat /Dev/Fd0h1440 /Mnt/Floppy

Montaría el disquete, /dev/fd0H1440. Sería la disquetera A en alta densidad (1.44 MB), también puede usarse /dev/fd0.

Mount -T Ntfs /Dev/Hda2 /Mnt/Winxp

Montaría la segunda partición del primer dispositivo IDE (la C:),

de tipo NTFS (por ejemplo un Windows XP).

Si queremos hacer las particiones fijas en el sistema, podemos hacerlo mediante la configuración del fichero /etc/fstab:

Ejemplo:

# /etc/fstab: Información estática del sistema de ficheros

#

/dev/hda2 / ext3 errors = remountro 0 1

/dev/hdb3 none swap sw 0 0

proc /proc proc defaults 0 0

/dev/fd0 /floppy auto user,noauto 0 0

/dev/cdrom /cdrom iso9660 ro,user,noauto 0 0

/dev/sdb1 /mnt/usb vfat user,noauto 0 0

Nota: El fichero /etc/fstab Indica los dispositivos que están preparados para montarse en el arranque o los extraíbles que podrán ser montados.

Nota: man /etc/fstab, para más información.

Con esta información en el fichero, el proceso de montaje se simplifica, ya que se hará o bien en ejecución o bien bajo demanda (para los noauto). Y puede hacerse ahora simplemente pidiendo que se monte el dispositivo o el punto de montaje:

Mount /Mnt/Cdrom

Mount /Dev/Fd0

dado que el sistema ya tiene el resto de la información.

El desmontaje, es bastante sencillo, el comando umount con punto o dispositivo:

Umount /Mnt/Cdrom

Umount /Dev/Fd0

Nota: man umount , para más información.

En el caso de medios extraíbles, tipo CD-ROM (u otros), puede usarse eject para la extracción del medio:

eject /dev/cdrom o, en este caso, sólo: eject

Nota: man eject , para más información.

Los comandos de montaje y desmontaje se pueden encontrar en todos los sistemas. En el fichero /etc/mtab encuentras la lista de los sistemas montados o ejecutar mount sin parámetros para obtener esta información.

Permisos

Cada elemento del sistema de ficheros de Linux tiene permisos de acceso de acuerdo a tres tipos de usuarios:

  • Su dueño (casi siempre el creador) representado por la letra u (user).
  • Su grupo representado por la letra g (group).
  • El resto de los usuarios que no son el dueño ni pertenecen al grupo. Se representa con o (other).

Para cada grupo de usuarios existen tres tipos de permisos:

  • r: read (lectura). Podrá si es un directorio, listar los recursos almacenados en él, y leer el contenido de un fichero.
  • w: write (escritura). Podrá modificar un fichero. Para un directorio podrán crear y borrar ficheros en su interior.
  • x: execute (ejecución). Permitirá ejecutar el fichero desde la línea de comandos y para los directorios, tendrá accesopara realizar el resto de las funciones permitidas mediante los otros permisos (lectura y/o escritura).

Para determinar los permisos se deben tener en cuenta:

  • Para poder realizar operaciones sobre cualquier directorio es necesario tener el permiso de ejecución.
  • Para acceder a un recurso de cualquier forma (ejecución, lectura o escritura) hay que poseer todos los permisos de ejecución de cada uno de los directorios.

Los tipos de permisos tienen su representación numérica, basada en un sistema octal, representado como “1” los permisos dados y “0” los no dados. Luego transforma dicha representación en octal, con los siguientes valores:

r– = 100 (4 en octal)

–w = 100 (2 en octal)

–x = 001 (1 en octal)

La combinación oscila desde cero (ningún permiso) hasta siete (todos los permisos).

Ejemplos:

rw- = 110 (6 en octal)

rwx = 111 (7 en octal)

r-x = 101 (5 en octal)

Los permisos “totales” de un recurso constan de nueve indicadores, los tres primeros pertenece a los permisos asociados al dueño, los otros tres, al grupo y el resto a los usuarios.

Ejemplos: Dueño Grupo Usuario

rwx r-x — = 111 101 000 (750 en octal)

rw- r– r– = 110 100 100 (644 en octal)

Sólo el dueño de un recurso siempre tendrá derecho a cambiar sus permisos, además de root.

Existen otros tipos de permisos más complejos:

  • s y S: este permiso puede provocar problemas de seguridad si no se utiliza correctamente. Se utiliza en lugar del permiso de ejecución. La s incluye el permiso de ejecución y la S no lo incluye.

Puede ser asociado al dueño o al grupo. Cuando se le da a un fichero el usuario que acceda al fichero, tendrá todos los permisos del dueño o grupo. Un ejemplo de fichero con dicho permiso es el passwd.

Para el caso de un directorio solo tiene validez para el grupo permitiendo a los ficheros y a los subdirectorios que hereden el permiso s.

  • t y T: cuando esta asignado a un directorio con permiso de escritura, le da permiso a los usuarios para que creen ficheros en dicho directorio, pero solo podrán ser borrados por root o el dueño. Para un fichero, el texto se almacena en memoria swap para ser accedido con rapidez. Se emplea el bit correspondiente al de ejecución para su asignación. t significa que además tiene el permiso de ejecución y T que no lo tiene. Un ejemplo de directorio con este permiso es el /tmp.

Para representar estos permisos se utilizan tres bits adicionales: el primero para s en el dueño, el segundo para s en el grupo y el tercero para t. Se colocan al inicio de la cadena numérica de nueve bits vista anteriormente. En la cadena de caracteres se mezclan con el permiso de ejecución y de ahí la necesidad de emplear las mayúsculas y minúsculas.

Ejemplos:

rws rwS r– = 110 111 110 100 (6764 en octal)

rwx rws -wT = 011 111 111 010 (3772 en octal)

Posiblemente el comando más empleado en Linux es el que muestra el contenido de un directorio, llamado ls. Este comando con la opción -l permite observar los permisos que tienen asociados los recursos listados, además de otras características. Los permisos vienen representados a través de una cadena de 10 caracteres donde el primero indica el tipo de recursoque es:

  • d : directorio
  • l : enlace simbólico
  • b : dispositivo de bloque
  • c : dispositivo de caracteres
  • s : socket
  • p : tubería (pipe)
  • -: fichero regular

Los otros nueve caracteres representan los permisos del recurso. El resto de las columnas de la salida representan:

  • El número de enlaces duros que posee.
  • El identificador del dueño.
  • El identificador del grupo.
  • El tamaño en bytes si es un fichero y si es un directorio el tamaño en bloques que ocupan los ficheros contenidos en él.
  • La fecha y hora de la última modificación.
  • El nombre del recurso.

Ejemplos:

drwx—r-x 3 alina alina 4096 Oct 11 12:52 doc

-rw-r–r– 1 alina alina 330106 Sep 7 08:39 tesis.tgz

drwxrwxrwt 5 root root 1024 Nov 15 10:40 tmp

lrwxrwxrwx 1 alina alina 21 Oct 1 09:46 curso -> ../documentación

brw-rw—- 1 root disk 3, 1 Fri Mar 23 2001 /dev/hda1

Para cambiar los permisos de un recurso se utiliza el comando chmod.

Sintaxis: chmod [opciones]

Ejemplos:

$ chmod u+x clase.txt

# añade el permiso de ejecución al dueño

$ chmod g=rx program.sh

# asigna exactamente los permisos de lectura y ejecución al grupo

$ chmod go-w profile

# elimina el permiso de escritura en el grupo y en otros

$ chmod a+r,o-x *.ts

# adiciona el permiso de lectura para todos los usuarios y elimina el de ejecución

para nosotros

$ chmod +t tmp/

# adiciona el permiso especial t

$ chmod 755 /home/pepe/doc/

# asigna los permisos con representación octal 755 (rwxr-xr-x)

$ chmod -R o+r apps/

# adiciona el permiso de lectura a otros para un directorio de forma recursiva

incluyendo todo su contenido

$ Chmod +X ./Bin/*

# adiciona el permiso de ejecución a todos los usuarios que les corresponde por

defecto

# chmod 4511 /usr/bin/passwd

# asigna los permisos con representación octal 4511 (r-s–x–x)

Para asignar permisos por defecto, tanto a ficheros como a directorios, cada usuario posee una máscara de permisos. Se expresa en formato octal. La mascara representa los permisos que se le quiere asignar al recurso. Por defecto es 002 para los usuarios comunes y 022 para root.

Se calculan los permisos finales que se tienen dado en la máscara 022:

Ficheros = totales_para_ficheros – máscara = 666 – 022 = 644 = -rw-r–r–

Directorios = totales_para_directorios – máscara = 777 – 022 = 755 = drwxr-xr-x

Para realizar operaciones en la máscara se emplea el comando umask.

Sintaxis: umask [-S] [máscara]

Ejemplos:

$ umask

# sin argumentos muestra la máscara actual en formato numérico 022

$ umask -S

# muestra el complemento de la máscara en formato de caracteres u=rwx,g=r,o=r

$ umask -S 037

# asigna la máscara 037 (niega permisos de ejecución y de escritura para el grupo,

u=rwx,g=r,o= y todos los permisos para el resto de los usuarios). Se muestra

el resultado en formato de caracteres

$ umask g=rx,o=

# especifica el complemento la máscara utilizando el formato de caracteres

Para ser bien restrictivos se recomienda hacer: $ umask 077

Los nuevos directorios tendrán el permiso: 700 = drwx——

Los nuevos ficheros tendrán el permiso: 600 = -rw——-

Nota: Existen comandos para modificar los permisos de ficheros y/o directorios:

• chown: cambiar propietario de los ficheros.

• chgrp: cambiar grupo de los ficheros.

• chmod: cambiar permisos específicos (rwx) de los archivos.

Permiten la opción –R, que es recursiva si se trata de un directorio. Consultar el man para más información.

Enlaces

En Linux es posible definir enlaces a sistemas de ficheros, para que sean accesible desde cualquier punto de la jerarquía, tenemos dos tipos de enlaces:

  • Fuertes o duros: no se diferencian en nada del fichero original. Un fichero existe físicamente y su nombre no es más que un enlace fuerte a él. Cuando se crea un enlace fuerte se esta apuntando a la misma zona física. De esta forma se obtendrían dos o más copias lógicas de un fichero, pero solo habría una copia física. Por lo que el fichero no desaparece físicamente hasta que el enlace no deje de apuntar a él.
  • Simbólicos o débiles: apuntan al nombre del fichero, no a su contenido. Si desaparece el fichero original (todos los enlaces duros a este) los enlaces simbólicos correspondientes quedan inconsistentes.

No se pueden crear enlaces fuertes a directorios, ni a ficheros en particiones distintas. Para crear enlaces:

Sintaxis:

ln [opciones] <fichero|directorio>[nombre_del_enlace]</fichero|directorio>

ln [opciones]

ln [opciones] <fichero|directorio>[nombre_del_enlace]</fichero|directorio>

Opción: -s se utiliza para crear enlaces simbólicos

Ejemplos:

$ln-s /home/pepe/public_html/raiz.html index.html

$lndoc/important.docclases/*backup/

# ln -s /usr/bin /binarios

Resumen

  • Un sistema de ficheros es aquél componente del sistema operativo responsable de los siguientes aspectos relacionados con los ficheros: organización (secuencias de bytes, registros,…), almacenamiento (contiguo, enlazado,…), recuperación (tablas de ficheros, caches,…), denominación (nombres de los ficheros), compartición (enlaces), protección (mecanismos de protección).
  • Para los usuarios: Un fichero es una colección de información que se encuentra en un dispositivo de almacenamiento secundario. Cada fichero tiene un nombre, en forma de cadena de caracteres.
  • El sistema de ficheros propio de Linux es el conocido como ext2 y más recientemente, el ext3. Los elementos de dicho sistema de ficheros se pueden clasificar en: ficheros, directorios, enlaces simbólicos, dispositivos de caracteres y de bloques, tuberías (pipes) y sockets.
  • Para que se puedan leer o escribir los datos, la partición tiene que estar disponible dentro de nuestro sistema de ficheros raíz (/). Por lo tanto, hay que llevar a cabo un proceso de “montaje” del sistema de ficheros en algún punto de nuestro árbol de directorios. Se seguirá el mismo proceso si se trata de un dispositivo de almacenamiento, ya sea disquete o floppy.
  • El fichero /etc/fstab Indica los dispositivos que están preparados para montarse en el arranque o los extraíbles que podrán ser montados.
  • Cada uno de los elementos del sistema de ficheros de Linux posee permisos de acceso de acuerdo a tres tipos de usuarios: dueño, grupo y el resto. Para cada uno de estos tres grupos de usuarios existen tres tipos de permisos fundamentales: lectura (read), escritura (write), ejecución (execute).
  • Los tres tipos de permisos poseen una representación numérica basada en el sistema octal que parte de representar como “1”’ los bits de los permisos otorgados y “0” para los negados.
  • No se pueden crear enlaces fuertes No se pueden crear enlaces fuertes distintas.
  • Para crear enlaces se emplea el comando ln.