next up previous
Next: vi Up: Curso de GNU/Linux para Previous: Shell

Subsecciones

Manejo de Archivos

Una de las características de UNIX es que todo es un archivo. Esto no es una simplificación, el sistema representa los dispositivos (disco rígido, placa de sonido, CDs, floppys, algunas conexiones de red, etc) que están conectados a él como archivos.

Estos archivos están todos ubicados a partir del directorio raíz, a partir del cual se abre un árbol de directorios. Al directorio raíz se lo identifica como /. Si hacemos ls / veremos los directorios que se abren a partir del raíz.

Una de las ventajas del manejo de archivos de UNIX es que los usuarios no necesitan saber dónde está cada directorio. Cuando hacemos ls / puede suceder que algunos directorios estén en el disco rígido de la PC, otros estén en un servidor de la red, otros en algún otro servidor, y nosotros no nos enteraremos.

Identificamos con el nombre de file-system a una estructura jerárquica de directorios y archivos. Es decir, una determinada colección de archivos. En un solo sistema UNIX pueden estar montados varios file-systems diferentes. Esto es, un solo sistema UNIX puede agrupar los archivos que están almacenados en distintas particiones de un disco rígido, en una diskettera, en un CD, etc.

El árbol de directorios que vemos a partir del directorio raíz, es la forma en la que organizamos los archivos, no necesariamente el lugar donde los archivos están ubicados físicamente.

Montar y desmontar file-systems

Utilizando el comando mount veremos los file-systems que tengamos montados. La salida de este comando nos lista: la identificación del file-system, el lugar en el árbol de directorios en el que está montado y el tipo de file-system que constituye. Además, entre paréntesis, podemos ver los flags con los que se ha montado.

Cuando queremos leer de un diskette, deberemos montarlo, ya que el diskette constituye una nueva estructura de archivos. Podremos montar diskettes que estén grabados en distintos formatos, por ejemplo msdos, ext2, etc.

Para montar el diskette utilizaremos mount /floppy, ya que /floppy es el directorio en el que está configurado que se debe montar el dispositivo de la diskettera, como un tipo de file-system automático, es decir que detecta automáticamente qué tipo de filesystem se tiene.

Es necesario desmontar el diskette antes de sacarlo, ya que -si no lo hacemos- el sistema puede no haber terminado de actualizar los cambios hechos al file-system del diskette. Para desmontarlo utilizaremos el comando: umount /floppy.

Otro comando relacionado con los file-systems que se encuentran montandos en el sistema es df. Este comando nos muestra el espacio que está siendo utilizado y el que todavía está libre, en los file-systems que se encuentren montados.

Árbol de directorios

Existen diferentes maneras de ordenar la información dentro de los directorios. Veremos un orden básico que la mayoría de las distribuciones utilizan.

/bin
contiene los archivos ejecutables básicos del sistema. Muchos de estos comandos ya los usamos o los vamos a usar en el futuro.

En este directorio, por ejemplo, encontramos algunos de los comandos de shell que nombramos.

/dev
contiene los archivos que representan a dispositivos. Los archivos que se encuentran en este directorio están relacionados con periféricos de la máquina, por ejemplo: /dev/fd0 es el archivo que representa la primera diskettera, /dev/hda representa al primer disco rígido IDE, /dev/hda1 representa la primera partición del primer disco rígido IDE, /dev/tty representa la consola actual que se está usando. Asi: echo hola > /dev/tty nos mostrará la misma salida que un simple echo hola.

Estas identificaciones corresponden al sistema de archivos utilizado por las distribuciones de GNU/Linux. En otros sistemas UNIX (como BSD, Solaris, etc). Las identificaciones serán distintas, pero las podremos encontrar en el mismo directorio /dev.

Un dispositivo curioso es /dev/null. Se trata de un dispositivo que borra todo aquello que se mueva a él, como un agujero negro. Otro dispositivo interesante es /dev/random, que nos muestra "basura random", es decir cualquier tipo de caracteres, generados al azar según los procesos que se estén ejecutando en la máquina y la entrada del usuario.

/etc
contiene los archivos de configuración del sistema y de muchos de los programas instalados en el sistema. Además, contiene los scripts de inicio que se ejecutan cuando arranca la máquina. Generalmente los archivos que se encuentran en este directorio pueden ser editados sólo por el administrador de la máquina, es decir el superusuario, normalmente llamado "root".

