Conceptos básicos

De GLASS

Tabla de contenidos

Objetivos

Despues de leer este capítulo:

  • Entenderá la composición y arquitectura de un sistema operativo
  • Conocerá las características que diferencian una distribución de otra
  • Sabrá qué manera de trabajar le conviene para mantener su sistema limpio y actualizado

Kernel

Entendemos como Kernel el núcleo del sistema operativo. El núcleo, contrariamente a como se suele pensar en la mayoría de los casos, no es algo de lo que únicamente gocen los sistemas Linux o Unix, sino que es una parte fundamental en cualquier sistema operativo, sea libre o propietario. La diferencia en este caso es que los sistemas libres nos permiten su configuración para un funcionamiento personalizado del sistema.

Los sistemas operativos están divididos en tres partes claramente diferenciadas. En la parte más interna encontramos el núcleo, sobre el cual se ven erguidas las aplicaciones y las shells. Tras estas últimas están los usuarios.

Básicamente la problemática se remonta a un nivel tan bajo que hace prácticamente imposible el uso del ordenador, siendo éste una máquina como otra cualquiera, que solamente entiende un lenguaje binario (unos y ceros) entendido por golpes de tensión y no-tensión. Es evidente que no hay un usuario en el mundo capaz de editar un fichero de texto usando para ello un lenguaje de ceros y unos, dado que el proceso sería extremadamente complejo. Primero debería indicar al ordenador que debe apuntar hacia una posición exacta en el disco duro, esa posición debería ser proporcionada en binario, tarea sumamente difícil. Después debería indicar el nuevo texto a introducir, también en binario. Finalmente debería ordenar a la máquina que los unos y ceros introducidos deben guardarse en el dispositivo del disco duro a partir de la posición de memoria indicada al principio, todo ello sin contar con el manejo de los dispositivos usados durante todo el proceso, tales como memoria o procesador. De este modo, se hace necesario un software que se encargue de hablar directamente con la máquina física para que los usuarios puedan remitirse al uso de aplicaciones (gráficas o no) fácilmente inteligibles. Esa porción de software es el núcleo del sistema, por lo que puede entenderse entonces que el núcleo es la parte del sistema operativo que está directamente en contacto con las piezas mecánicas del ordenador (el hardware).

Cuando un usuario utiliza una aplicación tal como un editor de textos o una calculadora, está realmente pidiendo al núcleo que maneje el hardware a su conveniencia. En el primer caso está pidiendo que el núcleo extraiga la información contenida en el disco duro, a partir de una posición de memoria concreta y hasta la posición cuya información marca el final de fichero. En el segundo caso, pidiendo al procesador que realice algunos cálculos matemáticos. Sin un núcleo, ésas tareas aparentemente tan sencillas serían prácticamente imposibles.

El núcleo entonces debe tener conocimiento de todos los dispositivos con los que cuenta el ordenador sobre el que se ejecuta el sistema operativo. Si usted tiene acoplada una tarjeta de vídeo o audio, un disco duro o un lector de CD-ROM, el núcleo debe saberlo para poderlo manejar. Obviamente los sistemas propietarios trabajan con porciones de software provistas con el hardware. El núcleo del sistema trae de serie soporte para algunos dispositivos, y al incorporar otros nuevos es necesario acoplar al sistema la parte de software capaz de interactuar con dichas piezas. Son los conocidos drivers.

El núcleo de Linux históricamente era monolítico. Esto es, contaba únicamente con el soporte de cierto tipo de maquinaria en su código, y al surgir un nuevo componente proporcionado por un fabricante del mercado, era necesario que las personas encargadas de programar el núcleo añadiesen la funcionalidad de dichas piezas al código original del núcleo.

