Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000).

Ausencia de Garantía

Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa.

Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.

...
..

SISTEMA DE FICHEROS Primera parte

Introducción
Este es sin duda uno de los capítulos con mayor interés práctico.

A menudo la palabra fichero se puede usar de dos formas. Ficheros en sentido amplio como cualquier cosa que tiene nombre en un sistema de ficheros y otra como ficheros propiamente dichos que más tarde llamaremos ficheros regulares. Estos últimos son la clase de ficheros más normalitos y sirven para contener información legible o ejecutable.

Se trata de una coincidencia de nombres especialmente lamentable porque dificulta mi trabajo de explicar ahora las cosas.

Por ejemplo cuando hablamos de generalidades para los nombres de ficheros y cuando hablemos de tipos de ficheros estaremos hablando de ficheros en sentido amplio, en cambio cuando hablamos de dirigir la salida a un fichero o cuando decimos que leemos un fichero nos referimos a ficheros propiamente dichos es decir ficheros regulares que son los que se usan normalmente como contenedores de información.

Las palabras no siempre significan lo mismo usadas en diferentes contextos así que nosotros confiaremos en su capacidad de deducción y usaremos indistintamente la palabra fichero para ambas cosas aunque reconocemos que es una costumbre que no facilita las cosas, pero por desgracia verá este término utilizado en diferentes sitios usado para ambas cosas. No se preocupe y tenga paciencia al fin y al cabo si ya ha llegado hasta aquí, su sagacidad a quedado prácticamente demostrada.

Comprenderá todo esto cuando hablemos de tipos de ficheros.

Para poner a prueba una vez más su sagacidad, (santa paciencia la suya) usaremos el término ficheros en sus dos acepciones para describir una clase de ficheros llamada directorios.

Los directorios pueden considerarse como una clase de ficheros que pueden contener toda clase de 'ficheros' (en sentido general) incluidos nuevos directorios, lo cual hace que la estructura final tenga estructura similar a la de un arbol.

Las ramas de un arbol forman la estructura de todo el arbol y de forma muy similar los directorios forman el armazón de toda la estructura del sistema de ficheros.

Un sistema de ficheros en Unix tiene esta estructura de árbol y el punto de origen se llama root (raíz) y se caracteriza porque el padre de 'root' resulta ser el mismo 'root' y se simboliza por '/'.

Ya sabemos que esto es raro pero no pregunte como alguien puede ser padre de si mismo. Esto sencillamente es un truco para rematar la estructura de todo el árbol de alguna forma.

Ojo el super usuario también se le llama 'root' pero no tiene nada que ver con esto. Es solo otra molesta coincidencia.

