El sistema GNU / Linux

El sistema de archivos GNU / Linux

GNU / Linux está basado en el sistema de ficheros de UNIX, el cual tiene estructura de árbol. El punto de origen se llama root (raíz) y se representa con el símbolo /

Un sistema GNU / Linux puede ser instalado en una "única partición" o en múltiples particiones. Existiendo la partición especial para el intercambio con la memoria, la partición swap. Esta partición permite al sistema usar el disco cuando agota la memoria

Debajo de la raíz (/), cuelgan todos los directorios del sistema. Realmente de la raíz cuelga la partición raíz del sistema que contiene los ficheros básicos para el arranque y el manejo del sistema. Las demás particiones que podemos establecer cuelgan de directorios

Es posible tener en diferentes particiones los ficheros de usuario, las aplicaciones de usuario, ficheros de longitud variable, los ficheros temporales. El crear múltiples particiones nos permitirá administrar mejor el sistema

Podremos crear copias de seguridad de las partes que nos interese o limitar el uso de determinadas partes a un usuario concreto. De esta forma evitamos que el disco se llene completamente, ya que el único que tiene permiso de escritura en la partición raíz es el usuario administrador

El tipo de partición más utilizada en los sistemas GNU / Linux es ext2 o ext3. La unidades no fijas, como cd-rom, blu-disk, zip, pendrive, etc, cuelgan de distintos directorios con un nombre descriptivo que hace referencia a ellos, dentro del directorio /mnt

La descripción de las propiedades de cada partición se hace en el fichero /etc/fstab

Nombre de ficheros

Un nombre de fichero válido para el núcleo de Linux puede contener cualquier carácter salvo los caracteres ‘/’ (barra) o ‘\0’ (nulo)