En algunos aspectos esto podía ser una ventaja, dado que siempre el núcleo tenía soporte para todos los dispositivos del mercado, aunque el tiempo y una caña dieron al panorama una tremenda multitud de aparatos que se podían acoplar al ordenador: tarjetas, módems, discos, impresoras, escáneres, etc... y es evidente que no todos los usuarios poseían la misma configuración física en sus ordenadores, de modo que el núcleo era cada vez más grande y su característica monolítica lo hacía extremadamente pesado para cargar con todo. De este modo y siguiendo la filosofía de sacar el máximo rendimiento a la máquina, los programadores de Linux (el núcleo del sistema GNU-Linux) decidieron hacer un software modular. Esto significa que el núcleo puede configurarse para añadir o quitar funcionalidades al sistema.

El núcleo entonces está compuesto por una imagen que es la que hace arrancar el sistema y que ejecuta partes de software capaces de interactuar con ciertos dispositivos, y cuenta entonces con otros trozos de código llamados módulos y que son capaces de manejar otro tipo de dispositivos. El soporte para cada dispositivo puede incluirse directamente en el núcleo o bien compilarse aparte como módulo. Si el soporte para una pieza se compila directamente en la imagen del núcleo, el sistema será capaz de entenderse con esa pieza en cualquier momento. Si por el contrario ese software se compila aparte de la imagen en forma de módulo, será necesario cargar dicho módulo en el momento en que se quiera acceder al uso de la pieza que maneja.

Podría entenderse esta separación del siguiente modo: es posible que su ordenador esté permanentemente conectado a una red, por lo que la imagen de su núcleo deberá soportar directamente la tarjeta de red que usted tenga acoplada a la máquina. De este modo no le hará falta hacer nada para poder trabajar en red. Por otro lado es posible que su ordenador disponga de una tarjeta de sonido, pero evidentemente eso es algo secundario ya que usted no va a utilizarla constantemente. La utilizará de forma esporádica, solamente cuando desee escuchar música o reproducir sonidos de algunas aplicaciones, en ese caso, posiblemente le interese cargar su tarjeta como un módulo aparte del núcleo. De esta forma su núcleo será mucho más ligero y arrancará el sistema más deprisa, no teniendo que dar soporte inicialmente a todo el hardware de su ordenador.

Shell

La Shell es el intérprete de comandos del sistema. Es aquella aplicación que usamos cuando deseamos interactuar directamente con la máquina. Muchas veces ejecuta aplicaciones que realizan varias tareas sobre el sistema, y éstas requieren un acceso a ciertas partes del hardware que obviamente pedirán al núcleo, pero el objetivo final será la edición de un texto o un simple cálculo matemático. El acceso a ciertas partes del sistema es algo que en ese caso no le preocupa demasiado, dado que de la ejecución de esa aplicación espera un resultado concreto que poco tiene que ver con el proceso llevado a cabo.

En otros casos en cambio sí que desea acceder directamente a la maquinaria. Un ejemplo claro es el borrado de ficheros del disco duro, o su movimiento de un directorio a otro. En el momento en que borra una información contenida en un dispositivo (Discos duros o disquettes, por ejemplo), está especificando al núcleo que debe ejecutar una orden que afecta rotundamente al sistema, dado que esa información desaparecerá automáticamente del dispositivo de almacenamiento, y no podrá volver a recuperarla. Del mismo modo cuando desea crear un directorio o configurar un dispositivo para que realice una función concreta. La shell es entonces una aplicación que le permite a usted manejar el sistema operativo. Puede pensar por ejemplo en el intérprete de comandos de MS-DOS, o en el caso de un sistema gráfico como Windows o MacOS puede interpretar que la shell es el navegador gráfico de ficheros, donde usted puede mover información de un sitio a otro o configurar una impresora.

La shell de Linux es por defecto el intérprete de comandos BASH. La primera shell introducida en Unix se llamaba Bourne Shell (/bin/sh), programada por Stephen Bourne, quien tras varias modificaciones reprogramó la versión original de su código y la propuso bajo el nombre de BASH (Bourne Again Shell). Bash aporta numerosas características que facilitan el trabajo del usuario, tales como el autocompletado de nombres de ficheros, la navegación en el historial de comandos y algunos trucos más cuya referencia puede encontrarse en las páginas del manual de Bash. Aun así, Bash no es la única shell de Linux, simplemente es la que Linux incorpora por defecto. Existen varias shells como Kornshell, Ash, Tcsh u otras, cada una aportando comodidades para un tipo diferente de usuario en función de las necesidades del mismo (programadores, administradores, etc...)

