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.
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.
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.
En este directorio, por ejemplo, encontramos algunos de los comandos de shell que nombramos.
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.
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.
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).
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.
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.
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.
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.
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.
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
.
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.
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.
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.