jueves, 24 de septiembre de 2009

VICTOR EDUARDO RIVEROL PASCUAL


UNIX is one of the most popular operating systems in the world due to its extensive distribution and support. Originally developed as a multitasking system with time-sharing minicomputers and mainframes to mid-70s, and has since become one of the most used despite its occasionally confusing user interface and the problem of standardization. There are numerous versions of UNIX for many systems, from personal computers to supercomputers like the Cray Y-MP. Most versions of Unix for personal computers are very expensive. When writing this book, a copy machine 386 of UNIX System V from AT & T





REDES DELINUX
UNIX es uno de los sistemas operativos más populares del mundo debido a su extenso soporte y distribución. Originalmente fue desarrollado como sistema multitarea con tiempo compartido para miniordenadores y mainframes a mediados de los ‘70, y desde entonces se ha convertido en uno de los sistemas más utilizados a pesar de su, ocasionalmente, confusa interfaz con el usuario y el problema de su estandarización.
¿Cuál es la verdadera razón de la popularidad de UNIX? Muchos hackers consideran que UNIX es el auténtico y único sistema operativo. El desarrollo de Linux parte de un grupo en expansión de hackers de UNIX que quisieron hacer su sistema con sus propias manos.
Existen numerosas versiones de UNIX para muchos sistemas, desde ordenadores personales hasta supercomputadores como el Cray Y-MP. La mayoría de las versiones de UNIX para ordenadores personales son muy caras. Cuando se escribía este libro, una copia para una máquina 386 del UNIX System V de AT&T costaba unos 1500 dólares estadounidenses.
Linux es una versión de UNIX de libre distribución, inicialmente desarrollada por Linus Torvalds en la Universidadde Helsinki, en Finlandia. Fue desarrollado con la ayuda de muchos programadores y expertos de UNIX a lo largo y ancho del mundo, gracias a la presencia de Internet. Cualquier habitante del planeta puede acceder a Linux y desarrollar nuevos módulos o cambiarlo a su gusto.
El núcleo de Linux no utiliza ninguna línea del código de AT&T o de cualquier otra fuente de propiedad comercial, y buena parte del software para Linux se desarrolla bajo las reglas del proyecto de GNU de la Free Software Foundation, Cambridge, Massachusetts.
Inicialmente, sólo fue un proyecto de Linus Torvalds. Se inspiraba en Minix, un pequeño UNIX desarrollado por Andy Tanenbaum, y las primeras discusiones sobre Linux surgieron en el grupo de News comp.os.minix. Estas discusiones giraban en torno al desarrollo de un pequeño sistema UNIX de carácter académico dirigido a aquellos usuarios de Minix que querían algo más.
El desarrollo inicial de Linux ya aprovechaba las características de conmutación de tareas en modo protegido del 386, y se escribió todo en ensamblador. Linus dice, "Comencé a utilizar el C tras escribir algunos drivers, y ciertamente se aceleró el desarrollo. En este punto sentí que mi idea de hacer un Minix mejor que Minix se hacía más seria. Esperaba que algún día pudiese recompilar el gcc bajo Linux... Dos meses de trabajo, hasta que tuve un driver de discos (con numerosos bugs, pero que parecía funcionar en mi PC) y un pequeño sistema de ficheros. Aquí tenía ya la versión 0.01 (al final de Agosto de 1991) no era muy agradable de usar sin el driver de disquetes, y no hacía gran cosa. No pensé que alguien compilaría esa versión."
No se anunció nada sobre esa versión, puesto que las fuentes del 0.01 jamás fueron ejecutables: contenían solo rudimentos de lo que sería el núcleo, y se asumía que se tenía acceso a un Minix para poderlo compilar y jugar con él.
El 5 de Octubre de 1991, Linus anunció la primera versión "oficial" de Linux, la 0.02. Ya podía ejecutar bash (el shell de GNU) y gcc (el compilador de C de GNU), pero no hacía mucho más. La intención era ser un juguete para hackers. No había nada sobre soporte a usuarios, distribuciones, documentación ni nada parecido. Hoy, la comunidad de Linux aún trata estos asuntos de forma secundaria. Lo primero sigue siendo el desarrollo del kernel.
Linus escribía en comp.os.minix, "¿Suspiráis al recordar aquellos días de Minix-1.1, cuando los hombres eran hombres y escribían sus propios drivers? ¿Os sentís sin ningún proyecto interesante y os gustaría tener un verdadero Sistema operativo que pudieras modificar a placer? ¿Os resulta frustrante el tener solo a Minix? Entonces, este artículo es para vosotros".
"Como dije hace un mes, estoy trabajando en una versión gratuita de algo parecido a Minix para ordenadores At-386. He alcanzado la etapa en la que puede ser utilizable y voy a poner las fuentes para su distribución. Es solo la versión 0.02, pero he conseguido ejecutar en él: bash, gcc, gnu-make, gnu-sed, compress, etc.".
Tras la versión 0.03, Linus saltó a la versión 0.10 al tiempo que más gente empezaba a participar en su desarrollo. Tras numerosas revisiones, se alcanzó la versión 0.95, reflejando la esperanza de tener lista muy pronto una versión "oficial". (Generalmente, la versión 1.0 de los programas se corresponden con la primera teóricamente completa y sin errores). Esto sucedía en Marzo de 1992. Año y medio después, en Diciembre del 93, el núcleo estaba en la revisión 0.99.pl14, en una aproximación asintótica al 1.0. Actualmente, el núcleo se encuentra en la versión 1.1 parche 52, y se acerca la 1.2.2.
Hoy Linux es ya un clónico de UNIX completo, capaz de ejecutar X Windows, TCP/IP, Emacs, UUCP y software de correo y News. Mucho software de libre distribución ha sido ya portado a Linux, y están empezando a aparecer aplicaciones comerciales. El hardware soportado es mucho mayor que en las primeras versiones del núcleo. Mucha gente ha ejecutado tests de rendimiento en sus sistemas Linux 486 y se han encontrado que son comparables a las estaciones de trabajo de gama media de Sun Microsystems y Digital.
¿Quién iba a imaginar que este "pequeño" clónico de UNIX iba a convertirse en un estándar mundial para los ordenadores personales?
Características del sistema
Linux implementa la mayor parte de las características que se encuentran en otras implementaciones de UNIX, más algunas otras que no son habituales. En esta sección nos daremos una vuelta por todo ello.
Linux es un sistema operativo completo con multitarea y multiusuario (como cualquier otra versión de UNIX). Esto significa que pueden trabajar varios usuarios simultáneamente en él, y que cada uno de ellos puede tener varios programas en ejecución.
El sistema Linux es compatible con ciertos estándares de UNIX a nivel de código fuente, incluyendo el IEEE POSIX.1, System V y BSD. Fue desarrollado buscando la portabilidad de los fuentes: encontrará que casi todo el software gratuito desarrollado para UNIX se compila en Linux sin problemas. Y todo lo que se hace para Linux (código del núcleo, drivers, librerías y programas de usuario) es de libre distribución.
En Linux también se implementa el control de trabajos POSIX (que se usa en los shells csh y bash), las pseudoterminales (dispositivos pty), y teclados nacionales mediante administradores de teclado cargables dinámicamente. Además, soporta consolas virtuales, lo que permite tener más de una sesión abierta en la consola de texto y conmutar entre ellas fácilmente. A los usuarios del programa "screen" les resultará familiar esto.
El núcleo es capaz de emular por su cuenta las instrucciones del coprocesador 387, con lo que en cualquier 386 con coprocesador o sin él se podrán ejecutar aplicaciones que lo requieran.
Linux soporta diversos sistemas de ficheros para guardar los datos. Algunos de ellos, como el ext2fs, han sido desarrollados específicamente para Linux. Otros sistemas de ficheros, como el Minix-1 o el de Xenix también están soportados. Y con el de MS-DOS se podrán acceder desde Linux a los disquetes y particiones en discos duros formateados con MS-DOS. Además, también soporta el ISO-9660, que es el estándar en el formato de los CD-ROMs.
Linux implementa todo lo necesario para trabajar en red con TCP/IP. Desde administradores para las tarjetas de red más populares hasta SLIP/PPP, que permiten acceder a una red TCP/IP por el puerto serie. También se implementan PLIP (para comunicarse por el puerto de la impresora) y NFS (para acceso remoto a ficheros). Y también se han portado los clientes de TCP/IP, como FTP, telnet, NNTP y SMTP.
El núcleo de Linux ha sido desarrollado para utilizar las características del modo protegido de los microprocesadores 80386 y 80486. En concreto, hace uso de la gestión de memoria avanzada del modo protegido y otras características avanzadas. Cualquiera que conozca la programación del 386 en el modo protegido sabrá que este modo fue diseñado para su uso en UNIX (o tal vez Multics). Linux hace uso de esta funcionalidad precisamente.
El núcleo soporta ejecutables con paginación por demanda. Esto significa que sólo los segmentos del programa que se necesitan se cargan en memoria desde el disco. Las páginas de los ejecutables son compartidas mediante la técnica copy-on-write, contribuyendo todo ello a reducir la cantidad de memoria requerida para las aplicaciones.
Con el fin de incrementar la memoria disponible, Linux implementa la paginación con el disco: puede tener hasta 256 megabytes de espacio de intercambio o "swap" en el disco duro. Cuando el sistema necesita más memoria, expulsará páginas inactivas al disco, permitiendo la ejecución de programas más grandes o aumentando el número de usuarios que puede atender a la vez. Sin embargo, el espacio de intercambio no puede suplir totalmente a la memoria RAM, ya que el primero es mucho más lento que ésta.
La memoria dedicada a los programas y a la caché de disco está unificada. Por ello, si en cierto momento hay mucha memoria libre, el tamaño de la caché de disco aumentará acelerando así los accesos.
Los ejecutables hacen uso de las librerías de enlace dinámico. Esto significa que los ejecutables comparten el código común de las librerías en un único fichero, como sucede en SunOS. Así, los ejecutables serán más cortos a la hora de guardarlos en el disco, incluyendo aquellos que hagan uso de muchas funciones de librería. También pueden enlazarse estáticamente cuando se deseen ejecutables que no requieran la presencia de las librerías dinámicas en el sistema. El enlace dinámico se hace en tiempo de ejecución, con lo que el programador puede cambiar las librerías sin necesidad de recompilación de los ejecutables.
Multitarea
La palabra multitarea describe la capacidad de ejecutar muchos programas al mismo tiempo sin detener la ejecución de cada aplicación.
Se le denomina multitarea prioritaria porque cada programa tiene garantizada la oportunidad de ejecutarse, y se ejecuta hasta que el sistema operativo da prioridad a otro programa para que se ejecute. Este tipo de multitarea es exactamente lo que hace Linux. MS-DOS y Windows 3.1 no admiten la multitarea prioritaria; admiten una forma de multitarea denominada multitarea cooperativa. Con ésta, los programas se ejecutan hasta que permiten voluntariamente que se ejecuten otros programas o no tienen nada más que hacer por el momento. Para comprender mejor la capacidad multitarea de Linux, examínelo desde otro punto de vista. El microprocesadorsólo es capaz de hacer una tarea a la vez, pero las realiza en tiempos tan cortos que se escapan a nuestra comprensión es por eso que en sus "ratos libres" se dedica a ejecutar otras tareas que se le hayan pedido.
Es fácil ver las ventajas de disponer de multitarea prioritaria. Además de reducir el tiempo muerto (tiempo en el que no puede seguir trabajando en una aplicación porque un proceso aún no ha finalizado), la flexibilidad de no tener que cerrar las ventanas de las aplicaciones antes de abrir y trabajar con otras es infinitamente mucho más cómoda.
Linux y otros sistemas operativos multitarea prioritaria consiguen el proceso de prioridad supervisando los procesos que esperan para ejecutarse, así como los que se están ejecutando. El sistema programa entonces cada proceso para que disponga de las mismas oportunidades de acceso al microprocesador. El resultado es que las aplicaciones abiertas parecen estar ejecutándose al mismo tiempo (en realidad, hay una demora de billonésimas de segundo entre el momento en que el procesador ejecuta una serie de instrucciones de una aplicación y el momento programado por Linux para volver a dedicar tiempo a dicho proceso). Es esta capacidad de asignar tiempo a las aplicaciones que se están ejecutando desde una sistema operativo de acceso gratuito, lo que destaca a Linux de otros sistemas operativos y entornos disponibles en la actualidad.
Multiusuario
La idea de que varios usuarios pudieran acceder a las aplicaciones o la capacidad de proceso de un único PC era una utopía hace relativamente pocos años. UNIX y Windows NT ayudaron a convertir ese sueño en realidad. La capacidad de Linux para asignar el tiempo de microprocesador simultáneamente a varias aplicaciones ha derivado en la posibilidad de ofrecer servicio a diversos usuarios a la vez, ejecutando cada uno de ellos una o más aplicaciones. La característica que más resalta de Linux es que un grupo de personas puede trabajar con la misma versión de la misma aplicación al mismo tiempo, desde el mismo terminal o desde terminales distintos. No se debe confundir esto con el hecho de que varios usuarios puedan actualizar el mismo archivo simultáneamente, característica que es potencialmente confusa, peligrosa y decididamente indeseable.
Diferencias entre Linux y otros sistemas operativos
Es importante entender las diferencias entre Linux y otros sistemas operativos, tales como MS-DOS, OS/2, y otras implementaciones de UNIX para ordenador personal. Primeramente, conviene aclarar que Linux puede convivir felizmente con otros sistemas operativos en la misma máquina: es decir, Ud. puede correr MS-DOS y OS/2 en compañía de Linux sobre el mismo sistema sin problemas.
¿Por qué usar Linux en lugar de un sistema operativo comercial conocido, bien probado, y bien documentado? Podríamos darle miles de razones. Una de las más importantes es que Linux es una excelente elección para trabajar con UNIX a nivel personal. Si Ud. es un desarrollador de software UNIX, Linux le permitirá desarrollar y probar el software UNIX en su PC, incluyendo aplicaciones de bases de datos y X Windows. Si es Ud. estudiante, la oportunidad está en que los sistemas de su universidad correrán UNIX. Con Linux, podrá correr su propio sistema UNIX y adaptarlo a sus necesidades. La instalación y uso de Linux es también una excelente manera de aprender UNIX si no tiene acceso a otras máquinas UNIX.
Pero no perdamos la vista. Linux no es sólo para los usuarios personales de UNIX. Es robusto y suficientemente completo para manejar grandes tareas, así como necesidades de cómputo distribuidas. Muchos negocios, especialmente los pequeños, se están cambiando a Linux en lugar de otros entornos de estación de trabajo basados en UNIX. Las universidades encuentran a Linux perfecto para dar cursos de diseño de sistemas operativos. Grandes vendedores de software comercial se están dando cuenta de las oportunidades que puede brindar un sistema operativo gratuito.
Introducción a las redes
Historia
La idea de redes es probablemente tan vieja como las telecomunicaciones. Considere a la gente que vivía en la edad de piedra, donde los tambores se pueden haber usado para transmitir mensajes entre individuos. Suponga que el cavernícola A quiere invitar al cavernícola B a un partido de lanzamiento de rocas contra el otro, pero viven demasiado lejos como para que B oiga a A golpear su tambor. ¿Cuáles son las opciones de A?
· ir a la cueva de B.
· hacerse con un tambor más grande.
· pedirle a C, que vive a mitad de camino entre los dos, que le retransmita el mensaje.
La última opción es lo que se llama una red.
Claro que ya ha pasado un tiempo desde las persecuciones y planes primitivos de nuestros antepasados. Hoy en día tenemos ordenadores que hablan entre sí a través de vastas conexiones de cables, fibras ópticas, microondas, etc. A continuación trataremos sobre el significado y modos en que se realiza esto fuera de los cables.
Describiremos dos tipos de redes en esta guía: Las basadas en UUCP, y las basadas en TCP/IP. Estos son conjuntos de protocolos y paquetes de software que suministran medios para transportar datos entre dos ordenadores.
Definiremos una red como un conjunto de nodos que son capaces de comunicarse entre sí, contando con los servicios de un número de nodos dedicados que conmutan datos entre participantes. Los nodos son a menudo ordenadores, pero no es necesario; cualquiera puede pensar también en terminales X o impresoras inteligentes como nodos.
Redes
Linux dispone de los dos principales protocolos de red para sistemas UNIX: TCP/IP y UUCP. TCP/IP (para los aficionados a los acrónimos, Transmission Control Protocol/Internet Protocol) es un conjunto de protocolos de red que permite a sistemas de todo el mundo comunicarse en una única red conocida como Internet. Con Linux, TCP/IP y una conexión a la red, puede comunicarse con usuarios y máquinas por toda Internet mediante correo electrónico, noticias (USENET news), transferencias de ficheros con FTP y mucho más. Actualmente hay muchos sistemas Linux conectados a Internet.
La mayoría de las redes TCP/IP usan Ethernet como tipo de red física de transporte. Linux da soporte a muchas tarjetas de red Ethernet e interfaces para ordenadores personales, incluyendo el adaptador Ethernet D-Link de bolsillo para ordenadores portátiles.
Pero dado que no todo el mundo tiene una conexión Ethernet en casa, Linux también proporciona SLIP (Serial Line Internet Protocol), el cual permite conectarse a Internet a través de un módem. Para poder usar SLIP, necesitará tener acceso a un servidor de SLIP, una máquina conectada a la red que permite acceso de entrada por teléfono. Muchas empresas y universidades tienen servidores SLIP disponibles. De hecho, si su sistema Linux dispone de conexión Ethernet y de módem, puede configurarlo como servidor de SLIP para otros usuarios.
NFS (Network File System) permite fácilmente compartir ficheros con otras máquinas de la red. FTP (File Transfer Protocol) permite la transferencia de ficheros entre máquinas.
Si tiene experiencia con aplicaciones TCP/IP en otros sistemas UNIX, Linux le será muy familiar. El sistema proporciona la interface estándar de programación por "sockets", lo que virtualmente permite que cualquier programa que use TCP/IP pueda ser llevado a Linux. El servidor Linux de X también soporta TCP/IP, permitiendo ver aplicaciones que están corriendo en otros sistemas sobre su pantalla.
UUCP (UNIX-to-UNIX Copy) es un viejo mecanismo usado para transferir ficheros, correo electrónico y noticias entre máquinas UNIX. Clásicamente las máquinas UUCP conectan entre ellas mediante líneas telefónicas y módem, pero UUCP es capaz de funcionar también sobre una red TCP/IP. Si no tiene acceso a una red TCP/IP o a un servidor SLIP, puede configurar su sistema para enviar y recibir ficheros y correo electrónico usando UUCP.
La importancia de una administración adecuada
Todos los sistemas UNIX son distintos de un forma u otra y cada sistema individual UNIX es distinto en la forma en que debe administrarse. Linux no es una excepción. Las tareas de administración varían dependiendo, entre otras cosas, del número de usuarios a administrar, los tipos de periféricos conectados al conmutador, las conexiones de red y el nivel de seguridad necesaria.
Un administrador de sistema tiene que proporcionar a los usuarios del sistema un entorno eficiente, seguro y fiable.
La delegación de las responsabilidades de administración varía de un sistema a otro. En sistemas pequeños se asigna a un simple usuario la tarea de administrador. Si se trabaja en un entorno de red, la administración la realiza un administrador de red.
Todos los sistemas Linux tienen un sólo usuario que puede realizar cualquier operación en el computador denominado superusuario, con un nombre especial de entrada llamado root (descripto a continuación).
Acerca de raíces, sombreros y la sensación de poder
Como sabe, UNIX distingue diferentes rangos de usuarios. Cada usuario recibe una cuenta que incluye un nombre de usuario y un directorio inicial entre otras cosas. Además de las cuentas dadas a personas reales, existen cuentas especiales, definidas por el sistema, que tienen privilegios especiales. La más importante de éstas es la cuenta raíz, con el nombre de usuario root.
La cuenta root
Los usuarios normales están restringidos normalmente para que no puedan dañar a nadie más en el sistema, sólo a ellos mismos. Los permisos de los ficheros en el sistema están preparados para que los usuarios normales no tengan permitido borrar o modificar ficheros en directorios compartidos por todos los usuarios (como son /bin y /usr/bin). Muchos usuarios también protegen sus propios ficheros con los permisos adecuados para que otros usuarios no puedan acceder o modificar éstos ficheros.
Estas restricciones desaparecen para root. El usuario root puede leer, modificar o borrar cualquier fichero en el sistema, cambiar permisos y pertenencias en cualquier fichero, y ejecutar programas especiales, como pueden ser los que particionan un disco o crean sistemas de ficheros. La idea básica es que la persona o personas que ejecutan y cuidan del sistema entren como root cuando sea necesario para realizar tareas que no pueden ser ejecutadas por un usuario normal. Puesto que root puede hacer todo, es fácil cometer errores que tengan consecuencias catastróficas cuando se trabaja utilizando esta cuenta.
Por ejemplo, como un usuario normal, si inadvertidamente se intentase borrar todos los ficheros en /etc, el sistema no lo permitiría. Sin embargo, como usuario root, el sistema no diría nada. Es muy simple el dañar sistema utilizando root. La mejor forma de evitar accidentes es:
· Pensar dos veces antes de presionar en un comando que pueda causar daño.
· No acostumbrarse a utilizar root. Cuanto más confortable se encuentre uno trabajando con el usuario root, más seguro que se confundirán los privilegios con los de un usuario normal.
· Utilizar un marcador distinto para la cuenta root. Se debe cambiar el fichero .bashrc o el login de root para poner el marcador del intérprete a algo distinto del marcador de usuario normal. Por ejemplo, mucha gente utiliza el carácter "$" como marcador para los usuarios normales, y reserva el carácter "#" como marcador para el usuario root.
· Conectarse como root sólo cuando sea absolutamente necesario. Y desconectarse tan pronto como se haya terminado el trabajo. Cuanto menos se use la cuenta root, menos posibilidades habrá de dañar el sistema.
Por supuesto, existe una variante de hackers de UNIX que utilizan root para prácticamente todo. Pero cada uno de ellos ha cometido, en algún momento, algún error tonto como root y corrompido el sistema. La regla general es que hasta que se familiarice con la falta de restricciones de root, y esté cómodo utilizando el sistema sin dichas restricciones, procure conectarse como root lo menos posible.
Por supuesto, todo el mundo comete errores. El mismo Linus Torvalds borró accidentalmente una vez el árbol de directorios completo del núcleo de su sistema. Horas de trabajo se perdieron para siempre. Afortunadamente, sin embargo, gracias a su conocimientodel código del sistema de ficheros, fue capaz de reiniciar el sistema y reconstruir el árbol de directorios del disco a mano.
Pongámoslo de otra forma, si se imagina la utilización de la cuenta root como un sombrero mágico especial que le da montones de poderes, pudiendo, con un gesto de la mano destruir ciudades enteras, es una buena idea de lo que es ser un poco cauto con lo que se hace con las manos. Puesto que es fácil mover la mano de manera destructiva por accidente, no sería ideal llevar el sombrero mágico cuando no es necesario, a pesar de la maravillosa sensación.
Comprensión de los sistemas de proceso centralizado
Debido al avance tecnológico durante las décadas de 1950 y 1960, los sistemas operativos comenzaron a permitir que varios usuarios compartieran recursos desde terminales distintos. Dos usuarios podían, en una secuencia de proceso por lotes, ejecutar dos conjuntos de instrucciones al mismo tiempo que compartían un procesador, el almacenamiento y la salida.
Con la llegada de la red telefónica conmutada, los computadores comenzaron a utilizar los recursos telefónicos para extender geográficamente los recursos informáticos. Con este modelo, cada procesador utilizaba recursos de proceso de comunicaciones para conectarse con terminales remotos. Esto hizo necesario que los terminales y computadores se pudieran comunicar de una forma mejor. El resultado fue el desarrollo del procesamiento de interfaz de cara al usuario para las tareas de comunicación y el modelo de procesamiento centralizado.
Hasta que los computadores personales fueron de un precio accesible, potentes, y de uso general, la mayoría de los sistemas UNIX utilizaban el modelo de proceso centralizado. Con este tipo de modelo los computadores mainframe se encargaban de todo el procesamiento. Este modelo cada vez se utiliza menos hoy en día, aunque es adecuado para las ubicaciones informáticas cuyos usuarios estén dispersos geográficamente.