Sistema de Instalación

El proceso de instalación del Sistema Operativo cubre más aspectos de los que en principio parece. Una instalación no es un proceso mágico a partir del cual el ordenador pasa de no tener nada dentro a tener un sistema, sino una simple copia de archivos. Durante el proceso de instalación su ordenador copia archivos de un CD-ROM o FTP al disco duro, una copia por defecto (normalmente esto supone copiar todos los archivos) o una copia específica en la que usted elige los archivos que desea copiar (las aplicaciones que desea instalar).

Antes de proceder a copiar dichos archivos, su ordenador debe encontrar un mínimo de particiones en el disco duro, proceso que algunas distribuciones realizan por sí mismas durante la instalación, y otras distribuciones le piden que lo haga usted.

El entorno para realizar estas operaciones puede ser una elección decisiva a la hora de escoger una distribución, dado que por norma general es posible que siendo un usuario novel se asuste al enfrentarse a sistemas de instalación no gráficos o excesivamente flexibles. Debe comprender que la facilidad y las comodidades normalmente suelen ir enfrentadas a la flexibilidad, por lo que para un usuario avanzado, un entorno gráfico de instalación con limitadas opciones puede suponer un engorro.

Pensando de un modo práctico, puede entender que un sistema de instalación gráfico seguramente comportará más facilidades a parte de la instalación, es decir, un entorno gráfico sobre el que trabajar normalmente. Para conseguir esto, las compañías o mantenedores de cada distribución deben aportar al sistema ciertos mecanismos de automatización de tareas que el usuario no siempre va a comprender, por lo que es posible que otros aspectos del sistema también incorporen modificaciones para una mayor comodidad del usuario. Esto en el caso una persona que necesite el sistema para editar textos, chatear, navegar, realizar tareas de administración y algunas puramente lúdicas, será lo ideal. No obstante, si usted planea dedicar su tiempo a aprender la administración del sistema y posiblemente la explotación de su potencial en el entorno de una red, todo ese cúmulo de facilidades preprogramadas puede suponerle un engorro, dado que no siempre se acercarán a sus necesidades, o simplemente encontrará que usted no hubiese realizado según qué modificaciones en el sistema.

Por todo ello puede deducir que cuanto más austero sea el sistema de instalación de una distribución, más flexible será el entorno general del sistema,y más puro será el estado en el que éste se encuentre dispuesto para su administración. El hecho de tenerlo que hacer todo a mano no es un obstáculo, sino la posibilidad de que usted haga las cosas a su manera y tome sus propias decisiones sobre el sistema.

Sistema de ficheros

El sistema de ficheros es la estructura de la memoria en el disco para que la información sea guardada en él de un modo o de otro. Puede entender el concepto de Sistema de Ficheros haciendo referencia a la FAT32 de Windows si está acostumbrado a ella, sabiendo que el espacio del disco se estructura en Clústeres, siendo cada uno de ellos una posición de memoria con un tamaño concreto en el que se puede guardar una información o parte de ella. Uno de los varios problemas de la FAT de Windows es la disposición de la información a lo largo del disco, dado que no suele guardarse de forma ordenada y se hace necesario pasado cierto tiempo ordenarla mediante el proceso de defragmentación, lo que busca espacios libres contiguos en los que acumular la información siguiendo un orden lógico.

