Sistemas de archivos - Estructuras de Directorios (File System)


Sistema de archivos de GNU/linux

La mayoría de sistemas operativos del mercado siguen el estándar IEEE POSIX (Portable Operating System Interface), dónde se especifican las principales características que debería tener cualquier sistema operativo. Entre ellas está la distribución en directorios que tenemos que hacer de nuestros archivos para tenerlos correctamente organizados y poder localizarlos de forma rápida y sencilla. En la mayoría de distribuciones basadas en GNU/Linux se siguen estas recomendaciones, encontrando los siguientes directorios principales:


Generalidades:


El sistema de archivos o file system, es más o menos "la forma de escribir los datos en el disco duro".

El sistema de archivos nativo de Linux es el EXT2, pero ahora proliferan otros sistemas de archivos con journalising (si se arranca sin haber cerrado el sistema, no necesitan hacer un chequeo sino que se recupera automáticamente su último estado), los más conocidos son EXT3, ReiserFS y XFS.

La estructura de directorios que sigue Linux es parecida a la de cualquier UNIX. No tenemos una "unidad" para cada unidad física de disco o partición como en Windows, sino que todos los discos duros o de red se montan bajo un sistema de directorios en árbol, y algunos de esos directorios enlazan con estas unidades físicas de disco.

NOTA: Las barras en Linux al igual que en cualquier UNIX son inclinadas hacia la derecha, como se puede ver más abajo (ese es el motivo de que en internet tambien sean inclinadas hacia la derecha ya que ésta nació bajo UNIX, y en Linux podemos aprovechar todas las ventajas que esto nos da).


En Windows:

Existen las unidades (C:, D:, E:, etc) las cuales representan un dispositivo físico o partición, es decir que representan a un disco duro, compactera u otra unidad de almacenamiento.

Por ello el disco duro puede ser la unidad C:, el CD-Rom la unidad D: y el pendrive que hemos conectado puede montarlo como unidad E:
Dentro de cada unidad existirán carpetas y archivos pero todas estas unidades se encuentran separadas una de la otra.

En GNU/linux:

No existe el concepto de unidad C: como tal, sino que todo se basa en un árbol o jerarquía de carpetas donde se irán ubicando los diferentes archivos del sistema.

Se lo denomina árbol ya que cada carpeta se puede representar como una "rama".

Al origen de toda la estructura de directorios se le llama "raiz" (root en inglés) y se la representa con una barra /.


Podemos utilizar el comando ls / para ver cómo es el árbol de sistema de Linux:

$ ls /
bin   dev  home  lost+found  mnt  proc  sbin     srv  tmp  var
boot  etc  lib   media       opt  root  selinux  sys  usr




Supongamos que tenemos una instalación de Windows en la cuál utilizamos dos discos duros. Veremos dos unidades: C y D.

Si utilizaramos dos discos en linux podríamos tener montado el primer disco en la raiz y el segundo disco en la carpeta /home.
Tendremos dos discos, pero seguirá siendo un solo árbol de carpetas, ya que home "cuelga" de la raiz (/)

Otro ejemplo. Supongamos que tenemos un solo disco pero está particionado en dos. Windows seguirá viendo dos unidades C y D aunque pertenezcan al mismo disco.

En linux seguiremos teniendo un solo sistema de archivos todo en el mismo disco y home apuntará a una partición, pero seguirá dependiendo de /.

Windows está limitado a tener un máximo de 28 unidades, ya que sólo puede asignar letras de unidad de la A a la Z (ya sean dispositivos físicos o de unidades de red).


En linux podemos realizar montajes de unidades de forma casi ilimitada, ya que se utilizan carpetas para realizar el montaje de cada recurso (sea unidad de red, discos, etc).
Es posible incluso montar una unidad de almacenamiento en varias carpetas a la vez, por lo que al montarlo en /media, /mnt y /home/cdrom podríamos acceder al mismo cd por tres vías diferentes.