Nombres de ficheros
Un nombre de fichero valido para el núcleo de Linux puede contener cualquier carácter salvo el caracter '/' y salvo el carter '\0' (caracter nulo). Sin embargo no es prudente usar caracteres especiales interpretados por la shell ($,",',&,#,(,),*,[,],{,}, etc..) Tampoco debe empezar por el carácter '-' que puede ser confundido con una opción. Por ejemplo si llamamos a un fichero '-r' no solo no podremos borrarlo sino que se puede confundir con la peligrosísima opción '-r' de borrado recursivo.

Cuando un usuario es dado de alta se define la shell por defecto que usará y el directorio de entrada. Este directorio de entrada al sistema será el valor de la variable $HOME.

En cada directorio hay dos entradas como mínimo que son '.' y '..' que referencian respectivamente al directorio actual y al directorio padre. (Cuando no tenemos en la variable $PATH referenciado el subdirectorio actual tendremos que ejecutar los comandos de nuestro directorio actual mediante ./comando)

El carácter '/' se utiliza para separar los diferentes componentes de un nombre de fichero y por eso no se puede usar como pare de un nombre de fichero. El carter nulo se usa como fin de cadena en en lenguaje C que es el lenguaje en el que está escrito el SO. Por eso tampoco se puede usar ese caracter como nombre de fichero.

Cuando usamos un nombre de fichero que empieza por '/' se llama nombre de camino completo o nombre de camino absoluto. Si por el contrario empieza por '.', por '..', o por un nombre se denominará nombre de camino relativo, porque su utilización depende del subdirectorio actual donde nos encontremos. La última parte del nombre después del último carácter '/' se llama nombre base. basename(1).

$ # Ejemplo de uso del comando basename
$ basename /usr/include/sys/signal.h

signal.h

Los ficheros que empiezan por '.' no tienen realmente nada de especial. Ya explicamos que la shell no expande los nombres de estos ficheros y algunos comandos como 'ls' y otros los consideran de una forma especial. Por ejemplo al usar el comando 'ls' sin parámetros no muestra esos ficheros. Por todo ello aparentan ser invisibles cuando en realidad son algunos comandos como 'ls' y el propio 'bash' quienes los tratan de forma especial. Muchos ficheros que son de uso particular de algunos programas se usan de esta forma para que el usuario pueda ignorarlos en condiciones normales.

En 'msdos' existe un concepto llamado extensión. Corresponde con un máximo de tres caracteres después del último punto en un nombre de fichero. En Unix los nombres pueden tener varios puntos y después del último punto puede haber más de tres caracteres alfanuméricos ya que no existe el concepto de extensión. De existir nombres que terminan de una cierta forma puede tener significado especial para algunos programas pero no para núcleo (kernel) y tampoco para el interprete de comandos.

Lo que si tiene un tratamiento especial a nivel de sistema operativo son los caracteres '/' que forzosamente indican los elemento de un camino formado por la sucesión de caracteres. Es decir será imposible crear un fichero con nombre 'x/a' dentro de un directorio porque el sistema interpretaría que queremos crear un fichero 'a' dentro de un directorio 'x'.

Comandos para manejar el sistema de ficheros
Relación de comandos más importantes para manejar el sistema de ficheros.

ls <lista>	Muestra el contenido de directorio actual.
cd <dir>	Cambiar a un subdirectorio.
mkdir <lista-dir>	Crea uno o mas directorio. 
rmdir <lista-dir>	Borra uno mas directorios.
cp <lista>	Copiar uno o mas ficheros al ultimo de la lista. 
		Si mas de dos el ultimo debe ser un directorio.
mv <lista>	mover o renombrar ficheros o directorios al ultimo 
		nombre de la lista.
		Si mas de dos el ultimo debe ser un directorio.
rm <lista>	borrar la lista de ficheros.
ln              Crear un enlace a un fichero
touch		Crea un fichero vacío o modifica la fecha de un fichero
pwd		muestra el camino absoluto del directorio actual.
chmod		Cambia los permisos de un fichero.
chown		Cambia el propietario de un fichero.
chgrp		Cambia el grupo de un fichero.
du <fichero>	Ocupación  de un fichero 
tree		Listado recursivo
tree -d		Mostrar árbol de directorios
file <fichero>	Obtiene información sobre el tipo de Ficheros

Recuerde que tiene a sus disposición el comando 'man' para consultar las distintas opciones de cada uno de estos comandos.

Alias para el uso de los comandos más frecuentes
El comando 'cd' es un comando interno que sirve para cambiar de directorio actual. Existe otro comando interno llamado 'alias' que sirve para algo que no tiene que ver con el sistema de ficheros y sin embargo lo mencionaremos aquí por razones prácticas.

En muchos sistemas parecerá que existe la disponibilidad de usar un comando 'll' que sirve para mostrar un directorio con abundante información. En realidad se trata de un alias. Usted puede verificar los alias definidos para su usuario tecleando 'alias' sin argumentos. Generalmente se usa para abreviar el uso de comandos muy utilizados. Esto puede resultarle de interés para personalizar su entorno.

Cuando el interprete de comandos arranca se ejecutan una serie de ficheros '/etc/profile', '~/.bash_profile', '~/.bash_login', y '~/.profile' en este orden. En '.bash_profile' suele existir una parte que pregunta por la existencia de un '~/.alias' y en caso afirmativo lo ejecuta. Este fichero '.alias' contiene una serie de comandos de alias que permanecerán disponibles durante su sesión de trabajo con esa shell.

Podría parecer que estamos obsesionados con la shell y que no sabemos hablar de otra cosa pero solo queremos proporcionarle ahora unos consejos prácticos que le faciliten el uso de su sistema. Para ello tendría que editar el fichero '.alias' presente en su $HOME y añadir las líneas siguientes:

alias ll='ls -lrt --color=auto'
alias ll.='ls -adlrt --color=auto .[a-zA-Z0-9]*'
alias ls='ls --color=auto'
alias ls.='ls -adrt --color=auto .[a-zA-Z0-9]*'
alias md='mkdir'
alias mv='mv -i'
alias rd='rmdir'
alias rm='rm -i'

Puede ejecutar el fichero '.alias' para definir todos estos alias

$ . .alias

O puede ejecutar cualquiera de estos comandos alias ahora mismo, por ejemplo

$ alias ll='ls -lrt --color=auto'

Luego teclee el comando 'alias'. Comprobará que queda definido. Teclee el nuevo comando 'll' y compruebe su efecto.

Para eliminar una definición de alias utilice el comando 'unalias' En nuestro caso.

$ unalias ll

Para no tener que teclear manualmente cada vez cada uno de estos alias es para lo que sirve el fichero '.alias'.

Si no sabe editarlo tendrá que esperar a que expliquemos el manejo del editor 'vi' y volver a esta sección para modificar su fichero '.alias'. Los alias serán definidos la próxima vez que entre en una nueva sesión. Explicaremos las ventajas de usar algunos de los alias que acabamos de proponerle.

ll Los ficheros más interesantes son generalmente los más recientes y para evitar que desaparezcan durante un scroll largo los mostraremos en último lugar. La opción de color auto colorea la salida del comando únicamente si la salida ocurre en el terminal.

ll. Sirve para listar ficheros que empiezan por un punto y después tienen una letra o dígito como segundo carácter. Normalmente los ficheros de configuración de su usuario se encuentran en su $HOME y utilizan nombres de este tipo que no aparecen en la expansión de un '*'.

rm Este alias evita usar 'rm' tal cual está añadiéndole la opcíon -i para confirmar antes de borrar. Realmente útil. Es muy recomendable usar 'rm' por defecto de esta forma. Si no desea ser interrogado a cada fichero si realmente desea borrarlo o no, utilice este alias tal como está pero añadiendo la opción -f. rm -f <lista-de-ficheros> borrará silenciosamente todo lo que usted ordene que no tiene que coincidir con todo lo que usted supone que ha ordenado. En especial si no pone cuidado al usar la expansión de ordenes de la shell.

La respuesta a la pregunta de como recuperar un fichero borrado accidentalmente es... 'De ninguna forma'.

Cosas simpáticas de Unix y Linux.

Puede que sepa de alguien que en cierta ocasión recuperó una información valiosa usando trucos o herramientas especiales pero no cuente con ello. Hay programas de borrado que usan papeleras y quizás piense en poner un alias de rm para que use uno de estos programas. Esto introduce ineficiencia en el sistema pero puede hacerse a nivel de usuario. Lo más correcto es usar una buena política de copias de seguridad.

mv Se trata de mover información pero aplicamos el mismo principio que para 'rm'.

Ejemplos de uso de los comandos estudiados
Ejecutaremos paso a paso una serie de comandos y comprobaremos lo que ocurre.

$ # Crearemos un alias para ls con algunas opciones
$ alias ll='ls -lrt --color=auto' 
$ # Creamos en /tmp una serie de directorios anidados 
$ cd /tmp
$ mkdir kkkk
$ cd kkkk
$ # Consultamos en que directorio estamos situados
$ pwd

/tmp/kkkk

$ # Continuamos creando ficheros y directorios
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ mkdir kkkk
$ # Usamos el alias por primera vez para ver el contenido
$ # del directorio actual.
$ ll

total 4
-rw-r--r--   1 acastro  acastro         3 abr 16 20:01 kk1
-rw-r--r--   1 acastro  acastro         3 abr 16 20:01 kk2
-rw-r--r--   1 acastro  acastro         3 abr 16 20:01 kk3
drwxr-xr-x   2 acastro  acastro      1024 abr 16 20:01 kkkk

$ # Continuamos creando ficheros y directorios
$ cd kkkk
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ mkdir kkkk
$ cd kkkk
$ echo xx > kk1
$ echo xx > kk2
$ echo xx > kk3
$ cd /tmp/kkkk
$ # El alias ll corresponde con el comando ls con una serie de
$ # opciones pero podemos añadir nuevas opciones. Por ejemplo
$ # podemos hacer un listado recursivo de toda la estructura de
$ # ficheros y directorios que cuelga del directorio actual. 
$ # /tmp/kkk
$ ll -R .

total 4
-rw-r--r--   1 acastro  acastro         3 abr 16 20:01 kk1
-rw-r--r--   1 acastro  acastro         3 abr 16 20:01 kk2
-rw-r--r--   1 acastro  acastro         3 abr 16 20:01 kk3
drwxr-xr-x   3 acastro  acastro      1024 abr 16 20:03 kkkk

kkkk:
total 4
-rw-r--r--   1 acastro  acastro         3 abr 16 20:03 kk1
-rw-r--r--   1 acastro  acastro         3 abr 16 20:03 kk2
-rw-r--r--   1 acastro  acastro         3 abr 16 20:03 kk3
drwxr-xr-x   2 acastro  acastro      1024 abr 16 20:04 kkkk

kkkk/kkkk:
total 3
-rw-r--r--   1 acastro  acastro         3 abr 16 20:04 kk1
-rw-r--r--   1 acastro  acastro         3 abr 16 20:04 kk2
-rw-r--r--   1 acastro  acastro         3 abr 16 20:04 kk3

$ # Con el comando tree y la opción -d podemos ver la estructura
$ # simplemente con los directorios y como están colocados.
$ tree -d

.
`-- kkkk
    `-- kkkk

    2 directories


$ # Para ver la estructura completa usamos el comando
$ # tree sin opciones. Vemos ahora tambien los ficheros.
$ tree

.
|-- kk1
|-- kk2
|-- kk3
`-- kkkk
    |-- kk1
    |-- kk2
    |-- kk3
    `-- kkkk
        |-- kk1
        |-- kk2
        `-- kk3

2 directories, 9 files

$ # Con find podemos buscar usando muchos criterios. Por ejemplo
$ # por nombre.
$ find . -name 'kk*'

./kk1
./kk2
./kk3
./kkkk
./kkkk/kk1
./kkkk/kk2
./kkkk/kk3
./kkkk/kkkk
./kkkk/kkkk/kk1
./kkkk/kkkk/kk2
./kkkk/kkkk/kk3

$ # Podemos buscar por fecha de modificación comparanda con la
$ # fecha de otro fichero. Por ejemplo que ficheros son más
$ # recientes que './kkkk/kk2' ?
$ find . -newer ./kkkk/kk2

./kkkk
./kkkk/kk3
./kkkk/kkkk
./kkkk/kkkk/kk1
./kkkk/kkkk/kk2
./kkkk/kkkk/kk3

$ # Podemos comprobar la ocupación de los directorios
$ du .

4       ./kkkk/kkkk
8       ./kkkk
12      .

Para borrar todo esto se suele usar la opción de borrado recursivo. No debe usar esta opción como root sin estar muy seguro de lo que hace. Esta opción borra recursivamente y es muy peligrosa porque un error puede borrar recursivamente desde un lugar equivocado un montón de información.

No es necesario borrar nada porque en /tmp la información suele borrarse durante el arranque. Si quiere intentarlo con las precauciones mencionadas teclee 'rm -fr /tmp/kkkk'. Si lo prefiere puede dejarlo sin borar ya que no ocupa casi nada y se borrará la proxima vez que se vacíe el '/tmp' que será seguramente cuando vuelva a arrancar el ordenador.

Para que los comandos anteriores puedan funcionar correctamente deberemos tener los permisos adecuados sobre los ficheros y los subdirectorios.

Evidentemente hay muchos más y no podemos explicarlos todos ahora pero quizás sea bueno mostrar una pequeña lista de algunos de ellos que veremos más adelante en posteriores capítulos.

sum		Obtiene un valor de checksum
cksum		Obtiene un valor de checksum largo y por tanto más seguro
gzip		Compresor de GNU
find		Buscar ficheros
tar		Empaqueta ficheros y directorios en un solo fichero.		
cpio		Empaqueta ficheros y directorios en un solo fichero.

Sistema plano de ficheros
La estructura en forma de árbol tiene el inconveniente de que se requiere ir recorriendo el árbol para ir localizando cada uno de los elementos. Por ello se hace necesario un sistema mucho más directo.

A cada ficheros se le asocia un número para poder localizarlo directamente. Dicho número se llama inodo. Los números de inodos son el índice del sistema plano de ficheros, también llamado por ello tabla de inodos Cada fichero de cada sistema de ficheros tiene un inodo distinto salvo que se trate de un enlace rígido (hard link). Sin embargo hay inodos que no se corresponden con ningún fichero.

Un fichero en sentido estricto indica capacidad de contener una secuencia de bytes.

Un inodo indica básicamente la capacidad de tener un nombre asociado al sistema de ficheros.

Un fichero tiene asociadas funciones de posición y de lectura y escritura de información dentro del fichero. Un inodo es una referencia muy directa a un fichero y a grandes rasgos tiene asociadas funciones que permiten manejar y construir la estructura de árbol del sistema de ficheros.

Tipos de ficheros

Generalmente los diferentes tipos de ficheros son capaces de aceptar operaciones de apertura, cierre, lectura y escritura de forma similar. Por ello se puede redirigir una entrada y una salida a diferentes tipos de ficheros. Parte de la enorme potencia y flexibilidad de los SO tipo Unix residen en este hecho. Gracias a esto la combinación de entradas salidas entre procesos, ficheros, dispositivos, etc.. resulta muy sencilla y flexible. Existe una salvedad importante. Los directorios en este sentido son totalmente especiales y un intendo de escribir en un directorio dará siempre un error aunque sea realizado por 'root'. No tiene sentido permitirlo. Los directorios se crean, borran, y modifican con comandos específicos para ellos.

$ echo > .

bash: .: Es un directorio

Atributos de fecha en ficheros
En Unix y Linux los ficheros en sentido amplio tienen asociadas siempre tres fechas. En realidad estas fechas están almacenadas internamentte como el número de segundos transcurridos desde el '1 de Enero de 1970'.

Una de ellas indica el tiempo del último acceso realizado sobre ese fichero. La otra indica la fecha de creación (en realidad es la fecha del último cambio de estado) de ese fichero y la última y quizás más importante (es la que vemos al consultar con 'ls -l') indica la fecha de la última modificación.

En realidad si cambiamos el estado de un fichero por ejemplo cambiando permisos o el propietario se modificarán las fechas de creación y del último acceso. Por eso la fecha que hemos denominado de creación puede ser posterior a la fecha de modificación del fichero.

Cuando se crea un fichero las tres fechas tendrán el mismo valor. Cuando se lee un fichero se modifica la fecha de acceso del mismo pero acceder al nombre de un fichero o consultar el estado de un fichero no modifica ninguna fecha. Su fecha de acceso tampoco ya que en realidad lo que se hace es leer la información del directorio que lo contiene el cual si que verá modificada su fecha de acceso.

Las fechas de modificación asociadas a los directorios cambian con las altas, o bajas de los elementos dentro del directorio. Esto es debido a que dichas operaciones se consideran como si fueran escrituras en el fichero especial de tipo directorio. Un directorio es al fin y al cabo una simple tabla. Esto lo recordaremos cuando hablemos de permisos asociados a directorios.

Para modificar las fechas de modificación y de acceso de un fichero se puede usar el comando touch(1)

Test
Puede comprobar sus conocimientos respondiendo el siguiente test.
Para ello seleccione las opciones que se ajusten a la verdad y luego pulse el boton para ver el resultado de su test.

1 El carácter '*' no es utilizable en un nombre de fichero.
2 Los nombres de ficheros que comienzan por un punto serán ignorados por el kernel.
3 Un nombre de fichero no puede contener más de un punto.
4 Un nombre de fichero no puede contener un espacio.
5 alias es un comando interno.
6 alias sin parámetros muestra todos los alias definidos en la sesión.
7 Para borrar ficheros y directorios se usa 'rm' y 'rmdir' respectivamente.
8 Para renombrar ficheros y directorios se usa 'mv' y 'mvdir' respectivamente.
9 Para borrar recursivamente se usa 'rm -i'.
10 La orden 'cp seg/*' copia todos los ficheros que hay en seg al directorio actual.
11 Un link simbólico puede hacer referencia a un fichero de otro sistema de ficheros.
12 El sistema plano de ficheros de gestiona mediante la tabla de inodos.
13 Un enlace rígido puede hacer referencia a un fichero de otro sistema de ficheros.
14 Borrando enlaces rígidos en cualquier orden se conserva la información hasta que no se borra el último enlace.
15 El comando 'echo fffffffff > ff' Creará un fichero 'ff' de tipo Fifo.
16 El comando 'echo fffffffff > ff' Creará un fichero 'ff' de tipo Regular.

Resultado del test

Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos
contacto

.
....
...

Volver a la página anterior
Volver a la página principal de la tienda