Los sistemas de ficheros sobre los que trabaja Linux no poseen este problema (aparte de otros varios). El sistema de ficheros por defecto de Linux, desde sus comienzos, era el Second Extended FileSystem comúnmente conocido como Ext2. El sistema de ficheros Ext2 agrupa la información en espacios de 1024, 2048 ó 4096 bytes según la decisión del administrador a la hora de instalar. Dicha decisión debe tomarse en cuenta pensando en el espacio total del disco duro, puesto que si tiene un disco duro pequeño posiblemente deseará formatearlo en cantidades pequeñas de espacio para la información. La manera de verlo es pensando en el proceso de guardar un fichero. Si usted ha formateado su disco duro en porciones de 4096 bytes, al guardar un fichero de 8192 bytes no tendrá problema alguno puesto que ocupará dos posiciones exactas en el disco. Si desea guardar en cambio un fichero de 5000 bytes, estará ocupando los 4096 bytes de una posición, seguido de los 904 primeros bytes de la siguiente posición, por lo que estará desaprovechando los últimos 3192 bytes de la misma. El guardado de un nuevo fichero comenzará a realizarse a partir de la siguiente posición. Piense en realizar este mismo proceso repetidas veces con ficheros que no ocupan un espacio exacto múltiple de 1024 bytes... la cantidad de espacio que está desaprovechando puede resultarle considerable.

Es por ello que puede preferir formatear su disco a 2048 ó 1024 bytes por posición con objetivo de disminuir las pérdidas a la hora de guardar información en el mismo.

Cada posición recibe un identificador que apunta a la dirección de memoria en la que comienza, se llama Inodo.

Si usted se encuentra realizando cualquier tarea en su sistema y éste se reinicia de un modo indebido, al arrancar de nuevo el sistema ejecutará un chequeo del sistema de ficheros (FileSystem Check) para encontrar los ficheros que no se guardaron correctamente en el momento del apagado. Éstos ficheros pueden haberse extraviado en la tabla de Inodos del sistema, y es posible que al arrancar de nuevo el sistema ya no los reconozca. La información se encuentra contenida en el disco, pero el sistema no la encuentra porque ha perdido la referencia de su acceso.

Para evitar este contratiempo se ha desarrollado el Journaling ó Logging en los sistemas de ficheros. Los sistemas de ficheros con Journaling trabajan de un modo similar a Ext2, pero a diferencia de éste último incorporan una región de memoria reservada para el Journal ó Log, que es un registro de las operaciones que se realizan sobre el disco, la entrada de información y su borrado. Se mantiene un registro de cada operación de incorporación o extracción de información al disco, al mismo tiempo que un método de incorporación síncrona de la nueva información. Cuando usted edita un archivo, las modificaciones sobre el mismo se registran en el journal y se llevan a cabo físicamente por partes. Hasta que usted no da la orden, el sistema no guarda la información en el disco. Si se reinicia el sistema inesperadamente no habrá perdido información alguna, dado que el registro de lo que usted estaba haciendo ha quedado guardado en el Journal y no tendrá problemas para recuperarla. Los datos guardados en el Journal reciben el nombre de Metadatos.

Los sistemas de ficheros que incorporan Journaling son Ext3, Xfs, Jfs, ReiserFS y algunos menos conocidos. Posiblemente a usted le interesará trabajar sobre Ext3, dado que es el que más se asemeja a Ext2.

Sistema de paquetes

Linux es un sistema libre. Por ello la gran mayoría de sus aplicaciones son provistas mediante la adquisición del código fuente de la misma, con objetivo de que sea el usuario quien lo compile flexiblemente para adaptarlo a sus necesidades. Una gran parte del software está programado para soportar y usar características de otras aplicaciones para compatibilizarlas. No es extraño encontrar un servidor de ficheros que se autentique mediante una petición a una base de datos, o un servidor de correo provisto de la posibilidad de usar una negociación encriptada de las peticiones de los clientes. Al compilar un software éste genera ficheros ejecutables, librerías y ficheros de configuración, que en el momento de la instalación se copian en su lugar correspondiente dentro de la jerarquía de directorios del sistema. Una vez copiados el usuario podrá usarlos sin ningún problema, no obstante es posible que en breve surjan nuevas versiones del mismo software o simplemente que usted deje de necesitar el mismo, por lo que supuestamente deseará desinstalar la versión en curso o simplemente eliminar el programa de su sistema. En ese momento encontrará usted el problema, puesto que no sabrá en qué lugar se han copiado los ejecutables, las librerías o los ficheros de configuración de cada programa, y deberá recorrer directorios muy grandes en busca de cada fichero que desea borrar, cosa que no siempre le resultará factible, y cuanto menos, práctica.

