You are on page 1of 45

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 round-

robin (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 multi-

usuario. 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

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

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 <options> "Search String" [filename]

grep <options> [-e pattern] [file...]

grep <options> [-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