En definitiva, no interesa cuantas unidades tengamos sino dónde serán montadas.

Se le llama montar a la acción de asociar una carpeta con un dispositivo físico o recurso de red.

Por ejemplo, para que linux funcione correctamente debe tener cada partición del disco montada. Esto lo realiza en forma automática al iniciar; para ello se fija en el archivo /etc/fstab el cuál contiene la informacion de montaje de todas las unidades de almacenamiento.

El caso típico del cdrom o el pendrive, es que al ser insertado sea montado automáticamente y podamos ver un ícono en el escritorio, pero eso no significa que esté separado del árbol. En realidad linux lo montará en la carpeta que ya tiene predestinada para eso, en algunos sistemas se llama /media, en otros /mnt, pero siempre será montada en una carpeta.


También existe una clase de archivo denominado link simbólico que puede ser creado para apuntar a otros archivos o carpetas. En windows sería el equivalente a "Acceso directo" y podríamos utilizar estos links para apuntar al cdrom desde otra carpeta.
He aquí un ejemplo del comando para crear links simbólicos:


$ ln -s /media/cdrom /home/flavio/mi-cdrom

De esta manera tendría un archivo llamado mi-cdrom, que apuntaría al cd montado en /media/cdrom, así que podría acceder al cd de dos formas diferentes, llendo a la carpeta de montaje:

cd /media/cdrom

o a través del link:

cd home/flavio/mi-cdrom


También existe una clase de archivo denominado link simbólico que puede ser creado para apuntar a otros archivos o carpetas. En windows sería el equivalente a "Acceso directo" y podríamos utilizar estos links para apuntar al cdrom desde otra carpeta.
He aquí un ejemplo del comando para crear links simbólicos:


$ ln -s /media/cdrom /home/flavio/mi-cdrom

De esta manera tendría un archivo llamado mi-cdrom, que apuntaría al cd montado en /media/cdrom, así que podría acceder al cd de dos formas diferentes, llendo a la carpeta de montaje:

cd /media/cdrom

o a través del link:

cd home/flavio/mi-cdrom


5. Conclusión
No importa cuantos dispositivos o unidades tengamos, lo que importa es dónde y cómo serán montadas.




Demostración gráfica de la estructura de directorios:


/___bin

|___dev
|___etc
| |___X11
| |___httpd
| |___mail
| |___ppp
| |___sysconfig
|___sbin
|___home
| |___shrek
| |___fiona
| |___burro
|___lib
|___proc
|___tmp
|___usr
| |___bin
| |___local
| |___X11R6
| |___etc
| |___include
| |___lib
| |___man
| |___src
|___var
| |___admin
| |___spool
| |___run
| |___log

/bin

bin es la abreviación de binaries, o ejecutables. Es donde residen la mayoría de los programas esenciales del sistema. Usa la orden ls -F /bin para listar los ficheros. Podrás ver algunas ordenes que reconocerás, como cp, ls y mv. Estos son los programas para estas ordenes. Cuando usas la orden cp estás ejecutando el programa /bin/cp. Usando ls -F se verá que la mayoría de los ficheros de /bin tienen un asterisco añadido al final de sus nombres. Esto indica que son ficheros ejecutables.

/dev