Con el fin de evitar la problemática que expone compilar las aplicaciones, existe el denominado sistema de paquetes. Un paquete es una aplicación que puede instalarse o desinstalarse mediante ciertas herramientas propias de cada sistema. Las herramientas que le permiten gestionar los paquetes reciben el nombre de sistemas de paquetes.

Cuando usted instala una aplicación usando el sistema de paquetes propio de su distribución de Linux, el sistema no solamente copia los ficheros a su disco duro, sino que almacena un registro de la localización exacta de los mismos para el momento en que usted desee borrarlos o actualizarlos. Los sistemas de paquetes pueden partir de código fuente o de software precompilado. En el segundo caso lo único que debe hacer el usuario es instalar los ficheros precompilados en el disco duro, mientras que en el primer caso el sistema de paquetes debe primero compilar el software siguiendo unas pautas. El sistema de paquetes dicta las pautas de la compilación, pero el usuario puede modificarlas si lo desea antes de compilar para añadir o quitar soporte de ciertas librerías o aplicaciones externas.

El sistema de paquetes entonces es un conjunto de herramientas que le permite gestionar la instalación, actualización y desinstalación de su software manteniendo un orden y una limpieza general en su sistema.

Cuando usted desea compilar una aplicación, lo que descarga de Internet es un tarball, es decir, un fichero empaquetado con tar y comprimido con gzip. La apariencia del fichero puede ser la siguiente, partiendo de que la aplicación del ejemplo se llama Gaim:

gaim-0.65.tar.gz

Como puede observar el nombre del fichero le revela el nombre de la aplicación y la versión de la misma. No siempre tiene por qué ser así, pero por norma general sí que lo es. Los pasos para compilar la aplicación son sencillos dado que normalmente suelen ser los mismos:

  • 1 Descomprimir el tarball
# tar -zxvfp gaim-0.65.tar.gz
  • 2 Esto generará un directorio llamado del mismo nombre que el tarball (por norma general) pero sin la extensión que indica que es un fichero comprimido
#ls
gaim-0.65.tar.gz	gaim-0.65/
#
  • 3 En el directorio generado se encuentra alojado el código fuente de la aplicación junto a diversos archivos y/o directorios de documentación que le indicarán las instrucciones de compilación, así como la configuración y el uso de la aplicación. Entre dentro del directorio para comprobarlo. Lo primero que debe hacer es leer los ficheros README e INSTALL si existen, o en su defecto cualquier fichero adjunto de documentación. En el ejemplo compilaremos la aplicación sin más preámbulos
# ./configure
  • 4 La ejecución del shellscript configure adjunto con el código fuente de la aplicación comprobará los parámetros que usted le haya pasado si desea proporcionar a la aplicación una o más funcionalidades que por defecto no sean incluidas (En este ejemplo no lo hemos hecho, pero si desea comprobar las posibilidades que le ofrece la aplicación puede ejecutar el comando configure con el parámetro --help). Comprobará que el sistema cuenta con las aplicaciones y librerías necesarias para compilar la aplicación con sus funcionalidades añadidas o deshabilitadas por usted. Seguidamente configure generará un fichero Makefile con las instrucciones que make debe ejecutar para compilar el código fuente de la aplicación. El siguiente paso es arrancar el proceso que compilará dichos fuentes: make
  • 5 Make es un programa que lee de un modo estándar cualquier fichero Makefile, y si entiende su contenido entonces se ayuda del compilador gcc para compilar el código fuente que Makefile le ordena que compile y/o instale.
# make
  • 6 Deberá esperar a que make termine su faena. En ese momento tendrá compilados los binarios de los ejecutables, así como las librerías de la aplicación. Solamente queda copiar dichos ficheros a su correspondiente lugar en el sistema para que los usuarios puedan ejecutar los binarios, y estos binarios sepan donde tienen que ir a buscar las librerías de las que dependen.
