Sistemas Operativos Unix y Linux

Universidad de Puerto Rico en Bayamón Departamento de Ciencias de Computadoras Sistemas Operativos UNIX y Linux SICI-40

Views 90 Downloads 0 File size 134KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Universidad de Puerto Rico en Bayamón Departamento de Ciencias de Computadoras

Sistemas Operativos UNIX y Linux SICI-4029-KH1 Prof. Antonio Huertas

Giselle M Zeno 841-06-9108 Luis Ojeda 841-05-4425 Víctor Santa 841-05-6993

Sistema Operativo UNIX

Historia de UNIX

UNIX es un sistema operativo portable, multitasking y multiuser; que fue creado en 1969 por un grupo de empleados de los laboratorios Bell de AT&T, entre ellos Ken Thompson, Dennis Ritchie y Douglas McIlroy. A finales de 1960, el Instituto Tecnológico de Massachusetts, los Laboratorios Bell de AT&T y General Electric trabajaban en un sistema operativo experimental conocido como Multics (Multiplexed Information and Computing Service) 1, desarrollado para ejecutarse en una mainframe modelo GE-645. El objetivo del proyecto era desarrollar un sistema operativo interactivo que fuera innovador, y a su vez tuviera mejoras en las políticas de seguridad. El proyecto en un principio no rindió lo esperado, ya que sus primeras versiones contaban con un pobre rendimiento. Los laboratorios Bell de AT&T decidieron no apoyar el mismo y dedicar sus recursos a otros proyectos. Al ocurrir esto uno de los programadores del equipo de los laboratorios Bell, Ken Thompson, siguió trabajando para la computadora GE-635 y escribió un juego llamado Space Travel 2, pero descubre que el juego era lento en la máquina de General Electric y resultaba realmente caro, un aproximado de 75 dólares por cada juego. De este modo, Thompson escribió otra vez el programa, con ayuda de Dennis Ritchie, en lenguaje de ensamblador, para que se ejecutara en una computadora DEC PDP-7. Esta experiencia, junto al trabajo que desarrolló para el proyecto Multics, llevo a Thompson a iniciar la creación de un nuevo sistema operativo para la DEC PDP-7. Thompson y Ritchie se

encargaron de dirigir un grupo de programadores, entre ellos a Rudd Canaday, en los laboratorios Bell, para desarrollar tanto el sistema de archivos como el sistema operativo multitasking en sí. A lo anterior, agregaron un intérprete de comandos y un pequeño conjunto de programas. El proyecto fue bautizado UNICS, derivado de Uniplexed Information and Computing System, porque sólo podía daba servicios a dos usuarios. La autoría de esta sigla se le atribuye a Brian Kernighan, ya que era un hack de Multics. Dada la popularidad que tuvo un juego de palabras que consideraba a UNICS un sistema MULTICS castrado (pues eunuchs, en inglés, es un sinonimo de UNICS), se cambió el nombre a UNIX. Hasta ese instante, no había existido apoyo económico por parte de los laboratorios Bell, pero eso cambió cuando el Grupo de Investigación en Ciencias de Computadoros decidió utilizar UNIX en una máquina superior a la PDP-7. Thompson y Ritchie lograron cumplir con la solicitud de agregar herramientas que permitieran el procesamiento de textos a UNIX en una máquina PDP-11/20, y como consecuencia de ello consiguieron el apoyo económico de los laboratorios Bell. Fue así como por vez primera, en 1970, se habla oficialmente del sistema operativo UNIX] ejecutado en una PDP-11/20. Se incluyo en él un programa para dar formato a textos (runoff) y un editor de texto. Tanto el sistema operativo como los programas fueron escritos en el lenguaje ensamblador de la PDP-11/20. Este sistema de procesamiento de texto inicial, compuesto tanto por el sistema operativo como de runoff y el editor de texto, fue utilizado en los laboratorios Bell para procesar las solicitudes de patentes que ellos recibían. Pronto, runoff evolucionó hasta llegar a troff, el primer programa de edición electrónica que permitía realizar composición tipográfica. El 3 de noviembre de 1971 Thomson y Ritchie publicaron un manual de programación de UNIX (títulado: "UNIX Programmer's Manual").

En 1972 se tomó la decisión de escribir nuevamente UNIX, pero esta vez en el lenguaje de programación C. Este cambio significaba que UNIX podría ser fácilmente modificado para funcionar en otras computadoras (de esta manera, se volvía portable) y así otras variaciones podían ser desarrolladas por otros programadores. Ahora, el código era más conciso y compacto, lo que se tradujo en un aumento en la velocidad de desarrollo de UNIX. AT&T puso a UNIX a disposición de universidades y compañías, también al gobierno de los Estados Unidos, a través de licencias. Una de estas licencias fue otorgada al Departamento de Computadoras de la Universidad de California, con sede en Berkeley. En 1975 esta institución desarrolló y publicó su propio sucesor de UNIX, conocido como Berkeley Software Distribution (BSD), que se convirtió en una fuerte competencia para la familia UNIX de AT&T. Mientras tanto, AT&T creó una división comercial denominada Unix Systems Laboratories para la explotación comercial del sistema operativo. El desarrollo prosiguió, con la entrega de las versiones 4, 5 y 6 en el transcurso de 1975. Estas versiones incluían los pipes, lo que permitió dar al desarrollo una orientación modular respecto a la base del código, consiguiendo aumentar aún más la velocidad de desarrollo. Ya en 1978, cerca de 600 o más máquinas estaban ejecutándose con alguna de las distintas encarnaciones de UNIX. La versión 7, la última versión del UNIX original con amplia distribución, entró en circulación en 1979. Las versiones 8, 9 y 10 se desarrollaron durante la década de 1980, pero su circulación se limitó a unas cuantas universidades, a pesar de que se publicaron los informes que describían el nuevo trabajo. Los resultados de esta investigación sirvieron de base para la creación de Plan 9, un nuevo sistema operativo portable y distribuido, diseñado para ser el sucesor de UNIX en investigación por los Laboratorios Bell.