El siguiente es /dev. Veamos de nuevo con ls -F. Los archivos en /dev son conocidos como controladores de dispositivo (device drivers) son usados para acceder a los dispositivos del sistema y recursos, como discos duros, modems, memoria, etc. Por ejemplo, de la misma forma que puede leer datos de un fichero, puede leerla desde la entrada del ratón leyendo /dev/mouse. Los ficheros que comienzan su nombre con fd son controladores de disqueteras. fd0: es la primera disquetera, fd1 la segunda. Ahora, alguien astuto se dará cuenta de que hay más controladores de dispositivo para disqueteras de los que hemos mencionado. Estos representan tipos específicos de discos. Por ejemplo, fd1H1440 accederá a discos de 3.5" de alta densidad en la disquetera 1. Aquí tenemos una lista de algunos de los controladores de dispositivo más usados. Nótese que incluso aunque puede que no tenga alguno de los dispositivos listados, tendrá entradas en dev de cualquier forma.


  1. /dev/console hace referencia a la consola del sistema, es decir, al monitor conectado directamente a su sistema.
  2. Los dispositivos /dev/ttyS* y /dev/cua* son usados para acceder a los puertos serie. Por ejemplo, /dev/ttyS0 hace referencia a "COM1" bajo MS-DOS. Los dispositivos /dev/cua son "callout", los cuales son usados en conjunción con un modem.

  3. Los nombres de dispositivo que comienzan por hd acceden a discos duros. /dev/hda hace referencia a la totalidad del primer disco duro, mientras que /dev/hda1 hace referencia a la primera partición en /dev/hda.

  4. Los nombres de dispositivo que comienzan con sd son dispositivos SCSI. Si tiene un disco duro SCSI, en lugar de acceder a él mediante /dev/hda, deberá acceder a /dev/sda. Las cintas SCSI son accedidas vía dispositivos st y los CD-ROM SCSI vía sr.

  5. Los nombres que comienzan por lp acceden a los puertos paralelo. /dev/lp0 hace referencia a "LPT1" en el mundo MS-DOS.

  6. /dev/null es usado como "agujero negro", cualquier dato enviado a este dispositivo desaparece. ¿Para qué puede ser útil esto? Bien, si desea suprimir la salida por pantalla de una orden, podría enviar la salida a /dev/null. Hablaremos más sobre esto después.

  7. Los nombres que comienzan por /dev/tty[0-9]* hacen referencia a "consolas_virtuales" de su sistema (accesibles mediante las teclas Alt-F1, Alt-F2, etc). /dev/tty1 hace referencia a la primera VC, /dev/tty2 a la segunda, etc.

  8. Los nombres de dispositivo que comienzan con /dev/pty* son "pseudo-terminales". Estos son usados para proporcionar un "terminal" a sesiones remotas. Por ejemplo, si su máquina está en una red, telnet de entrada usará uno de los dispositivos /dev/pty.


/etc

contiene una serie de ficheros de configuración del sistema. Estos incluyen /etc/passwd (la base de datos de usuarios), /etc/rc (guiones de inicialización del sistema), etc.

/sbin

se usa para almacenar programas esenciales del sistema, que usará el administrador del sistema.

/home

contiene los directorios "home" de los usuarios. Por ejemplo, /home/shrek es el directorio del usuario shrek. En un sistema recién instalado, no habrá ningún usuario en este directorio.

/lib

contiene las imágenes de las librerías compartidas. Estos ficheros contienen código que compartirán muchos programas. En lugar de que cada programa contenga una copia propia de las rutinas compartidas, estas son guardadas en un lugar común, en /lib. Esto hace que los programas ejecutables sean menores y reduce el espacio usado en disco.

/proc

es un "sistema de ficheros virtual". Los ficheros que contiene realmente residen en memoria, no en un disco. Hacen referencia a varios procesos que corren en el sistema, y le permiten obtener información acerca de que programas y procesos están corriendo en un momento dado.

/tmp

Muchos programas tienen la necesidad de generar cierta información temporal y guardarla en un fichero temporal. El lugar habitual para esos ficheros es en /tmp.

/usr

es un directorio muy importante. Contienen una serie de subdirectorios que contienen a su vez algunos de los más importantes y útiles programas y ficheros de configuración usados en el sistema.

Los directorios descritos arriba son esenciales para que el sistema esté operativo, pero la mayoría de las cosas que se encuentran en /usr son opcionales para el sistema. De cualquier forma, son estas cosas opcionales las que hacen que el sistema sea útil e interesante. Sin /usr, tendría un sistema aburrido, solo con programas como cp y ls. /usr contiene la mayoría de los paquetes grandes de programas y sus ficheros de configuración.

