laboratorio de redes 1 -...
TRANSCRIPT
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
1
INSTITUTO TECNOLÓGICO Y DE ESTUDIOS SUPERIORES DE MONTERREY
Laboratorio de Redes 1
Práctica 3 - Introducción a sistemas GNU/Linux
Autor: Dr. Juan Arturo Nolazco (2007)
Co-autor: Ing. Raúl Armando Fuentes Samaniego (2011)
GNU, Unix y Linux
Unix
Unix, es un sistema operativo bastante robusto que desde un inicio fue pensado para ser multi-usuario
y multi-tarea siendo desarrollado inicialmente por los laboratorios Bell que en aquel entonces formaban
parte de AT&T durante 1969. El sistema empieza alcanzar su popularidad cuando emigra de lenguaje
ensamblador a lenguaje C en 1973.
Históricamente hablando, durante la década de los 70, se manejaba una fuerte ideología de código
abierto, esto permitió que UNIX fuese de fácil adopción por terceros, principalmente entre
universidades y ciertas empresas comerciales con lo que dieron nacimiento a sistemas operativos como
BSD, Solaris, HP-UX y AIX.
En la actualidad, por motivos históricos, la marca UNIX está bajo el control de grupo “Open Source” el
cual decide cuando otorgar el termino “UNIX-based” a un sistema operativo en base al cumplimiento de
ciertos estándares (Como los manejos característicos de UNIX). Se debe de comprender, que aunque
los sistemas Unix sigan los estándares del grupo ya mencionado, estos S.O. no tienen porque ser
necesariamente gratuitos. Dos ejemplos de esto son los S.O. Linux (open source) y OS X de Apple.
GNU Project
GNU nace al final de una era donde el código abierto era la norma y que daba paso a una nueva era
donde el código propietario se imponía. Con este cambio, se acaba la posibilidad de apoyar y mejorar
software existente entre todos, pues ya no era compatible con las nuevas políticas de las empresas. Son
las universidades las que más resienten este cambio de era ya que se ven imposibilitadas de seguir
utilizando el código de los S.O. de Bell.
Como un intento de contrarrestar la perdida del código abierto aparece el proyecto El proyecto GNU
(GNU’s not UNIX, una palabra fácil en ingles de escribir y decir) encabezado por Richard Stallman. El
objetivo del proyecto no ha cambiando desde aquel entonces y consiste de utilizar el trabajo
colaborativo para el ensamble de los sistemas operativos, permitiendo de esta forma crear código 100%
libre y que garantiza a los usuarios tener control completo de su equipo de cómputo.El concepto de
software libre radica en que las personas deben de poder usar el software de todas las formas que sean
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
2
socialmente útiles. (GNU.org)
Este proyecto publica el código para la creación de las herramientas necesarias para un funcionamiento
eficiente de un S.O. , tales como editores LISP, de léxico como Yacc, semántico como bison,
compiladores de códigos en lenguaje C, entre otras herramientas. Esto ha permitido la facilidad de que
ciertos usuarios tomen parte del software, hagan alteraciones y así nazcan distribuciones. E incluso, de
estas mismas distribuciones repiten el ciclo naciendo así distribuciones de distribuciones. Un ejemplo
de esto es Ubuntu, el cual nació como una modificación de la distribución de Debian.
Linux
Linux nace de UNIX y GNU. El kernel de Linux (lo que es propiamente Linux) nace del sistema Operativo
UNIX. Prácticamente, consiste en un manejo de recursos basados en UNIX. Pero el corazón del sistema
operativo (rutinas, comandos como LS, CP, MORE, GREP, etc) provienen de GNU. Por lo mismo la
referencia correcta a un sistema operativo Linux es con el marco GNU/Linux (Un sistema operativo
basado en UNIX que utilice componentes de código abierto del proyecto GNU).
El nacimiento de Linux se remonta a inicio de los 90, como se mencionó antes, UNIX tuvo un fuerte auge
en universidades, pero al ir cambiando el manejo de licencias de código abierto por licencias de
propietarios UNIX quedo vetado en el ámbito educativo. Un intento de corregir dicho problema, vino
de parte del profesor Andrew Tanenbaum al desarrollar MINIX. Que era un sistema operativo creado
desde cero basado en UNIX –tomando en cuenta el auge que se tuvo en dichas universidades - y que
apareció como un código abierto en el documento “Operating Systems: Design and Implementation” de
dicho profesor (Hasan, 2002).
Este código abierto de un sistema operativo completo disponible a nivel académico tuvo fuerte legado y
uno de los que más le sacó provecho fue Linus Benedict Torvalds de la universidad de Helsinki, quien
basándose en MINIX llevo el sistema operativo de un ambiente meramente académico a un ambiente
empresarial dando cono nacimiento un nuevo sistema operativo más robusto denominado: GNU/Linux
Observación: Código Abierto
El objetivo de este documento no es introducir al alumno al manejo de código abierto, pero
cabe aclarar que código abierto no significa “gratuito”. De hecho se obtiene una fuerte
economía de la distribución y creación de código abierto.
Conceptos generales de Sistemas basados en UNIX
Usuarios y permisos
La carta fuerte de los sistemas UNIX es el manejo de usuarios y la seguridad inherente del Sistema
Operativo (mientras éste s encuentre ejecutándose). Ya que desde sus inicios UNIX fue concebido como
un sistema multi-usuario en tiempo real. Es decir, que más de un usuario pudiera hacer uso de los
recursos de un sistema de forma simultánea y que esto fuese trasparente e imperceptible para el mismo
usuario. Que en contraste con DOS pensado para computadoras del hogar era algo que no podía
conseguir.
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
3
Pero el manejo de los usuarios va más allá desde un inicio, UNIX consideraba que cada usuario tendrá
una serie de permiso y que dichos permisos podrían agruparse, haciendo que ciertos grupos de usuarios
tuviesen privilegios propios del grupo. Es decir, que cualquier miembro del grupo pudiese ejecutar, leer
o escribir un archivo en particular. Con esto entra el concepto de UGO en los sistemas UNIX. Donde
un archivo tiene permisos para un usuario en particular, el grupo al que pertenece el usuario y los
demás usuarios.
Finalmente, en todo sistema UNIX están los usuarios “estándares” y el usuario Root. Siendo este último
el único usuario con permisos absolutos de todos los archivos y/o componentes del sistema. Si una
persona tiene acceso al usuario “root” tiene capacidad de manipular todo el sistema como mejor le
parezca (para bien y para mal). En las distribuciones Debian (y Ubuntu) el usuario root es ocultado y
en cambio se permite que los usuarios estándares tengan “SUDO” (Substitute User DO). El cual hace
que el comando ejecutado por el usuario tenga los privilegios de otro usuario como lo puede ser el
Root.
Con el concepto de SUDO, lo que se pretende es que solo la cuenta de ese usuario se vea expuesta al
uso común diario y si el manejo de las políticas de SUDO es adecuado, incluso la perdida de la
contraseña del usuario tendrá efectos mitigados en la seguridad del sistema.
A continuación se muestra fragmentos de una configuración del archivo “/etc/sudoers” de una
computadora del laboratorio de redes:
# User privilege specification root ALL=(ALL:ALL) ALL %ccna ALL=(root) /etc/init.d/proftpd %ccna ALL=(root) /usr/bin/gtkterm %ccna ALL=(root) /usr/sbin/gadmin-proftpd %ccna ALL=(root) /sbin/ifconfig, /sbin/route # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL
Captura de Comandos 1 – Fragmentos de Visudo
En esta captura se puede apreciar que existe un grupo denominado ccna( identificado por el símbolo %
que le precede) y un grupo admin.
Un usuario, por ejemplo “redes1” si solo pertenece al grupo ccna al ejecutar el comando SUDO ifconfig
lo ejecutara como si fuese el usuario root- Lo mismo pasara con lo relacionado a servidores TFTP y FTP e
incluso con el manejo de terminales seriales-. Pero si intenta, por ejemplo, ejecutar “sudo rm –f /” no
tiene privilegios para ejecutar el comando “rm” en un directorio bajo el control de otro usuario (en este
caso ROOT) y por lo mismo no podrá realizar dicha acción.
En cambio un usuario que pertenezca al grupo “admin” (aunque también pertenezca al grupo ccna)
puede ejecutar cualquier comando con SUDO como si fuese Root. Por lo mismo, si la cuenta de un
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
4
miembro de dicho grupo se ve comprometida la seguridad del equipo se verá afectada. En este aspecto
de seguridad, es conveniente que el usuario de un sistema Linux, limite su propia cuenta a solo los
comandos que el necesite para su uso diario.
Respecto a la seguridad que los sistemas Operativos UNIX y los sistemas Operativos Windows se
recomienda al lector que lea el siguiente artículo:
http://www.kernelthread.com/publications/security/uw.html
Directorios y archivos
Los sistemas basados en UNIX (o sistemas Unix informalmente hablando) mantienen la filosofía en la
que "todo es un archivo", esto significa que un dispositivo cualquiera - teclado, mouse, monitor, tarjeta
de video, etc. - así como las ligas, y los mismos archivos tienen la misma representación dentro del
sistema de archivos en UNIX.
Dicha representación del sistema de archivos es de orden jerárquico parecido a Windows, pero
diferente en el aspecto que nace de un directorio raíz (ROOT) en vez de una unidad o partición de un
disco duro (Cómo C:/ en Windows)
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
5
Ilustración 1- Presentación tipica de un arbol jerarquico en Linux (Garrels, 2003)
Dicha representación de archivos se puede apreciar en la ilustración 1. En el nivel /mtnr/ (en
Ubuntu se encuentran en /media/ ) se encuentran los discos duros montados (incluyendo
particiones de Windows si se da el caso ) además de las unidades de lectura como USB, CD,
DVD, etc. En otros niveles como usr se encuentran los programas de un usuario y en sbin los
comandos reconocidos por el sistema Linux. En general, la ilustración 2 muestra el contenido
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
6
de las carpetas que son hijos directos del directorio ROOT ( / ).
Ilustración 2 – Manejo estándar de archivos de un sistema Linux (Ricafrente)
Todo archivo posee ciertos bits de control, que se le puede denominar UGO, dichos bits son 3
campos: Escritura (W) , Lectura (R) y Ejecución (X) y se ven repetidos para un Usuario particular
(U), un grupo en particular (G) y todo los demás usuarios y grupos (O).
Un último detalle referente a los archivos. Un sistema UNIX considera por defecto que todo
archivo es un archivo en ASCII y por lo mismo no hace diferencia con las extensiones. De hecho
las extensiones de archivo en un sistema UNIX es más como referencia para el usuario que al
mismo Sistema Operativo.
Tipos de direcciones
Para referirse a la dirección de cierto archivo en el sistema se pueden utilizar dos tipos de direccionamiento:
Absoluto: Se refiere a la dirección completa del archivo usando como referencia de origen el directorio
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
7
raíz. Esto se representa escribiendo la 'raíz' ('/')al inicio de la dirección. Ej /etc/hosts /bin/bash
Relativo: Usualmente se hace uso de las dirreciones relativas cuando se quiere utilizar un archivo que se encuentre en el directorio (o nivel) actual. Si por ejemplo, nos encontramos en el directorio /home/redes1/ y en ese nivel existe un archivo llamado “Prueba” podemos hacer uso del archivo como “Prueba” o “./Prueba” donde “ . “es un directorio lógico que siempre apunta al directorio actual. Existe además un directorio lógico dos puntos ( .. ) que apunta siempre al directorio padre del directorio actual (La única excepción sería con el directorio raíz que no posee padre) así si quisiéramos ejecutar un archivo llamado “Aja” ubicado en la carpeta home de Redes2 la dirección relativa sería: “../Redes/Aja”.
La dirección del directorio del usuario /home/<user> es demasiado utilizada por lo que existe una forma particular de llamarla y utilizarla en el direccionamiento, esta forma es '~' y se trata de una dirección absoluta para el usuario que este utilizando la terminal.
Comandos
Existe una gran variedad de comandos para diferentes tareas, incluso algunos comandos
pueden llegar a realizar funciones similares con ciertos argumentos de entrada. No es objetivo
de esta práctica entrar en detalles con cada uno y por lo mismo procederemos a indicar los
más básicos.
ls: Lista archivos y directorios
mkdir: Crea un directorio.
rmdir: Borra un directorio. Nota: el directorio debe de estar vacío.
cd: Cambia el directorio actual a otro.
less: Permite visualizar un documento de texto.
cat: Lee, concatena y despliega archivos de texto en stdout.
head: Despliega en stdout las primeras líneas de un archivo de texto.
tail: Despliega en stdout las últimas líneas de un archivo de texto.
rm: Remueve archivos.
pwd: Imprime la dirección del directorio actual.
touch Cambia el “timestamp” de un archivo (o lo crea).
more Despliega las líneas de un archivo de texto.
ln Crea enlaces entre archivos.
awk Una poderosa herramienta de análisis sintáctico.
NOTA: Todo comando conocido, proveniente de GNU, posee un manual al cual
puede ser accedido via “man” ej: Man ls, donde se explica a detalle toda las
opciones de dichos comandos. En caso particular de sistemas UNIX, esto
incluye además librerías conocidas de C/C++. Existe además del man el
comando whatis el cual da una breve explicación de lo que hace un comando.
Por ejemplo: whatis man.
Cada uno de estos comandos está hecho en C y se encuentra n disponible para todos los usuarios del sistema. Existen además ciertos comandos que sirven para facilitarle información al usuario. Tales como:
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
8
whatis <comando> Despliega una breve explicación de lo que hace el comando
Whereis <comando> Despliega el nivel en el que se halla el comando.
Whoami Despliega el usuario actual en la terminal.
<comando> --help Despliega un resumen de los argumentos posibles.
Además de estos comandos, en sistemas Ubuntu, el uso de doble TAB muestra una lista de posibles comandos de acuerdo a las primeras letras introducidas (también puede autocompletar nombres de archivos y comandos si estos ya están plenamente identificados).
Sintaxis de un comando
Existe una cierta nomenclatura a la hora de dar información de cómo puede operar un comando que por lo general es manejado en múltiples plataformas. Dicha sintaxis es:
Comando <Variable obligatoria> [argumentos opcionales < Var obligatoria>]
El primer componente es el nombre del comando y por lo mismo siempre estatico. El siguiente elemento si se requiere es un elemento que debe de aparecer pero cuyo valor no es constante (por ejemplo el nombre de un archivo) y el siguiente es un parámetro opcional para obtener ciertas funciones del programa.
Tomemos por ejemplo el comando “LS” el cual solo posee argumentos opcionales dando esta psible sintaxis:
ls [Directorio a desplegar] [-l]…
Si se introduce un directorio u otros argumentos (-l por ejemplo ) el comando trabajara otro directorio y desplegara más información. Pero en contraste el comando “MORE” tiene esta posible sintaxis:
more <Archivo a leer> [Argumentos adicionales]
Donde dicho comando necesita a fuerza la dirección de un archivo para poder trabajar. Además puede recibir otros argumentos que pueden verse con la ayuda del argumento--help o el man.
I/O estándares (de archivos)
Generalmente se manejan 3 tipos de entradas y salidas para los archivos y estos son:
Entrada – Generalmente de donde se toman los datos l( usualmente los argumentos de
un programa)
Salida – Donde se despliegan los resultados del programa
Error – Una salida especial relacionada a los mensajes de control de un programa.
Dicho tres canales tienen valores estándares, y se les denomina: Salida estándar, error
estándar y entrada estándar. Con esto quiere decir que todo programa tiene una salida
estándar que es la sesión terminal en la que se ejecutó. Una entrada estándar que es el
teclado del usuario y un canal de error estándar que usualmente va a un Syslog (System Log o
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
9
bitácora del sistema).
Ilustración 3 – Canales de comunicación basicos al ejecutar un programa en Linux
Cualquiera de los 3 canales puede ser re-direccionado durante la ejecución de un programa.
Por ejemplo, se puede manejar que la entrada del comando GREP sea un archivo existente en
vez de palabras introducidas por el usuario. O bien, los resultados de una búsqueda intensiva
se guarden directamente en un archivo en vez de mostrarse en la terminal
Para lograr cualquiera de los ejemplos anteriores se manejan 3 símbolos:
> ó >> - Manipulan la salida de un programa: EJ: LS > NuevaSalida.txt
< - Manipulan la entrada de un programa : EJ GREP search < Novela.txt
&> - Manipulan la salida de errores de un archivo.
En el primer caso se maneja “>>” cuando se desee anexar la salida al final de un archivo ya
existente (o bien crearlo si no existe) y se maneja “>” cuando se desee crear un archivo o bien
sobrescribir uno ya existente.
Pipeline
Pipeline (o tubería) es un caso especial de direccionamiento, que se vuelva una herramienta
extremadamente poderosa en un sistema UNIX.
La estructura de pipeline es que lo que este al lado izquierdo de pipeline sufre un re-
direccionamiento de su salida que se vuelve la entrada del elemento que esta a su derecha.
Este proceso facilita el trabajo al usuario, ya que no es necesario trabajar el primer archivo y
desviar la salida del comando a un archivo para después usar este archivo como entrada a otro
programa. En vez de eso se utiliza directamente Pipeline con lo cual se simplifica. La siguiente
ilustración muestra mejor el concepto:
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
10
Ilustración 4 Pipeline en acción
En el ejemplo de la ilustración cuatro, se maneja la salida del comando LS como entrada del
comando GREP, cuyo argumento adicional es “Prueba” con lo cual lo que se hace es que se
desplegara todo aquel directorio y/o archivo que contenga la palabra “Prueba” en su nombre y
que este dentro del directorio actual.
La salida de dicho ejemplo puede ser la salida estándar, una salida indica por el usuario e
incluso puede servir como entrada a otro comando al aplicar un pipeline adicional (y esto se
puede repetir una y otra vez).
Laboratorio Realice los siguientes ejercicios y anote en los espacios correspondientes lo que se les pida. Es muy
importante que realice los pasos en el orden indicado para que puedan obtener las respuestas
correctas.
1. Ejecute el comando: cd ~
2. Ejecute el comando: ls
3. Indique lo que ha desplegado el comando ls:
____________________________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
11
Utilice el manual de LS y conteste las siguientes preguntas:
4. ¿Qué argumento despliega la información de UGO de cada archivo? (Tip: Es
información completa o un formato de LS más largo)
____________________________________________________________
5. ¿Qué argumento nos permite imprimir todo el contenido de cada folder contenido en LS
de forma recursiva?
____________________________________________________________
6. La sinopsis de LS es la siguiente: ls [OPTION]... [FILE]... Donde [Option] son los
argumentos que puede llevar opcional LS, FILE es opcional ([ ] significa que el campo
es opcional), ¿Cuál es el valor por default si no se coloca ninguna opción en [FILE].?
____________________________________________________________
Para salir de la página man, puede utilizar ctrl+z lo cual mata el proceso o bien presionar la
tecla “Q” con lo cual termina la página. La diferencia radica que el primero es un modo de matar
cualquier proceso generando una terminación no exitosa del programa y el segundo es el
modo natural de terminar su ejecución.
Estando ya afuera de la página y en el directorio ~ (Ej: /home/redes1/) Procederemos a crear
directorios
7. Cree el directorio Sesion3 utilizando el comando mkdir
8. A continuación crearemos el directorio hijo de Sesion3 con el nombre: Alumnos. Para
ello utilizaremos direccionamiento absoluto. Escriba la sintaxis del comando para
realizar dicha acción:
____________________________________________________________
TIP: Recuerde que ~ es la abreviación a su directorio home y puede
ser usado para direccionamiento absoluto
9. Crearemos otro directorio hijo en Sesion3, este se llamara Reportes. Utilizando ahora
direccionamiento relativo. Escriba la sintaxis del comando para realizar dicha acción:
____________________________________________________________
El archivo /etc/passwd contiene todo los usuarios (y grupos al que pertenecen) registrados en
un Sistema Linux (cada aplicación tiene su propio usuario, además de los usuarios estándares
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
12
que poseen directorios “home”). No olvide que no se ha movido del directorio home.
10. Ejecute el comando “ls –l /etc/passwd” . ¿Quiénes pueden leer su contenido?
____________________________________________________________
11. Guarde una copia del archivo, de nombre Usuarios, en Sesion3/Reportes. Para ello
puede utilizar el comando cat y desviando su salida estándar a dicho folder. . Escriba la
sintaxis del comando para realizar dicha acción ( Puede usar cualquier tipo de
direccionamiento):
____________________________________________________________
12. Utilice el comando grep para buscar miembros que pertenezcan a usuarios que tengan
“redes” en su nombre. Dicha búsqueda será en el archivo creado en el paso anterior. (El
instructor puede cambiar que buscar si lo ve necesario).. Escriba la sintaxis del
comando para realizar dicha acción ( Puede usar cualquier tipo de direccionamiento):
____________________________________________________________
Ahora nos enfocaremos en la carpeta ~/Sesion3/Alumnos . Utilizaremos un ejemplo de
pipeline y el resultado se guardara en dicha carpeta.
13. Utilizando directamente el archivo original /etc/passwd asegúrese de crear un pipeline
que después de leer el archivo ejecute el grep del inciso anterior y que la salida sea
guardada en el archivo EjPipeline. Escriba la sintaxis del comando para realizar dicha
acción ( Puede usar cualquier tipo de direccionamiento):
____________________________________________________________
14. Despliegue, utilizando ls, todo los componentes que posee el folder ~/Sesion3/ al
instructor en turno. Escriba la sintaxis del comando para realizar dicha acción ( Puede
usar cualquier tipo de direccionamiento):
____________________________________________________________
15. Utilice el comando rm –r /sesión3/ El cual borra de manera recursiva sesion3 (Borra su
contenido antes de borrar el folder)
Conteste las siguientes preguntas:
16. ¿Qué pasaría si intentara crear el folder /sesion3/ en cualquier otro directorio de home?
¿Por qué?
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
13
____________________________________________________________
____________________________________________________________
17. ¿el usuario Redes1 tiene autorización para modificar algo en Root (/)? ¿Cómo lo
demuestra?
____________________________________________________________
____________________________________________________________
Reflexión Anote su reflexión acerca de lo aprendido en la práctica
____________________________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Escriba por lo menos 2 formas distintas de desplegar el contenido del archivo /etc/group
____________________________________________________________
____________________________________________________________
Fuentes bibliográficas: Dr. Juan Arturo Nolazco, R. A. (2010). UNIX como usuario: Uso básico de consola.
Garrels, M. (Abril de 2003). Chapter 3. About files and the file system. Recuperado el Agosto de 2011, de
Introduction to Linux:: http://www.faqs.org/docs/linux_intro/sect_03_01.html
GNU.org. (s.f.). Recuperado el Julio de 2011, de The Gnu Operating System: http://www.gnu.org/
Hasan, R. (Julio de 2002). History of Linux. Recuperado el Agosto de 2011, de University of Illinois at
Laboratorio de redes ITESM Dep. Ciencias Computacionales
Última modificación: enero de 2011
14
Urbana-Champaign - Department of Computer Science: https://netfiles.uiuc.edu/rhasan/linux/
Raymond, E. S. (2003). Origins and History of Unix, 1969-1995. Recuperado el Agosto de 2011, de The
Art of Unix Programming: http://www.faqs.org/docs/artu/ch02s01.html
Ricafrente, R. (s.f.). Linux File Directory Structure. Recuperado el Agosto de 2011, de PinoyTux Weblog:
http://www.pinoytux.com/linux/linux-file-directory-structure
Unix.org. (s.f.). Recuperado el Agosto de 2011, de The UNIX® System: http://www.unix.org/