AT&T entonces inició el desarrollo de UNIX System III, basado en la versión 7, como una variante de tinte comercial y así vendía el producto de manera directa. La primera versión se lanzó en 1981. A pesar de lo anterior, la empresa subsidiaria Western Electric seguía vendiendo versiones antiguas de Unix basadas en las distintas versiones hasta la séptima. Para finalizar con la confusión con todas las versiones divergentes, AT&T decidió combinar varias versiones desarrolladas en distintas universidades y empresas, dando origen en 1983 al Unix System V Release 1. Esta versión presentó características tales como el editor Vi y la biblioteca curses, desarrolladas por Berkeley Software Distribution en la Universidad de California, Berkeley. También contaba con compatibilidad con las máquinas VAX de la compañía DEC. En 1993, la compañía Novell adquirió la división Unix Systems Laboratories de AT&T junto con su propiedad intelectual. Esto ocurrió en un momento delicado en el que Unix Systems Laboratories disputaba una demanda en los tribunales contra BSD por infracción de los derechos de copyright, revelación de secretos y violación de marca de mercado. BSD no solamente ganó el juicio sino que cambiaron tornas descubriendo que grandes porciones del código de BSD habían sido copiadas ilegalmente en UNIX System V. En realidad, la propiedad intelectual de Novell (recién adquirida de Unix Systems Laboratories) se reducía a unos pocos ficheros fuente. La correspondiente contra-demanda acabó en un acuerdo extrajudicial cuyos términos permanecen bajo secreto a petición de Novell. Aproximadamente por esa misma fecha, un estudiante de ciencias de la computación llamado Linus Torvalds desarrolló un núcleo para computadoras con arquitectura de procesador Intel x86 que mimetizaba muchas de las funcionalidades de UNIX y lo lanzó en forma de código abierto en 1991, bajo el nombre de Linux. En 1992, el núcleo Linux fue combinado con los

programas desarrollados por el Proyecto GNU, dando como resultado el Sistema Operativo GNU/Linux. En 1995, Novell vendió su división UNIX comercial a Santa Cruz Operation (SCO) reservándose, aparentemente, algunos derechos de propiedad intelectual sobre el software. SCO continúa la comercialización de System V en su producto UnixWare, que durante cierto tiempo pasó a denominarse OpenUnix, aunque ha retomado de nuevo el nombre de UnixWare.

Manejo de Memoria

Para sistemas de multiprogramación, la mayoría de los sistemas operativos UNIX utilizan la técnica de intercambio (swapping) o paginación por demanda (o ambas) como técnicas de manejo de memoria. La mejor opción depende del tipo de aplicación que se correrá en el sistema: si la mayoría de los trabajos son pequeños entonces la técnica de intercambio sería la mejor opción, pero si el sistema correrá varios trabajos grandes conviene utilizar paginación por demanda.

La técnica de intercambio requiere que el programa entero se encuentre en memoria antes de que pueda ser ejecutado, esto impone una restricción de tamaño en los programas. Por ejemplo, si hay 2MB de memoria y el sistema operativo utiliza la mitad (1MB), entonces el tamaño de los programas debe ser menor de un megabyte. El intercambio utiliza una política round robin – cuando el pedazo tiempo de un trabajo se terminó, o cuando se genera una interrupción de entrada y/o salida (I/O por sus siglas en inglés), el trabajo entero se intercambia a

almacenamiento secundario para hacer espacio para otros trabajos que están en la cola de trabajos listos. Esto no significa un problema mientras hallan relativamente pocos procesos en el sistema, pero cuando el tráfico es pesado el intercambio puede hacer que el sistema se torne más lento.

La paginación por demanda requiere configuraciones de hardware más complicadas; el sistema incrementa el overhead y bajo cargas pesadas puede conllevar a thrashing. Pero tiene la ventaja de implementar el concepto de memoria virtual.

El manejador de memoria le da al código del programa un trato especial. Porque varios procesos van a estar compartiéndolo, el espacio reservado para el programa no puede ser liberado hasta que todos los procesos utilizándolo hayan completado su ejecución. UNIX utiliza una tabla de texto para realizar un seguimiento de cuáles procesos están utilizando cuál código de programa y la memoria no es liberada hasta que el código del programa ya no es necesitado.

El kernel de UNIX, el cual reside permanentemente en memoria, es parte del sistema operativo que implementa las llamadas al sistema para crear los límites de memoria para que varios procesos puedan coexistir en memoria al mismo tiempo. Los procesos utilizan llamadas al sistema para interactuar con el manejador de archivos y solicitar servicios de I/O.

El kernel es el conjunto de programas que implementan las funciones más primitivas del sistema. Las secciones restantes del sistema operativo manejadas en la misma manera que cualquier otro programa grande. Las páginas del sistema operativos son cargadas a memoria

según la demanda, solo cuando son necesitadas, y su espacio en memoria es liberado según otras páginas son llamadas. UNIX utiliza el algoritmo de último recientemente utilizado (LRU por sus siglas en inglés).

Manejo de Procesos

El manejador de procesos en el kernel del sistema UNIX, maneja la asignación del CPU, la programación de procesos, y la satisfacción de las solicitudes de los procesos. Para realizar estas tareas, el kernel mantiene varias tablas importantes para coordinar la ejecución de estos procesos y la asignación de los dispositivos.

Utilizando una política predefinida, el programador de procesos selecciona un proceso de la cola de procesos listos y comienza su ejecución durante un pedazo de tiempo ya dado. (Los procesos pueden encontrarse en cualquiera de los cinco estados: aguantado, listo, esperando, corriendo o acabado.)

El algoritmo de programación de procesos selecciona el proceso con la mayor prioridad para ser corrido primero. Debido a que uno de los valores que se utiliza para computar la prioridad es el tiempo acumulado de CPU, cualquier proceso que ya haya utilizado más tiempo de CPU tendrá menor prioridad que uno otro que lo haya utilizado menos. Luego el sistema actualiza la razón de tiempo-total-para-computar para cada trabajo cada segundo. Esta razón divide la cantidad de tiempo de CPU que un proceso ha utilizado entre el total de tiempo que ese

mismo proceso ha pasado en el sistema. Un resultado cercano a 1 indicaría que el proceso está atado al CPU. Si varios procesos tienen la misma prioridad, se manejan con el algoritmo roundrobin (los procesos de baja-prioridad son interrumpidos por los procesos de alta-prioridad). Los procesos interactivos típicamente tienen un tiempo bajo de tiempo-total-para-computar, de modo que la respuesta interactiva se mantiene sin políticas especiales.

El efecto total de esta retroalimentación negativa es que el sistema balancea trabajos de entrada y/o salida (I/O por sus siglas en inglés) con trabajos atados al CPU para así mantener al procesador ocupado y minimizar el overhead de los procesos que se encuentran esperando.

Cuando el manejador de procesos está decidiendo cuál proceso de la cola de listos será cargado a memoria, él escoge el proceso con el mayor tiempo en almacenamiento secundario.

Cuando el manejador de procesos está decidiendo cuál proceso (actualmente en memoria y en estado de espera o listo para correr) será movido fuera temporeramente para crear espacio para una nueva llegada, él escoge el proceso que esté esperando por el disco para I/O ó está inactivo. Si hay varios procesos de los cuales escoger, el que haya estado en memoria por mayor tiempo se remueve primero.