/usr/X11R6

contiene el sistema XWindow si se ha instalado. El sistema X Window es un entorno gráfico grande y potente el cual proporciona un gran número de utilidades y programas gráficos, mostrados en "ventanas" en su pantalla. Si está familiarizado con los entornos Microsoft Windows o Macintosh, XWindow le será muy familiar. Este directorio contiene todos los ejecutables de XWindow, ficheros de configuración y de soporte.

/usr/bin

es el almacén real de programas del sistema Un*x. Contiene la mayoría de los programas que no se encuentran en otras partes como /bin.

/usr/etc

Como /etc contiene diferentes ficheros de configuración y programas del sistema, /usr/etc contiene incluso más que el anterior. En general, los ficheros que se encuentran aquí no son esenciales para el sistema, a diferencia de los que se encuentran en /etc, que si lo son.

/usr/include

contiene los ficheros de cabacera para el compilador de C. Estos ficheros (la mayoría de los cuales terminan en .h, de "header") declaran estructuras de datos, subrutinas y constantes usados en la escritura de programas en C. Los ficheros que se encuentran en /usr/include/sys son generalmente usados en la programación de en Un*x a nivel de sistema. Si se está familiarizado con el lenguaje de programación C, aquí encontrarán los ficheros de cabecera , como por ejemplo stdio.h, el cual declara funciones como printf().

/usr/lib

contiene las librerías equivalentes "stub" y "static" a los ficheros encontrados en /lib. Al compilar un programa, este es "enlazado" con las librerías que se encuentran aquí, las cuales dirigen al programa a buscar en /lib cuando necesita el código de la librería. Además, varios programas guardan ficheros de configuración en /usr/lib.

/usr/local

es muy parecido a /usr contiene programas y ficheros no esenciales para el sistema, pero que hacen el sistema más divertido y excitante. En general, los programas que se encuentran en /usr/local son específicos de su sistema esto es, el directorio /usr/local difiere bastante entre sistemas Un*x. Aquí encontrará programas grandes como TeX (sistema de formateo de documentos) y Emacs (gran y potente editor), si se los instala.

/usr/man

Este directorio contiene las páginas de manual. Hay dos subdirectorios para cada página "sección" de las páginas (use la orden man man para más detalles). Por ejemplo, /usr/man/man1 contiene los fuentes (es decir, los originales por formatear) de las páginas de manual de la sección 1, y /usr/man/cat1 las páginas ya formateadas de la sección 1.

/usr/src

contiene el código fuente (programas por compilar) de varios programas de su sistema. El más importante es /usr/src/linux, el cual contiene el código fuente del Núcleo de Linux.

/var

contiene directorios que a menudo cambian su tamaño o tienden a crecer. Muchos de estos directorios solían residir en /usr, pero desde que estamos tratando de dejarlo relativamente inalterable, los directorios que cambian a menudo han sido llevados a /var. Algunos de estos directorios son:

/var/log

contiene varios ficheros de interés para el administrador del sistema, específicamente históricos del sistema, los cuales recogen errores o problemas con el sistema. Otros ficheros guardan las sesiones de presentación en el sistema, así como los intentos fallidos.

/var/spool

contiene ficheros que van a ser pasados a otro programa. Por ejemplo, si su máquina está conectada a una red, el correo de llegada será almacenado en /var/spool/mail hasta que lo lea o lo borre. Artículos nuevos de las "news" tanto salientes como entrantes pueden encontrarse en /var/spool/news, etc.

/var/mail

En algunas distribuciones como la RedHat, es donde se guardaran los emails que nos lleguen y mandemos.