# make install

Al finalizar, make install habrá copiado los binarios ejecutables en /bin ó en /usr/bin de un modo estándar, tal como lo hacen la mayoría de aplicaciones. Las librerías y las configuraciones, del mismo modo, habrán sido copiadas a /usr/lib ó a /lib , así como el lugar para las configuraciones suele ser /etc ó /usr/etc respectivamente.

Si más adelante desea eliminar Gaim de su disco duro le será sumamente difícil encontrar dentro de /usr/bin (por ejemplo) qué binarios corresponden a Gaim y cuales no, de modo que no sabrá cuales debe borrar. Lo mismo le ocurrirá con las librerías generadas por Gaim.

Para evitar este problema existe un directorio en la jerarquía de directorios del sistema, habilitado expresamente para ubicar las aplicaciones que se compilan a mano. Se trata del directorio:

/usr/local

Una opción que siempre está presente como argumento a configure a la hora de compilar un código fuente es la opción prefix, que le permite especificar un destino para los ficheros que genere la compilación, de modo que le sean después fácilmente localizables. De este modo es posible que desee ejecutar el siguiente comando en sustitución del configure primero:

./configure   --prefix=/usr/local/gaim

Esto indicará a configure que en el fichero Makefile que genere debe especificar /usr/local/gaim como directorio destino explícitamente dentro del cual instalar los ficheros generados por make.

Una vez ejecutados los comandos make y make install necesariamente en ése orden, el sistema habrá generado un directorio /usr/local/gaim/ dentro del cual encontrará varios subdirectorios llamados bin, lib, etc, include y algunos más (o menos) según lo que la aplicación necesite para funcionar. Dentro de /usr/local/gaim/lib/ de éste modo se encontrarán las librerías referentes a Gaim, y del mismo modo con las configuraciones dentro de /usr/local/gaim/etc/.

El problema es que el directorio que aloja el ejecutable de la aplicación no se encuentra en el PATH del usuario (ejecute echo $PATH si quiere comprobarlo). De este modo, para ejecutar la aplicación deberá especificar en el comando todo el camino hacia el binario correspondiente, en este caso:

$ /usr/local/gaim/bin/gaim

Posiblemente le resulte incómodo ejecutar las aplicaciones de este modo, pero haciéndolo así se asegurará de mantener su sistema limpio, dado que cuando desee borrar Gaim de su sistema únicamente deberá borrar el directorio /usr/local/gaim/.

Para solventar la incomodidad de pasar todo el camino hacia el ejecutable a la hora de lanzar una aplicación, y para mantener un orden y una coherencia lógicos en el sistema pudiendo instalar y desinstalar correcta y cómodamente las aplicaciones, se encuentra el sistema de paquetes de cada distribución. Por norma general cuando instala una aplicación con su sistema de paquetes, ésta copia sus ficheros directamente dentro de /usr/ , cosa que he explicado anteriormente que no debería hacerse, pero en este caso no importa que así sea, dado que en el momento que desee borrar la aplicación de su sistema podrá hacerlo de forma cómoda usando el sistema de paquetes.

El sistema de paquetes no le permite únicamente instalar o desinstalar aplicaciones una por una, sino que si se fija es el método usado por el sistema de instalación para copiar la base del sistema a su disco duro, así como las aplicaciones que quiere incluir con la instalación base. Es por ello que cada distribución de Linux utiliza un sistema de paquetes diferente.

Nota: El sistema de paquetes es propio de cada distribución, aunque no por ello dejan de poderse utilizar en otras distribuciones. De este modo es posible encontrar Red Hat usando el sistema de paquetes de Debian, u otras variedades por el estilo.

También es importante tener claro que la existencia de un sistema de paquetes en su distribución no implica que usted no pueda compilar aplicaciones por sí mismo, aunque la opción más acertada es compilar las aplicaciones para generar usted mismo sus propios paquetes que después podrá fácilmente instalar o desinstalar.

Herramientas personales