Si un proceso se encuentra esperando a que se complete una solicitud de I/O y no está listo para correr cuando sea seleccionado, UNIX automáticamente re-calculará todas las prioridades de los procesos para determinar cuál proceso inactivo pero listo comenzará ejecución cuando el procesador se vuelva disponible.

Tabla de Procesos versus Tabla de Usuarios

UNIX utiliza varias tablas para mantener el sistema corriendo sin problemas. Información sobre procesos simples, esos con código no compartible, se guarda en dos sets de tablas: la tabla de procesos, que siempre reside en memoria, y la tabla de usuarios, que solamente reside en memoria cuando el proceso está activo.

Cada entrada en la tabla de procesos contiene la siguiente información: número de identificación del proceso, número de identificación del usuario, dirección en memoria del proceso o de almacenamiento secundario, tamaño del proceso, e información de programación.

Para procesos con código compartible, la tabla de procesos mantiene una sub-tabla, llamada tabla de texto, que contiene la siguiente información: dirección en memoria del segmento de texto (código compartible) o de almacenamiento secundario y un contador para realizar un seguimiento de los números de procesos utilizando éste código. Cada vez que un proceso empieza a utilizar este código, el contador se incrementa por uno; cada vez que un proceso deja de utilizar este código, el contador se disminuye por uno. Cuando el contador es igual a cero, el código no se necesita ya y la tabla de entradas es liberada junto con cualquier localización de memoria que haya sido asignada al segmento de código.

Una tabla de usuarios es asignada a cada proceso activo. Ésta tabla es mantenida en la zona transitoria de memoria mientras el proceso esté activo y contiene información que debe

estar accesible cuando el proceso esté corriendo. Ésta información incluye: los números de identificación del usuario y grupo para determinar los privilegios de acceso, apuntadores a la a tabla de archivos del sistema para cada archivo que está siendo utilizado por el proceso, un apuntador al directorio actual y una lista de repuestas para varias interrupciones. Esta tabla, en conjunto con los datos del segmento del proceso y su segmento de código, puede ser intercambiada a ó fuera de memoria según necesario.

Sincronización

UNIX es un sistema operativo multitarea. Logra la sincronización de procesos requiriendo que los procesos esperen por ciertos eventos. Por ejemplo, si un proceso necesita más memoria, se le requiere que espere por un evento asociado con la asignación de memoria. Luego, cuando la memoria está disponible, el evento es señalado y el proceso puede continuar. Cada evento es representado por enteros que, por convención, son iguales a las direcciones de la tabla asociadas con el evento.

Una carrera podría ocurrir si un evento sucede mientras el proceso cambia de estar decidiendo por esperar a y entrando al estado de esperar por el evento. En este caso, el proceso está esperando por un evento que ya ocurrió y puede que no vuelva a ocurrir.

fork Una característica inusual de UNIX que le provee al usuario la capacidad de ejecutar un programa desde otro programa utilizando el comando fork. Este comando le da al segundo

programa todos los atributos del primer programa, como archivos abiertos, y salva el primer programa en su forma original.

La llamada al sistema fork divide el programa en dos copias, las cuales están corriendo de la declaración luego del comando fork. Cuando fork es ejecutado, una identificación del proceso (llamada pid) es generada para el nuevo proceso. Esto es realizado en una manera que asegura que cada proceso tenga su número de identificación único.

El proceso original es conocido como un proceso “padre” y el proceso resultante como un proceso “hijo”. Un hijo hereda los archivos abiertos del padre y corre asincrónicamente con él a menos que el padre tenga que esperar por la terminación del hijo.

exec La familia de comandos exec ––execl, execv, execle, execlp, and execvp––son utilizados para comenzar la ejecución de un nuevo programa desde otro programa, a diferencia de fork que resulta en dos programas corriendo el mismo programa estando en memoria, una llamada exec exitosa superpondrá el segundo programa sobre el primero. El código del segundo programa y los datos ahora forman parte del proceso original cuyo pid no cambia.

Una llamada exec no devuelve valor alguno; por ende, el concepto de padre-hijo no existe en este caso. Sin embargo, un programador puede utilizar fork, esperar, y exec comandos en este orden para crear una relación padre-hijo y luego tener al hijo superpuesto por otro programa que, cuando terminado, despierta al padre para que continúe su ejecución.

El comando ls genera una lista del contenido del directorio actual. Cuando la llamada al sistema exec ls es ejecutada exitosamente, el procesamiento comienza en la primera línea del programa ls. Una vez el programa ls e terminado en el hijo, el control es devuelto a la declaración ejecutable siguiendo la espera en el proceso padre.

Estas llamadas al sistema ilustran la flexibilidad de UNIX que los programadores encuentran extremadamente útil. Por ejemplo, un proceso hijo puede ser creado para ejecutar un programa por el proceso padre sin requerir que el programador escriba código para cargar o encontrar memoria para un programa aparte.

Manejo de Dispositivos

UNIX está diseñado para proveer independencia a los dispositivos de las aplicaciones que están corriendo bajo él. Esto es logrado al utilizar cada dispositivo de I/O como un tipo de archivo especial. Cada dispositivo que está instalado en un sistema UNIX se le asigna un nombre similar al nombre que se le daría a cualquier otro archivo, los se le dan descriptores llamados iodes. Estos descriptores identifican los dispositivos, contienen información sobre ellos, y son almacenados en el directorio de dispositivos. Las subrutinas que trabajan con el sistema operativo para supervisar la distribución de data entre la memoria principal y una unidad periférica son llamadas controladoras de dispositivos.

Si el sistema de computadora utiliza dispositivos que no están dados con el sistema operativo sus controladores de dispositivos deben ser escritos por un programador por experiencia u obtenidos de una fuente confiable y ser instalados en el sistema operativo.

La incorporación de un controlador de dispositivos en el kernel es realizada durante la configuración del sistema. UNIX tiene un programa llamado config que automáticamente creara un archivo conf.c para cualquier configuración de hardware. Este archivo conf.c contiene los parámetros que controlan recursos como el numero de buffers internos para el kernel y el tamaño del espacio de intercambio. Además, el archivo conf.c contiene dos tablas: bdevsw (corto para “block device switch”) y cdevsw (corto para “carácter device switch”), las cuales proveen al kernel del sistema UNIX con la habilidad de adaptarse fácilmente a distintas configuraciones de hardware al instalar distintos módulos de control.

Clasificaciones de Dispositivos

El sistema de I/O está dividido en el sistema de block I/O (a veces llamado el sistema estructurado de I/O) y el sistema de character I/O (a veces llamado el sistema no-estructurado de I/O).