Nota:
Es muy recomendable conservar y no eliminar ninguno de estos directorios (o los que por defecto nos cree la distribución que utilicemos) ya que son básicos para el buen funcionamiento del sistema. Generalmente los procesos de instalación de nuevas aplicaciones necesitan que exista la organización dada y muchos de los archivos de configuración de los programas deben estar en determinados directorios. Lo que sí podemos hacer sin ningún tipo de restricción es crear nuevos directorios a la raíz del sistema o en cualquier otra carpeta.



Nombres de archivos en GNU/Linux:

Los nombres de archivos en Linux (como en todos los UNIX) distinguen mayúsculas de minúsculas, esto es, son "case sensitive". Los archivos README, readme, REadme y rEadme por ejemplo son archivos distintos y por lo tanto al ser nombres distintos pueden estar en el mismo directorio.

En Linux los archivos no tienen por qué tener una extensión. La suelen tener a modo orientativo, pero no es en absoluto necesario. Linux sabe qué contiene cada archivo independientemente de cuál sea su extensión. Por comodidad, podremos llamar a todos nuestros archivos de texto con la extensión .texto, o a todos nuestros documentos con la extensión .documento, de esta manera, podremos luego agruparlos más fácilmente.

Los ficheros y directorios ocultos en Linux comienzan su nombre por un punto (.)

Los nombres de archivos o directorios pueden ser muy largos, de más de 200 caracteres, lo cual nos da bastante flexibilidad para asociar el nombre de un archivo a lo que contiene. No obstante, hay ciertos caracteres que nunca se deberían utilizar a la hora de nombrar un archivo. Uno de ellos es el espacio, nunca llamaremos a un fichero con un nombre que contenga un espacio. Tampoco son recomendados otros caracteres raros como signos de puntuación (a excepción del punto), acentos o la ñ. En algunos casos Linux ni siquiera nos permitirá usarlos. Los recomendables son las letras A-Z, a-z, los números (0-9), el punto, el guión (-) y el guión bajo (_) para nombrar un archivo.


GNU/Linux sólo distingue tres tipos de archivos:

·   Archivos o ficheros ordinarios, son los mencionados anteriormente.

·   Directorios (o carpetas), es un archivo especial que agrupa otros ficheros de una forma estructurada.

·   Archivos especiales, son la base sobre la que se asienta Linux, puesto que representan los dispositivos conectados a un ordenador, como puede ser una impresora. De esta forma introducir información en ese archivo equivale a enviar información a la impresora. Para el usuario estos dispositivos tienen el mismo aspecto y uso que los archivos ordinarios.



Ejecutables y Tipos de archivos en Linux

En este artículo, trataré de explicar brevemente cómo identificar los ejecutables en linux y cómo determinar a que tipo de archivo pertenece.

Es muy común que a quienes están migrando desde Windows les surja la duda de cómo identificar el archivo ejecutable de una aplicación.
Pues claro, en Windows la estructura de directorios y archivos es completamente diferente a nuestro mundo.

En Windows (XP) casi todos los programas se encuentran bajo una carpeta "Archivos de Programa", el sistema operativo está en su propia carpeta "Windows" y el almacenamiento se realiza en la unidad C:.

En Linux, la distribución del sistema operativo y las aplicaciones tiene una organización muy distinta. No existe la unidad ( c: ) como concepto.
Todo se desprende de un "árbol" de directorios cuya raíz, es justamente, root (/).

Entonces vemos que nos queda un árbol mas o menos así:

Código:
/              Raíz del sistema de archivos
/dev           Contiene ficheros del sistema que representan los dispositivos
/etc           Contiene archivos de configuración del sistema y los servicios
/home          Es la carpeta donde se almacenan los archivos de los usuarios
/lib           Tiene librerías
/mnt           Es una carpeta para montar otros recursos, como un cdrom por ejemplo
/proc          Tiene archivos que reciben o envían información al kernel del sistema
/usr           Aquí se encuentran los programas
/usr/bin       Programas de uso general
/usr/sbin      Programas de uso administrativo (solo los puede correr el usuario root)
/var           Carpeta que contiene entre otras cosas, archivos de log
/tmp           Carpeta de uso temporal (se borra al reiniciar)