/home
en este directorio se encuentran los directorios principales de los usuarios. En estos directorios los usuarios tienen permisos de leer, escribir y ejecutar según deseen.

/lib
contiene las librerías necesarias para ejecutar los comandos que se encuentran en /bin y /sbin. Las librerías son rutinas que los programas utilizan frecuentemente, y pueden ser compartidas por varios programas al mismo tiempo.

Esto se debe a que las librerías no están incluídas dentro de los programas, para que sea sencillo reusar el código, y aprovechar mejor el espacio.

En otros sistemas UNIX, las librerías pueden estar incluídas en los comandos, con lo cual este directorio no es necesario.

/sbin
contiene los archivos ejecutables que son necesarios para poder administrar el sistema.

/usr
contiene archivos que serán utilizados una vez que el sistema ya está funcionando. No son imprescindibles para el funcionamiento del sistema.

Por dentro se subdivide nuevamente en un árbol muy parecido al del directorio raíz.

Encontramos, además, directorios como src (donde se suelen guardar los archivos con el código fuente del sistema), games (que tiene juegos), X11R6 (que contiene el sistema X), share (que contiene archivos a los que pueden acceder todos los programas y todos los usuarios).

Los archivos por dentro

El contenido de un archivo común no es mas que una sucesión de bytes, pero cómo está esta información almacenada y cómo accedemos a ella es más interesante. Para tener una idea de cómo se guarda la información en los sistemas UNIX veremos el manejo de inodos.

Inodos

Un inodo contiene el tamaño de un archivo, las tres fechas relacionadas con el archivo (modificación del contenido, acceso al contenido y modificación del inodo), los permisos, el dueño, el grupo, el número de links, e información sobre dónde están físicamente los datos (los bytes) del archivo en el disco.

Notemos que el nombre del archivo no está guardado en el inodo.

De esta forma, un directorio es simplemente un archivo que contiene una lista de números de inodos y nombres de archivos.

Links

Dentro del inodo se guarda el número de links del archivo. Un link es una entrada en un directorio, es decir en la lista de inodos y nombres de archivos. Un archivo puede tener muchos links. Esto significa que dos archivos con distinto nombre pueden apuntar a un mismo inodo, y por lo tanto tener el mismo contenido. Son el mismo archivo con dos nombres diferentes.

Es importante recalcar que una vez creado el link, es imposible decir cuál es el nuevo archivo y cuál es el que ya estaba creado. Si borramos uno de estos archivos, no se borrará el contenido del archivo, sino únicamente la entrada de directorio, y se decrementará la cantidad de links al inodo. Solamente se eliminará el contenido del archivo cuando el número de links llegue a cero.

A este tipo de links se los llama hard links, existe otro tipo de links, llamado soft links o también symlinks (Symbolic Link). Estos links no comparten el inodo del otro archivo, ni aumentan la cantidad de links que tiene el otro archivo, porque se trata únicamente de un puntero a otro archivo, que se puede encontrar en cualquier parte del sistema de archivos. Es muy similar al Acceso Directo de Windows.

Dado que los datos de los inodos se guardan por separado en cada dispositivo (es decir, partición de disco, CD, floppy, etc), no es posible crear hard links entre dispositivos diferentes. Sin embargo, sí es posible crear symlinks.

ln

El comando ln nos permite crear tanto hard links como soft links.

Para crear un hard link deberemos escribir ln viejo nuevo. De tal manera que nuevo estará asignado al mismo inodo al que ya estaba asignado viejo. Si hacemos ls -li del directorio actual, podemos ver el número de inodo en la primera columna, y el número de links en la tercera. veremos que tanto viejo como nuevo tienen el mismo número de inodo y de links.

Para crear un symlink utilizamos ln -s viejo nuevo. En este caso, al hacer ls -li vemos que nuevo tiene un inodo diferente a viejo, y que en el nombre aparece la ruta a la que apunta.

Permisos

Como ya dijimos antes, todos los archivos tienen un dueño y un grupo. Para ver el dueño y el grupo, podemos hacer ls -l, la tercera columna es el usuario y la cuarta el grupo.