Cada dispositivo físico es identificado por un numero de dispositivo menor, un numero de dispositivo mayor y una clase –ya sea block ó character.

Cada clase tiene una tabla de configuración que contiene un arreglo de los puntos de entrada a los controladores de dispositivos. Esta tabla es la única conexión entre el código del sistema y los controladores de dispositivos. Ésta permite que los programadores de sistemas creen nuevos controladores de dispositivos rápidamente para acomodar distintas configuraciones de sistemas. El número mayor de dispositivos es utilizado como un índice al arreglo para accesar el código apropiado para un controlador de dispositivos específico.

El número menor de dispositivos es enviado al controlador de dispositivos como un argumento y es utilizado para accesar varios dispositivos físicos similares controlados por el controlador.

Como su nombre lo implica, el sistema block I/O por dispositivos que pueden a direccionar una secuencia de bloques de 512 bytes. Esto permite que el manejador de dispositivo utilice buffers para reducir el I/O del disco. UNIX tiene de diez a setenta buffers para I/O, y la información relacionada a estos buffers de mantiene en un lista.

Cada vez que se efectúa un comando de lectura, se efectúa una búsqueda en la lista del buffer de I/O. Si los datos solicitados se encuentran ya en un buffer entonces se le provee al proceso. Si un buffer está disponible, se hace el cambio. Si todo los buffers está ocupado, entonces uno debe ser vaciado para crear espacio para el nuevo bloque. Esto es realizado al utilizar una política LRU, para que los contenidos de los buffers frecuentemente utilizados sean dejados intactos.

Dispositivos en la clase character son manejados por controladores de dispositivos que implementan listas de caracteres. Funciona de la siguiente manera: una subrutina pone el carácter en la lista, o cola, y otra subrutina recupera el caracter de la lista.

Un terminal es un dispositivo de caracter que tiene dos colas de entrada y una cola de salida. Las dos colas de entrada son etiquetadas “cola cruda” y “cola canónica”. Funciona de la siguiente manera: Según el usuario teclea cada caracter, es colectado como en la cola cruda de entrada. Cuando la línea es completada y la tecla de Enter es presionada, la línea es copiada de la cola cruda de entrada a la cola canónica de entrada, y el CPU interpreta la línea. Similarmente, la sección del controlador de dispositivos, que maneja los caracteres que van al módulo de salida de un terminal, los guarda en la cola de salida hasta que llega al máximo de caracteres.

El procedimiento de I/O es sincronizado a través de interrupciones de hardware. Cada vez que hay una interrupción, el controlador de dispositivos busca el siguiente carácter de la cola y lo envía a hardware. Este proceso continúa hasta que la cola esté vacía.

Controladores de Dispositivos

Cada dispositivo tiene una sección especial en el kernel, llamada el controlador de dispositivos. Los controladores de dispositivos para los discos duros utilizan una estrategia de búsqueda para minimizar el movimiento del brazo.

Los controladores de dispositivos son mantenidos en un conjunto de archivos que pueden ser incluidos según necesario. Cuando se realizan actualizaciones (upgrades) a los periféricos, pequeños cambios al archivo del controlador de dispositivos pueden ser enlazados al kernel para mantener al sistema operativo al día con las nuevas capacidades y funciones. Aunque los archivos de dispositivos pueden ser almacenados en cualquier lugar del sistema de archivos, regularmente se guardan en el directorio /dev, lo cual los marca claramente como archivos de dispositivos.

Sistema Operativo GNU/Linux

Historia de GNU/Linux

Linux es un sistema operativo similar a Unix que se distribuye bajo la Licencia Pública General de GNU (GNU GPL), es decir que es software libre. Su nombre proviene del núcleo Linux, desarrollado desde 1991 por Linus Torvalds, y el proyecto GNU, iniciado en 1983 por Richard Stallman. Es usado ampliamente en servidores y super-computadores, y cuenta con el respaldo de corporaciones como Dell, Hewlett-Packard, IBM, Novell, Oracle, Red Hat y Sun Microsystems. Puede ser instalado en gran variedad de hardware, incluyendo computadores de escritorio y portátiles (PCs x86 y x86-64 así como Macintosh y PowerPC), computadores de bolsillo, teléfonos celulares, dispositivos empotrados, videoconsolas (Xbox, PlayStation 3, PlayStation Portable, Dreamcast, GP2X) y otros (como enrutadores o reproductores de audio digital como el iPod).

Las variantes de estos sistemas se denominan "distribuciones" y su objetivo es ofrecer una edición que cumpla con las necesidades de determinado grupo de usuarios. Algunas son gratuitas y otras de pago, algunas insertan software no libre y otras contienen solo software libre. La marca registrada Linux (número de serie: 1916230.[2] ) pertenece a Linus Torvalds y se define como "un sistema operativo para computadoras que facilita su uso y operación". Existen numerosos grupos de usuarios de Linux en casi todos los países del mundo. Linux nació gracias a la idea de Linus Torvalds de crear un sistema basado en Unix para máquinas i386. En más de una ocasión, Linus Torvalds ha afirmado que si hubiera sabido de la existencia de los sistemas BSD que ya cumplían lo que hacía Linux, no se habría molestado en modificar Minix. La historia de Linux está fuertemente vinculada a la del proyecto GNU. El proyecto GNU, iniciado en 1983, tiene como objetivo el desarrollo de un sistema Unix completo compuesto enteramente de software libre. Hacia 1991, cuando la primera versión del núcleo Linux fue liberada, el proyecto GNU había producido varios de los componentes del sistema operativo, incluyendo un intérprete de comandos, una biblioteca C y un compilador, pero aún no contaba con el núcleo que permitiera completar el sistema operativo. Entonces, el núcleo creado por Linus Torvalds, quien se encontraba por entonces estudiando en la Universidad de Helsinki, llenó el "hueco" final que el sistema operativo GNU exigía. Subsecuentemente, miles de programadores voluntarios alrededor del mundo han participado en el proyecto, mejorándolo continuamente. Torvalds y otros desarrolladores de los primeros días de Linux adaptaron los componentes de GNU y de BSD, así como de otros muchos proyectos como Perl, Apache, Python, etc. para trabajar con el núcleo Linux, creando un sistema operativo completamente funcional, procedente de muchísimas fuentes diferentes, la mayoría libres.