Sin embargo no es prudente usar caracteres especiales usados por la shell (la línea de comandos) tales como ($, ", ‘, &, #, (, ), *, [, ], {, }, …). Tampoco debe empezar por el carácter ‘-‘ que puede ser confundido con una opción

Cuando un usuario es creado, la shell define por defecto que usará el directorio de entrada llamado igual que el nombre de usuario. El valor de este directorio de entrada se puede encontrar en la variable de sistema $HOME

En cada directorio hay al menos dos entradas accesibles, que son ‘.’ (referencia al directorio actual) y ‘..’ (referencia al directorio padre). En la variable $PATH se guarda la referencia al subdirectorio actual. Si queremos ejecutar comandos contenidos en el directorio actual, usaremos el comando

El carácter ‘/’ se utiliza para separar los diferentes niveles de directorios dentro del nombre del fichero

Cuando el nombre del fichero empieza ‘/’ entonces estamos indicando el nombre del camino completo o el nombre del camino absoluto. Si por el contrario empieza por ‘./’ o por ‘../’, entonces estamos indicando un nombre del camino relativo, porque estamos utilizando el subdirectorio actual donde nos encontremos. La última parte del nombre después del último carácter ‘/’ es el nombre nombre base

Los ficheros que empiezan por ‘.’ no son considerados y por tanto se consideran ocultos al sistema, salvo que ciertos comandos se lo indiquen. Por ejemplo, para listar un directorio se utiliza el comando ls, pero al empezar por ‘.’ no los listará a pesar de ser ficheros iguales al resto

El sistema identifica internamente los ficheros con un número, que se denomina número de i-nodo. En el i-nodo se guardan diferentes propiedades del fichero tales como:

  • tipo de archivo
  • identificador del propietario
  • identificador del grupo del propietario
  • número de enlaces
  • su tamaño
  • fecha del último acceso
  • fecha de la última modificación
  • fecha de cambio del número de i-nodo
  • un array con los bloques de datos que ocupa el fichero

Tipos de ficheros

  • Regular: meros almacenes de información. Algunos contienen código ejecutable
  • Directorios: tabla que contiene los números de i-nodos y los nombres de todos los ficheros contenidos en el dentro del directorio
  • Ficheros especiales: pueden ser dispositivo de tipo carácter o dispositivo de bloques. El manejo de estos ficheros depende del dispositivo en particular
  • Enlaces simbólicos (symbolic links): ficheros que contienen un puntero a otro fichero que podría estar almacenado en un sistema de ficheros distinto
  • Enlaces rígidos (hard links): fichero que puede ser visto con distintos nombres dentro del sistema de ficheros (similar a un álias). Es decir, podemos listarlos como si fueran ficheros idénticos pero que comparten el mismo i-nodo. La información reside en un mismo lugar y los cambios realizados en un fichero también ocurren en los otros equivalentes. Los enlaces de este tipo no trabajan con sistemas de fichero distintos, han de ser del mismo tipo. No todos los sistemas de ficheros soportan los enlaces rígidos, ya que es un concepto muy ligado a los sistemas operativos de tipo UNIX

El árbol de directorios

Los directorios y ficheros de los sistemas GNU / Linux se estandarizan en un documento llamado FSSTND. Entre las distintas distribuciones de Linux podemos encontrar algunas diferencias

Vamos a describir los principales directorios definidos por el estándar y qué contiene:

  • /bin: comandos básicos del sistema operativo
  • /boot: ficheros de arranque, incluido el fichero del núcleo que tiene el formato vmlinuz-x.x.x
  • /dev: ficheros de dispositivos
  • /etc: ficheros de configuración del sistema
  • /etc/X11: ficheros de configuración de las X Windows (librerías para la gestión del entorno gráfico, similar a Windows)
  • /home: directorios de los usuarios. Por defecto se llaman igual que el nombre de usuario
  • /initrd: directorio para el proceso de arranque
  • /lib: bibliotecas necesarias para la ejecución de los programas residentes en los directorios /bin y /sbin
  • /mnt: para montar los dispositivos extraíbles (Cd-Rom, Blu-Disk, Zip, Pendrive, …)
  • /proc: alberga ficheros especiales que, o recogen información del núcleo, o se la proporcionan. Los ficheros generan la información al visualizarlos
  • /root: directorio home del superusuario administrador (tiene todos los permisos sobre el sistema)
  • /sbin: contiene ficheros ejecutables que sólo puede ejecutar el superusuario root
  • /tmp: se guardan ficheros temporales
  • /usr: ficheros que se pueden compartir por todo el sistema. Es el lugar en el que se suelen instalar las aplicaciones de usuario. Contiene directorios como /usr/bin, /usr/sbin, /usr/lib, /usr/man, /usr/X11R6, …
  • /usr/local: es de uso exclusivo superusuario root, para la instalación de software particular de la máquina, los controladores de periféricos
  • /var: ficheros de longitud variable. Esto incluye los directorios y ficheros de "spool", datos de administración y registro, así como ficheros transitorios y temporales que no se guarden en el directorio /tmp

Para movernos en la ruta de directorios usaremos el comando cd. Por ejemplo, si queremos acceder al directorio man, escribiremos en la línea de comandos cd /usr/man

Permisos de ficheros

Los ficheros tienen muchos atributos además de su nombre. Para ver los más significativos ejecutaremos el ls -l

Notación numérica para permisos

Los permisos de los ficheros son almacenados en formato binario y se puede referenciar numéricamente. Para ello se da el valor 4 al permiso de lectura, el valor 2 al permiso de escritura y 1 al permiso de ejecución. A continuación se suman los valores por usuario propietario, grupo y usuario cualquiera, obteniendo un número de tres cifras. Veamos un ejemplo:

Otros permisos

Existen también los permisos SUIG y SGID, que permiten identificar cuando un programa es ejecutado por el propietario del fichero o el grupo del fichero en vez del usuario que lo ha lanzado. En general se utiliza cuando el superusuario root quiere dar permiso de ejecución de uno de sus programas a otro usuario

Otro permiso es el de bit pegajoso o adosado (bit sticky), sirve para que el proceso permanezca en memoria RAM mientras se ejecuta. Se usa poco

Los valores numéricos para el SUIG son 4, para el SGID es 2 y para el bit sticky es 1, añadidos delante de los otros 3 valores de permisos. Así, podríamos darle a nuestro programa, el permiso 4751

Comando para los permisos

El comando para modificar permisos es chmod y admite formato numérico o formato de carácter. En el formato de carácter se usa u (usuario), g (grupo), o (otros) y a (todos) para indicar a quién afectan. Los símbolos + (para añadir permisos), – (para quitar permisos), = (para establecer un permiso). Por último, r (lectura), w (escritura), x (ejecución) s y t (bit sticky)

Permisos para los directorios

Para entender cómo funcionan los permisos aplicados a un directorio hay que imaginar que un directorio es un fichero normal que solo contiene una tabla en la que se relacionan los ficheros presentes en ese directorio. En todos los directorios existen siempre un par de entradas que son ‘.’ (para el directorio actual) y ‘..’ para el directorio padre. El permiso de ejecución se entiende como acceso

Si un directorio no tiene permiso de lectura, resultara imposible para cualquier comando, incluido ls, leer su contenido

Si un directorio no tiene permiso de ejecución, no se podrá hacer cd a ese directorio, ni a ninguno de los subdirectorios que cuelgan de él. Esto imposibilita todas las operaciones que utilicen ese directorio como parte del camino

Si no tiene permiso de escritura no se podrán dar altas, bajas o modificaciones en la tabla, es decir, no se pueden borrar ficheros ni crear otros nuevos, ni renombrarlos

Por último, en un directorio, el bit sticky se entiende como que está protegido ante la creación de un mismo fichero por parte de usuarios diferentes, aunque tengan permisos suficientes. Suele aplicarse al directorio /tmp

Otros comandos relacionados

  • umask: establece los permisos por defecto para la creación de ficheros
  • chown: permite cambiar el usuario propietario de un fichero o de varios ficheros
  • chgrp: permite cambiar el grupo propietario de un fichero o de varios ficheros

Cómo funcionan los comandos UNIX

Los comandos UNIX siguen la siguiente estructura:

cuadro_unix

La entrada estándar normalmente es un fichero o el teclado. La salida estándar suele ser la pantalla y la salida de errores estándar es también la pantalla

El formato de los comandos sigue la estructura:

  • orden: el nombre del comando
  • -: el signo menos indica que es una opción
  • opciones: una o más caracteres de opciones
  • argumentos: son literales tomados como parámetros de entrada para el comando

Redireccionamiento y conexiones

Tanto las salidas como la entrada estándar la podemos redirigir a un fichero o dispositivo (recordemos que desde el punto de vista del sistema todo son ficheros)

También podemos pasar la salida estándar de un comando a la entrada estándar de otro, utilizando la conexión

Para estas operaciones se utilizan los siguientes metacaracteres de la shell:

> comando >fichero dirige la salida estándar hacia el fichero
>> comando >>fichero agrega la salida estándar hacia fichero
< comando <fichero extrae de fichero la entrada estándar
<<str sigue la entrada estándar hasta la siguiente str en el renglón
p1¦p2 conecta la salida estándar de p1 a la entrada estándar de p2

Las conexiones dan una gran potencia al sistema, ya que aunque un comando por sí solo haga una tarea trivial, al combinarse con otros se convierten en herramientas generales y útiles. Esto nos permite de forma sencilla crear nuevos comandos y que el crecimiento del sistema solo está limitado por nuestra habilidad de creación

Otros metacaracteres de la shell

* concuerda cualquier cadena de cero o más caracteres en los archivos
? concuerda cualquier carácter individual en los archivos
[ccc] concuerda cualquier carácter individual de ccc en archivos, son válidos los rangos 0-9 o a-z
; p1;p2 cuando termina el comando p1 se ejecuta el comando p2
& como ; pero no espera que termine p1
`…` correr comando en …; la salida sustituye a `…`
(…) correr comando en … en una subshell
$1, $2, … se reemplazan los argumentos en un archivo de la shell
$var valor de la variable var de la shell
${var} valor de la variable de shell var, evita confusión cuando se concatena con un texto
\ \c se toma literalmente el carácter c
‘…’ se toma … literalmente
"…" se toma … literalmente después de interpretar $, ‘…’ y \
var=valor se asigna el valor a la variable var
p1&&p2 p1&&p2 ejecutar p1si se logra, ejecutar p2
p1¦¦p2 p1¦¦p2 ejecutar p1 si no se logra, ejecutar p2

Comandos UNIX

No vamos a exponer aquí una relación de comandos UNIX, explicando su funcionalidad.

En primer lugar porque existen múltiples páginas dedicadas a ello, y en segundo lugar por el propio sistema nos proporciona múltiples ayudas sobre ellos

Con el comando man podemos obtener ayuda de cualquier programa o fichero de configuración, si queremos saber cómo funciona, se puede llamar a sí mismo de la siguiente forma: man man

Cuando no conocemos el nombre de un comando podemos utilizar el comando apropos e indicar algo relacionado con él

Otro comando de ayuda es el comando info. Este comando suele completar la ayuda de man

Muchos comandos dan ayuda entre sus opciones ejecutando el comando

Otra fuente de ayuda son los COMOs (HOWTOs). Son tutoriales sobre cómo realizar ciertas operaciones en el sistema. Están publicados por TLDP (The Linux Documentation Project, El proyecto de documentación de Linux) y disponibles en muchos idiomas. En español, el proyecto se conoce con el nombre de LuCAS

Algunos paquetes incluyen documentación propia en un subdirectorio de /usr/share/doc que tiene el mismo nombre que el paquete. Cabe destacar que, mayormente, esta documentación está en inglés y todavía no está traducida al castellano

Nota: no olvidar que con la tecla de tabulación la shell completa los nombres de fichero, lo cual ayuda a localizar los comandos y los ficheros aunque no nos acordemos de su nombre completo. Además evita muchos errores al teclear