Analizaremos la primera columna (que puede parecer un jeroglífico, pero lo que nos indica es los permisos que tiene cada archivo).

El primer caracter nos indica qué tipo de archivo es. Si tiene una "d" es un directorio, si tiene una "l" es un symlink, si tiene un "-" es un archivo común.

Los siguientes tres caracteres indican los permisos que tiene el archivo para el dueño. La primera columna indica lectura, y puede tener una "r" si está habilitado el permiso o "-" si no lo está. La segunda indica permiso de escritura, y puede tener una "w" si está habilitado o un "-" si no lo está, la tercera indica ejecución, y puede tener una "x" si está habilitado o un "-" si no lo está.

Los otros tres caracteres son los permisos para el grupo, y los últimos tres son los permisos para el resto de los usuarios.

En el caso de los directorios, el permiso de lectura significa que se puede listar el contenido del directorio, haciendo -por ejemplo- echo dir/*, el permiso de escritura significa que se pueden crear y borrar archivos en el directorio y el permiso de ejecución significa que se pueden buscar archivos, hacer un cd, etc.

chmod

Para cambiar los permisos de un archivo utilizamos el comando chmod. Solamente el dueño de un archivo (o el administrador del sistema) puede cambiarle los permisos a un archivo. Aún si no tiene ninguno de los permisos explicados, el dueño del archivo siempre tiene permiso de cambiar los permisos de un archivo.

Hay dos maneras diferentes de utilizarlo. Podemos sumar o restar permisos a los que ya están, o bien configurar todos los permisos a la vez.

Si queremos sumar o restar determinados permisos, utilizamos la siguiente sintaxis:
chmod quien+que archivo. donde "quien" puede ser: u (usuario dueño), g (grupo), o (otros), o bien a (todos). Y "que" puede ser r, w o x. Los permisos que no se agreguen ni quiten permanecerán como estaban.

Así, si escribimos chmod u+r archivo le estamos agregando permiso de lectura al usuario. Si hacemos chmod o-w archivo le quitamos permiso de lectura a los demás. Por otro lado, escribiendo la línea chmod a+x,go-w archivo le agregamos permiso de ejecución a todos los usuarios, y le quitamos el de escritura a todos los que no son el dueño.

Por otro lado, existe una manera más rápida, pero también un poco más complicada de cambiar los permisos. Esta manera utiliza números octales. Consideramos r = 4, w = 2 y x = 1. El valor del permiso que queremos asignar será la suma de los permisos. Y lo tenemos que escribir para el usuario, el grupo y los otros.

Ejemplo: chmod 644 archivo asigna permisos de lectura y escritura para el usuario y sólo de lectura para los demás. chmod 755 archivo asigna permisos de lectura, escritura y ejecución al usuario y de lectura y ejecución a los demás.

Si deseamos cambiar los permisos dentro de un directorio, de forma recursiva, podemos utilizar la opción -R.

groups - chgrp

Un usuario puede pertenecer a varios grupos. Para ver a qué grupos pertenece, utilizamos el comando groups.

Y el comando chgrp grupo archivo nos permite cambiar el grupo de un archivo. Solamente podemos cambiar el grupo a otro grupo que también pertenezcamos.

chown

Este comando solamente lo puede ejecutar el superusuario, y le permite cambiar el dueño de un archivo, pero como no tenemos permiso de superusuario, no podemos utilizarlo.

Ejercicios

  1. Indicar los comandos a utilizar para otorgarle a un archivo cualquiera permisos de:
    lectura y escritura solamente para el dueño del archivo;
    lectura y ejecución para todos los usuarios;
    lectura para todos los usuarios, y escritura solamente para el dueño del archivo.
  2. Crear un directorio (por ejemplo pruebadir), y algunos archivos dentro (por ejemplo, arch1 arch2 arch3). Cambiarle los permisos de lectura, ejecución y escritura al directorio y probar diversos comandos: echo prueba/*, cd prueba, touch prueba/arch4, rm prueba/arch3, ls prueba, etc. De este modo se puede apreciar qué significan realmente los permisos de lectura, escritura y ejecución en un directorio.


next up previous
Next: vi Up: Curso de GNU/Linux para Previous: Shell
hecho por Margarita Manterola y Maximiliano Curia