Una de las ventajas de Linux es que es libre; esto no sólo quiere decir que sea gratis, sino que además es posible modificar el software según las necesidades, siempre y cuando se cumpla con la Licencia GNU GPL que utiliza este sistema operativo. Una distribución es una variante del sistema Linux que se enfoca a satisfacer las necesidades de un grupo especifico de usuarios. De este modo hay distribuciones para hogares, empresas y servidores. Algunas incorporan programas comerciales (como Mandriva PowerPack) o solamente software libre (como Debian). Las distribuciones son ensambladas por individuos, empresas u otros organismos. Cada distribución puede incluir cualquier número de software adicional, incluyendo software que facilite la instalación del sistema. La base del software incluido con cada distribución incluye el núcleo Linux y las herramientas GNU, al que suelen adicionarse también varios paquetes de software. Las herramientas que suelen incluirse en la distribución de este sistema operativo se obtienen de diversas fuentes, incluyendo de manera importante proyectos de código abierto o libre, como el GNU y el BSD o el KDE. Debido a que las herramientas de software libre que en primera instancia volvieron funcional al núcleo de Linux provienen del proyecto GNU que desde 1983 había liberado software que pudo ser usado en el proyecto de Linux de 1991, Richard Stallman (fundador del proyecto GNU) pide a los usuarios que se refieran a dicho sistema como GNU/Linux. A pesar de esto, la mayoría de los usuarios continúan llamando al sistema simplemente "Linux" y las razones expuestas por Richard Stallman son eterno motivo de controversia. La mayoría de los sistemas "Linux" incluyen también herramientas procedentes de BSD y de muchos otros proyectos como Mozilla, Perl, Ruby, Python, PostgreSQL, MySQL,

Xorg, casi todas con licencia GPL o compatibles con ésta (LGPL, MPL) otro aporte fundamental del proyecto GNU.

Manejo de Memoria

Cuando Linux reserva espacio de memoria, reserva 1GB de memoria de alto-orden al kernel y 3GB de memoria para procesos que se ejecutan. Este espacio de a direccionamiento 3GB está dividido entre: el código del proceso, los datos del proceso, y la biblioteca compartida de datos y la pila utilizada por el proceso.

Cuando un proceso comienza su ejecución, sus segmentos tienen un tamaño fijo pero existen casos en los cuales un proceso tiene que manejar variables con un tamaño y número desconocidos. Por lo tanto, Linux tiene llamadas al sistema que cambian el tamaño del segmento de datos del proceso, ya sea expandiéndolo o reduciéndolo.

Linux ofrece protección de memoria basada en el tipo de información almacenada en cada región que pertenece al espacio de la dirección de un proceso. Si el proceso modifica la autorización de acceso asignada a una región de memoria, el kernel cambia la protección de la información a las páginas correspondientes.

Cuando un proceso solicita páginas, Linux las carga a memoria. Cuando el kernel necesita espacio de memoria, las páginas son liberadas utilizando un algoritmo LRU. Linux mantiene un área manejada dinámicamente en memoria, un cache de páginas, donde nuevas

páginas solicitadas por procesos son insertadas, y de el cual las páginas son borradas cuando ya no se necesitan. Si alguna página marcada para ser borrada ha sido modificada, se reescribe al disco – una página correspondiendo al archivo que esta enlazado a la memoria es reescrita al archivo y la página correspondiente a los datos es salvada en un dispositivo de intercambio. El dispositivo de intercambio puede ser una partición en el disco o un archivo normal. Linux muestra flexibilidad adicional con los dispositivos de intercambio porque, si fuese necesario, Linux puede desactivarlo sin reiniciar el sistema. Cuando esto ocurre, las páginas salvadas en ese dispositivo son recargadas a memoria.

Para realizar un seguimiento de las páginas libres y ocupadas, Linux utiliza un sistema tablas de páginas. Con ciertas arquitecturas de procesadores, el acceso a memoria es realizado utilizando segmento.

La memoria virtual en Linux es manejada utilizando una tabla con una jerarquía de múltiples niveles. La cual acomoda arquitecturas de 32 y 64 bits. La memoria virtual es manejada en Linux a través de paginación por demanda. Hasta 256MB de memoria utilizable puede ser configurada a marcos del mismo tamaño, los cuales pueden ser agrupados para dar más espacio continuo a un trabajo. Estos grupos pueden ser separados para acomodar trabajos más pequeños. El proceso de agrupar y separar es conocido como el algoritmo buddy.

Manejo del Procesador

Linux utiliza el mismo diseño de manejo de padre-hijo encontrado en UNIX, pero también apoya el concepto de “personalidad” para permitir que los procesos que vienen de otros sistemas operativos puedan ser ejecutados. Esto significa que cada proceso es asignado a un dominio de ejecución especificando la manera en la cual las llamadas de sistema son llevadas a cabo y la manera en la cual los mensajes son enviados a los procesos.

Organización de la Tabla de Procesos

A cada proceso se le hace referencia mediante un descriptor, el cual contiene aproximadamente 70 campos describiendo los atributos del proceso junto a la información necesaria para manejar el proceso. El kernel reserva dinámicamente estos descriptores cuando los procesos comienzan a ejecutarse. Todos los descriptores de procesos son organizados en una lista encadenada doble, y los descriptores de los procesos que están listo o en ejecución son puestos en otra lista encadenada doble con campos indicando su próxima corrida y su corrida anterior.

Sincronización de Procesos

Linux provee colas de espera y semáforos para permitir que dos procesos se sincronicen entre sí. Una cola de espera es una lista encadenada circular de los descriptores del proceso. Los semáforos son utilizados para resolver los problemas de exclusión mutua y los problemas de los

productores y consumidores. En Linux la estructura del semáforo: el contador del semáforo, el número de procesos esperando, y la lista de procesos esperando por el semáforo. El contador del semáforo suele contener solo valores binarios, excepto cuando varias unidades de un recurso están disponibles, y el contador del semáforo entonces asume el valor del número de unidades que están accesibles al momento.

Manejo de Procesos

El planificador de Linux escanea la lista de procesos en el estado de listo y escoge cual proceso ejecutar. El planificador tiene tres tipos de programaciones distintas: dos para procesos de tiempo real y una para procesos normales. La combinación de tipo y prioridad es utilizada por el planificador para determinar la política de programación utilizada en los procesos en la cola de listos.

Manejo de Dispositivos

Linux es independiente de dispositivos, lo cual mejora su portabilidad de un sistema a otro. Un controlador de dispositivos supervisa la transmisión de datos entre la memoria principal y unidad periférica. Los dispositivos son asignados no solo por el nombre si no que también por los descriptores que identifican mejor cada dispositivo y están almacenados en el directorio de dispositivos. Las versiones estándar de Linux proveen frecuentemente una colección de controladores de dispositivos comunes, pero si el sistema debe incluir hardware o periféricos que no están en la lista estándar, estos controladores de dispositivos pueden ser recuperados de otra