Cuando vemos dónde se almacena un programa (por ejemplo firefox) vemos que lo hace en varios lugares diferentes:

Código:
$ find / -name firefox*
/usr/share/pixmaps/firefox.png
/usr/share/man/man1/firefox.1.gz
/usr/bin/firefox
/usr/lib/firefox-3.0.1
~/.mozilla/firefox

El primero es el ícono, el segundo la documentación, el tercero es el programa en si (ya que está dentro de /usr/bin), el cuarto es la carpeta de las librerías que usa firefox y el último es una carpeta de preferencias de mi usuario (nótese que el símbolo ~ representa mi carpeta: /home/mi-usuario)

¿Pero cómo reconocemos un programa o un archivo ejecutable?

En linux, casi cualquier archivo puede ser ejecutable.
Hagamos una pequeña prueba. Abramos una terminal y corramos el siguiente comando:

Código:
$ ls -la /usr/bin/fil*
-rwxr-xr-x 1 root root  15036 mar 11 05:57 /usr/bin/file
-rwxr-xr-x 1 root root 380324 jul  1 15:32 /usr/bin/file-roller

Sabemos que son programas porque se encuentran en la carpeta /usr/bin, pero también porque vemos los atributos de los archivos "rwxr-xr-x"
r = read (lectura)
w = write (escritura)
x = execute (ejecución)


¿Pero que clase de archivo ejecutable es?

Digo clase, porque un ejecutable puede ser de tipo ELF o script.
Para saber que tipo de archivo es existe el comando "file"

Código:
$ file /usr/bin/file
/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

Vemos que el mismo comando file se reconoce a si mismo como un ejecutable tipo ELF de 32-bit

Otros ejemplos:

Código:
$ file Google_Earth_CZXD.bin
Google_Earth_CZXD.bin: Bourne shell script text executable

$ file vbox-usb.sh
vbox-usb.sh: Bourne-Again shell script text executable

$ file freesshdt.pl
freesshdt.pl: perl script text executable

$ file animation.rb
animation.rb: ASCII English text, with CRLF line terminators

$ file MobileMediaConverter
MobileMediaConverter: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, stripped

$ file bookmarks.html
bookmarks.html: exported SGML document text

$ file bookmarks.html.tar.gz
bookmarks.html.tar.gz: gzip compressed data, was ".fr.4988.0.bookmarks.html.tar", from Unix, last modified: Thu Jan  3 00:48:18 2008

$ file GTAINSTALLER.exe
GTAINSTALLER.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

De todos estos ejemplos el único "intruso" es GTAINSTALLER.exe ya que es nativo de windows.

Nota acerca de los scripts

Los Bourne-Again Shell (bash), Shell (sh) y Perl scripts (pl) tienen un encabezado que le indica al comando file que tipo de archivo es.
Si visualizaramos el contenido de un script seguramente nos encontraríamos con una primera línea como esta:
#!/bin/bash

o si fuese perl, sería
#!/usr/bin/perl

Otro dato curioso.

El caso del instalador de Google Earth.
Si lo analizamos, es un archivo shell script, ya que el comando file así lo indica, pero si lo miramos por dentro veremos que es un shell script que tiene pegado un archivo tar. El mismo script se encarga de extraer el archivo tar, verificar la suma MD5 y ejecutar otro script llamado setup.sh.

Conclusión
Vimos que cualquier archivo puede ser ejecutable en linux.
Podemos encontrarnos con un shell script, un ejecutable ELF, la combinación de scripts y archivadores, etc.
Pero lo más importante es que siempre debe leerse primero el archivo README, ya sea un paquete tar.gz con código fuente o incluso el encabezado de los scripts, ya que hay muchos programadores que suelen comentar sus scripts con indicaciones e instrucciones de uso.

Comments