fuente e instalado por separados. Alternativamente un programador con experiencia puede escribir un controlador de dispositivos e instalarlo para su uso.

Clasificaciones de Dispositivos

Cada clase tiene una tabla de configuración que contiene un arreglo de los puntos de entrada a los controladores de dispositivos. Esta tabla es la única conexión entre el código del sistema y los controladores de dispositivos. Ésta permite que los programadores de sistemas creen nuevos controladores de dispositivos rápidamente para acomodar distintas configuraciones de sistemas. El número mayor de dispositivos es utilizado como un índice al arreglo para accesar el código apropiado para un controlador de dispositivos específico.

Controladores de Dispositivos

Linux apoya las clases estándares de dispositivos introducidas por UNIX. Además, Linux permite nuevas clases de dispositivos para apoyar tecnologías nuevas. Las clases de dispositivos no son rígidas en su naturaleza – los programadores pueden escoger crear controladores de dispositivos grandes y complejos para realizar múltiples funciones, pero esta programación no es recomendable por lo siguiente: (1) el código puede ser compartido entre usuarios y hay una mayor demanda para múltiples controladores simples que para uno complejo, y (2) el código modular puede apoyar mejor las metas de escalabilidad y extensibilidad de Linux, por ende se recomienda que el código para los controladores maximice la habilidad del sistema para utilizar el dispositivo efectivamente.

Una característica de Linux es la habilidad para aceptar nuevos controladores de dispositivos al momento, mientras que el sistema está corriendo. Esto significa que los administradores pueden darle funcionalidades adicionales al kernel al cargar y probar nuevos controladores sin tener que reiniciar cada vez para reconfigurar el kernel.

Clases de Dispositivos

Hay tres clases estándares de dispositivos apoyadas por Linux: dispositivos de caracteres, dispositivos de bloques e interfaces de redes.

Dispositivos en la clase character son aquellos que pueden ser accesados como una corriente de bytes. Como minimo los controladores para estos dispositivos usualmente implementan las llamadas al sistema de abrir, cerrar, leer y escribir. Los dispositivos char son accesados mediante nodos de archivos del sistema y se ven como cualquier area ordinaria de datos.estos dispositivos son tratados de la misma manera de archivos ordinarios con la excepción de que tienen canales de datos que deben ser accesados secuencialmente.

Los dispositivos de bloques son similares a los char devices excepto que pueden alojar un sistema de archivos, como un disco duro. Los dispositivos de bloque son accesados por nodos de archivo de sistema en el directorio /dev pero estos dispositivos son transferidos en bloques de datos. Los controladores de dispositivos de bloques aparentan ser archivos ordinarios con la excepción que pueden accesar un sistema de archivos en conexión con el dispositivo.

Las interfaces de redes son diferentes de ambos dispositivos de bloques y caracteres porque su función es enviar y recibir paquetes de información segun ordenado por el subsistema de redes del kernel.

Sistema de Archivos en Linux

El sistema de archivos de Linux es la estructura en la que toda la información en su ordenador se almacena. Los archivos están organizados en una jerarquía de directorios. Cada directorio puede contener archivos, así como otros directorios. Si se trazan los archivos y directorios en Linux, se vería como un árbol al revés . En la parte superior esta el directorio raíz, que es representada por una sola barra diagonal o “slash” (“/”). Dentro de la raiz esta un conjunto de directorios comunes del sistema Linux, tales como “bin”, “dev”, “home”, “lib”, y “tmp”, por nombrar unos pocos. Cada uno de esos directorios, así como directorios añadido a la raíz, puede contener subdirectorios.

Para demostrar cómo directorios están conectados, Figura 1 muestra un directorio “/home” que contiene los subdirectorios de tres usuarios: “chris”, “mary”, y “tom”. En el directorio “chris” los subdirectorios son: “briefs”, “memos”, y “personal”. Para referirse a un archivo llamado “inventory” en el directorio “chris/memos”, puede escribir la ruta completa de "/home/chris/memos/inventory". Si el directorio actual es “/home/chris/memos”, puede consultar en el archivo simplemente como “inventory”.

Figura 1: El sistema de archivos de Linux está organizado en una jerarquía de directorios.

/ |--- bin/ |--- dev/ |--- etc/ |--- home/ |

|--- chris/

|

|

|--- briefs/

|

|

|--- memos/

|

|

|--- personal/

|

|--- mary/

|

|--- tom/

|--- root/ |--- tmp/ ...

Directorios principales de Linux /bin

Contiene los comandos comunes del sistema como “ls”, “cp”, “rm”, “type”, “date,

y “chmod”.

/boot

Contiene los archivos que se usan para iniciar el sistema. En este directorio esta la

imagen del kernel y archivos de configuración del bootloader.

/dev

Contiene los archivos que representan los puntos de acceso a los dispositivos en el

sistema. Estos incluyen dispositivos de terminal (tty*), disquetes (fd*), discos duros (hd*), RAM (ram*), CD-ROM (cd*), y otros. (Normalmente los usuarios acceden estos dispositivos directamente a través de los archivos de dispositivo).

/etc

Contiene archivos de configuración de administración.

/home

Contiene los directorios asignados a cada usuario con una cuenta de inicio de

sesión (con la excepción del usuario “root”).

/media

Proporciona una ubicación estándar para el montaje de dispositivos, tales como

sistemas de ficheros remotos y los medios removibles (con nombres de los directorios de “cdrecorder”, “floppy”, y así sucesivamente).

/mnt

Un punto de montaje para muchos dispositivos antes de que fuera sustituida por el

directorio estándar "/media". Algunos sistemas de arranque de Linux siguen utilizando este directorio para montar particiones de disco duros y sistemas de archivos remotos.

/proc

Contiene información acerca de los recursos del sistema.

/root

Representa el “/home” del usuario “root”. El directorio para el usuario “root” no

reside dentro de “/home” por razones de seguridad.

/sbin

Contiene comandos administrativos y “daemons”.

/sys

Un directorio similar a “/proc” de ficheros, nuevos en el kernel de Linux 2.6.

Contiene archivos para obtener la condición de hardware.

/tmp

Contiene los archivos temporeros utilizados por las aplicaciones.

/usr

Contiene la documentación, juegos, archivos de gráficos (“/usr/X11”), bibliotecas

(“/usr/lib”), y una variedad de otros usuarios y comandos administrativos y archivos.

/var

Contiene los directorios de los datos utilizados por diferentes aplicaciones. En

particular, se trata de en el que pondría los archivos que se comparten en un servidor FTP (“/var/ftp”) o en un servidor de páginas web (“/var/www”). También contiene todos los archivos de registro del sistema (“/var/log”) y archivos en la cola “/var/spool”.

Administración de Linux

Debido a que el sistema Linux se hizo basado en UNIX, este contiene un diseño multiusuario. Es posible que múltiples usuarios usen el sistema simultáneamente. También Linux tiene un sistema de permisos para cada archivo. Esto permite establecer áreas separadas para cada usuario y prevenir que un usuario modifique archivos creados por otros usuarios. Existen dos clasificaciones de acceso: usuarios y grupos. Usuarios En Linux, existen dos tipos básicos de usuarios: los usuarios regulares (“user”) y un súper usuario o administrador (“superuser”) usualmente llamado “root”. Los usuarios regulares tienen acceso limitado al sistema. El súper usuario tiene acceso total del sistema y puede hacer cosas que usuarios regulares no pueden hacer, como ejemplo: crear, cambiar, o remover usuarios y grupos, instalar aplicaciones, modificar archivos de configuración del sistema (por ejemplo archivos en el directorio“/etc”). La configuración de los usuarios esta almacenada en un archivo de texto localizado en “/etc/passwd”. Figura 1 contiene un ejemplo del contenido de este archivo.

Figura 1: Ejemplo del contenido del archivo “/etc/passwd”:

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:daemon:/sbin:/bin/bash news:x:9:13:News system:/etc/news:/bin/bash uucp:x:10:14::/var/lib/uucp/taylor_config:/bin/bash cquoi:x:500:100:Cool......:/home/cquoi:/bin/bash

En este archivo cada línea representa un usuario. Las líneas contienen 7 campos separados por el carácter de dos puntos (“:”). Estos campos representan: • El nombre del usuario • La contraseña de usuario (encriptado) • El numero que identifica al usuario al sistema operativo (“UID” o “User ID”) • El numero de grupo o “GID”. • Comentario acerca del usuario (poe ejemplo: el nombre real del usuario). • El directorio hogar (usualmente colocado dentro de “/home” ) donde el usuario comienza cuando se ingresa al sistema. • El comando que se ejecuta cuando el usuario se ingresa al sistema (usualmente un shell)

El acceso a una cuenta se puede dejar abierto si se deja el campo de la contraseña vacio. En este caso cuando un usuario especifique un el nombre de usuario y el campo de la contraseña esta vacio, el sistema lo ingresara sin pedir contraseña. El UID es un numero que se usa para identificar numéricamente a los usuarios (cada usuario debe tener un UID único). El UID con valor 0 se usa para el súper usuario. El GID es un numero que se usa para identificar numéricamente a los grupos (cada grupo debe tener un GID único). El GID con valor 0 se usa para el súper usuario. Grupos En Linux los usuarios pueden pertenecer a uno o mas grupos. Los grupos se usan para clasificar los distintos tipos de usuarios y se pueden asignar distintos tipos de derechos basado en los grupos. La configuración de los grupos esta almacenada en un archivo de texto localizado en “/etc/group”. Figura 2 contiene un ejemplo del contenido de este archivo. Figura 2: Ejemplo del contenido del archivo “/etc/group”:

root:x:0:root bin:x:1:root,bin,daemon daemon:x:2: tty:x:5: disk:x:6:

lp:x:7: wwwadmin:x:8: kmem:x:9: wheel:x:10: mail:x:12:cyrus news:x:13:news

En este archivo cada línea representa un grupo. Las líneas contienen 4 campos separados por el carácter de dos puntos (“:”). Estos campos representan: • El nombre del grupo. • Campo extra (usualmente se deja en blanco). • El numero que idéntica al grupo al sistema operativo (“GID” o “Group ID”). • Nombre de los usuarios que son miembros del grupo separados por comas.

Sudo Existe un comando especial en Linux que le permite temporeramente a un usuario regular acceso a los privilegios del súper usuario. Este comando se le conoce como sudo (que significa “super user do”). Hay dos maneras de usar este comando una es escribiendo “sudo (commando)”

para ejecutar un solo comando como el usuario “root” (por ejemplo: “sudo umount /mnt/win”). La otra manera es escribiendo “sudo -s”. De esta forma se ejecuta un shell con el usuario “root”. Cuando se usa ese método todos los comandos siguientes se harán siendo el usuario “root” hasta que se ejecute el comando de “exit”, entonces se retornara el shell del usuario original. Cuando se ejecuta sudo, este requiere que se entre la contraseña del usuario para razones de seguridad.

La razón principal para usar sudo es la seguridad del sistema, de esta manera se puede prohibir al usuario “root” que ingrese al sistema directamente. Los administradores tendrán cuentas regulares y usaran sudo para hacer tareas administrativas. El acceso a sudo se puede restringir editando el archivo de configuración localizado en “/etc/sudoers” para que solo los administradores tengan acceso al súper usuario. Dueños y Permisos En Linux, cada directorio y archivo tiene un dueño, grupo y banderas de permisos de lectura, escritura, y ejecución para el el dueño, usuarios en el grupo del dueño y otros usuarios”. Por ejemplo en la siguiente lista de archivos: Figura 3: Lista de archivos en un directorio, mostrando los permisos de cada archivo.

exter@exter-desktop:~/software/pert$ ls -l total 136 -rw-r--r-- 1 exter exter 875 2008-11-17 20:40 asig.txt

-rw-r--r-- 1 exter exter 32473 2008-01-09 16:08 LICENSE -rw-r--r-- 1 exter exter 1643 2008-11-14 19:53 main.cpp -rw-r--r-- 1 exter exter 3700 2008-12-05 15:07 main.o -rw-r--r-- 1 exter exter 971 2008-11-14 19:58 Makefile -rwxr-xr-x 1 exter exter 34996 2008-12-05 15:07 pert -rw-r--r-- 1 exter exter 11649 2008-11-17 20:50 pert.cpp -rw-r--r-- 1 exter exter 1348 2008-11-14 20:28 pert.h -rw-r--r-- 1 exter exter 24940 2008-12-05 15:07 pert.o -rw-r--r-- 1 exter exter

89 2008-11-14 19:58 sample1.txt

-rw-r--r-- 1 exter exter 243 2008-11-17 10:13 sample2.txt

El primer campo contiene las banderas de cada archivo. Figura 4 contiene los posibles valores que puede tener este campo. En este caso, todos los usuarios pueden leer los archivo, pero solo el dueño (el usuario “exter”) puede modificar los archivos. También todos los usuarios pueden ejecutar el archivo “pert” como un programa ya que tiene la bandera de ejecución. El tercer y cuarto campo contienen el dueño del archivo y grupo a que pertenecen (usualmente estos se determinan basado en el usuario que creó el archivo).

Figura 4: Posibles valores que puede tener el campo de permisos de un archivo.

Tipo

Dueño

Grupo

Otros

lectur escritur ejecució lectura escritura ejecución lectura escritura ejecució a

a

n

n

Valores

-,d,l

-,r

-,w

-,x

-,r

-,w

-,x

-,r

-,w

-,x

Caracte

0

1

2

3

4

5

6

7

8

9

r

La letra “r” significa lectura, “w” significa escritura, “x” significa ejecución, “d” significa directorio, y “l” significa enlace. Donde hay una raya (“-”) es que el archivo no tiene ese permiso.

Scripts de Unix I find .-type f | xargs grep -s alias

Este comando busca el patrón ‘alias’ en todos los archivos comenzando desde el directorio actual (.) mientras suprime los mensajes de error sobre archivos inexistentes o no-legibles.

find

Busca en la jerarquía de una carpeta por nombres de archivos que cumplan con cierto criterio: Nombre, Tamaño, Tipo de Archivo, etc.

Syntax find [-H] [-L] [-P] [path...] [expression]

El comando find de GNU busca en el árbol del directorio comenzando en cada nombre de archivo dado y evaluando la expresión dada de izquierda a derecha, según las reglas de precedencia, hasta que se conoce el resultado (la parte izquierda es falsa para operaciones AND, cierta para la operación OR), punto en el cual el comando find prosigue al próximo nombre de archivo.

xargs

Ejecuta un commando, pasando una lista de argumentos. Los argumentos son típicamente una lista larga de nombres de archives (generada por el commando ls o el comando find) los cuales son pasados a xargs mediante una barra (|).

Syntax xargs [options] [command]

grep Busca dentro de archivos por algún texto en específico. SYNTAX grep "Search String" [filename]

grep [-e pattern] [file...]

grep [-f file] [file...]

A simple example: $grep “Needle in a Haystack” /etc/*

II #!/bin/sh #Convierte archivos de texto en formato DOS a formato UNIX. es=1 if [ $# -eq 0 ] ; then exec tr -d '\015\032' elif [ ! -f "$1" ] ; then echo "Not found: $1" 1>&2 else for f in "$@" ; do if tr -d '\015\032' < "$f" > "$f.tmp" ; then if cmp "$f" "$f.tmp" > /dev/null ; then rm -f "$f.tmp" else touch -r "$f" "$f.tmp" if mv "$f" "$f.bak" ; then if mv "$f.tmp" "$f" ; then rm -f "$f.bak" es=$? echo " converted $f" else rm -f "$f.tmp" fi

else rm -f "$f.tmp" fi fi else rm -f "$f.tmp" fi done fi exit $es

III #!/bin/sh #Este script se usa para mantenimiento en un SAMBA Domain Controller echo Claridad Server 2 Maintenence echo "" cd /home/samba

#------------------------------------------------------------------#Set the appropiate permisions for shared directories echo 'Setting share permisions:' echo " 'Administrativo'" chown -R administrativo:administrativo administrativo

chmod -R 776 administrativo

echo " 'Editorial'" chown -R editorial:editorial editorial chmod -R 776 editorial

echo " 'Fotos'" chown -R fotos:fotos fotos chmod -R 776 fotos

echo " 'Miscelaneo'" chown -R miscelaneo:miscelaneo miscelaneo chmod -R 776 miscelaneo

echo " 'Arte'" chown -R arte:arte arte chmod -R 776 arte

echo "Share permisions set." echo "" #-------------------------------------------------------------------

#-------------------------------------------------------------------

#Set the appropiate permisions for each user profiles echo 'Setting profile permisions:' cd profiles for user in $(ls -1) do echo " '$user'" chown -R $user:$user $user chmod -R 776 $user done cd .. echo "Profile permisions set." echo "" #-------------------------------------------------------------------

#------------------------------------------------------------------#Cleanup temporary files echo 'Deleting temporary files:' echo " 'Editorial'" find editorial -name '._*' -exec rm -f '{}' \; echo " 'Fotos'" find fotos -name '._*' -exec rm -f '{}' \; echo "Temporay files deleted." echo ""

#-------------------------------------------------------------------

#------------------------------------------------------------------#File names with spaces at the end may cause problems with samba. #This section removes those spaces echo 'Fixing bad file names:' filelist=$(find . -name "* " -printf "%d[_DEPTH_]%p[_FILE_]\n" | sed 's/ /[_SPACE_]/g' | sed 's/\[_DEPTH_\]/ /g' | sort -r -k1 | awk '{print $2}') for file in $filelist do oldfile=$(echo $file | sed 's/\[_FILE_\]//g' | sed 's/\[_SPACE_\]/ /g') lastnew="" newfile=$(echo $file | sed 's/\[_SPACE_\]\[_FILE_\]/[_FILE_]/g') while [ "$lastnew" != "$newfile" ] do lastnew="$newfile" newfile=$(echo $newfile | sed 's/\[_SPACE_\]\[_FILE_\]/[_FILE_]/g') done newfile=$(echo $newfile | sed 's/\[_FILE_\]//g' | sed 's/\[_SPACE_\]/ /g') echo " Fixing '$newfile'" mv "$oldfile" "$newfile" done echo "File names fixed."

echo "" #-------------------------------------------------------------------

echo "All done." sleep 10

Bibliografía

Christopher, N. (2008). Linux Bible 2008 Edition. Indianapolis. Indiana:Wiley Publishing, Inc. Ann McIves, Ida M. Flynn Understanding Operating Systems, Fifth Ed. Massachissets: Course Technology. Glass, G. , Ables, K. (2000). Unix for Programmers and Users, Second Ed. New Jersey: Prentice Hall. Haas, J. “Linux Guide”, 2008, http://linux.about.com/ Sin autor. Linux - User management. 2008, http://en.kioskea.net/contents/unix/unix-users.php3 Sin autor. Unix, 2008, http://en.wikipedia.org/wiki/Unix Sin autor. UNIX History, 2005, http://www.levenez.com Sin autor. Linux, 2008, http://en.wikipedia.org/wiki/Linux Sin autor. Linux en Español, 2008, http://www.linuxespanol.com/viewforum.php?\ SS64.com Xargs, http://www.ss64.com/bash/xargs.html Grep, http://www.ss64.com/bash/grep.html Find, http://www.ss64.com/bash/find.html Bell Labs. Before Multics there was chaos, and afterwards, too, 2007, The Creation of the UNIX* Operating System, http://www.bell-labs.com/history/unix/chaos.html Ritchie, D. The Evolution of the Unix Time-sharing System Bell Labs, 1996, Lucent Technologies Inc., http://cm.bell-labs.com/cm/cs/who/dmr/hist.html