Guía Para Administradores de Sistemas GNU/Linux Versión 0.8 Lars Wirzenius Joanna Oja Stephen Stafford Alex Weeks Rafael Ignacio Zurita (Traducción en TLDP-ES) Coordinador de la Traducción en TLDP-ES Copyright 1993 1998 Lars Wirzenius. Copyright 1998 2001 Joanna Oja. Copyright 2001 2003 Stephen Stafford. Copyright 2003 Al presente Stephen Stafford & Alex Weeks. Las marcas registradas son propiedad de sus respectivos dueños. Se concede autorización para copiar, distribuir y/o modificar este documento bajo los términos de la GNU Free Documentation License (Licencia de documentación libre GNU), Versión 1.1; sin las Secciones Invariantes, sin los textos de Portada, y sin los Textos de Contra Portada. Una copia de la licencia se encuentra incluída en la sección "GNU Free Documentation License". Resumen Una introducción a la administración de sistemas GNU/Linux para novatos. ------------------------------------------------------------------------------- Tabla de contenidos Disponibilidad del código fuente 1. Introducción 2. Acerca de este libro Agradecimientos Agradecimientos de Joanna Agradecimientos de Stephen Agradecimientos de Alex Agradecimientos de Rafael para la versión en español Convenciones tipográficas 3. Visión general de un sistema GNU/Linux Las diferentes partes de un sistema operativo Partes importantes del núcleo Servicios principales en un sistema UNIX init Inicio de sesiones desde terminales Syslog Ejecución periódica de comandos: cron y at Interfaz gráfica de usuario (GUI) Redes Inicio de sesiones a través de la red Sistemas de archivos de red (NFS) Correo Impresión La distribución del sistema de archivos 4. Visión General del Árbol de Directorios Información preliminar El sistema de archivos raíz El directorio /etc El directorio /dev El sistema de archivos /usr El sistema de archivos /var El sistema de archivos /proc 5. Archivos de Dispositivos El Script MAKEDEV El comando mknod Listado de dispositivos 6. Utilizando Discos y Otros Medios de Almacenamiento Dos tipos de dispositivos Discos Rígidos Disquetes CD-ROM Cintas Dar formato Particiones El MBR, sectores de arranque y la tabla de particiones Particiones extendidas y lógicas Tipos de particiones Particionando el disco duro Archivos de dispositivo y particiones Sistemas de archivos ¿Qué son los sistemas de archivos? Sistemas de archivos soportados por Linux ¿Qué sistemas de archivos deben utilizarse? Crear un sistema de archivos Montar y desmontar Comprobar la integridad de un sistema de archivos con fsck Comprobar errores en el disco mediante badblocks Luchar contra la fragmentación Otras herramientas para todos los sistemas de archivos Otras herramientas para el sistema de archivos ext2/ext3 Discos sin sistemas de archivo Situando el espacio en disco Esquemas de particionamiento Requerimientos de espacio Ejemplos de colocación de disco duro Añadir más espacio en disco para Linux Consejos para liberar espacio en disco 7. Administración de Memoria ¿Que es la memoria virtual? Creando un espacio swap Usando un área de swap Compartiendo el área de swap con otro sistema operativo Alocando espacio de swap. El Buffer Cache 8. Encendido y apagado Una introducción al proceso de inicio y finalización del sistema Una mirada más cercana al proceso de inicio Más acerca de shutdown Reinicio (Rebooting) Modo usuario individual (single user mode) Disquetes de arranque para emergencias 9. init init viene primero Configurando init para iniciar getty: el archivo /etc/inittab Niveles de ejecución Configuración especial en /etc/inittab Iniciando el sistema en modo de usuario individual 10. Entrando y saliendo del sistema Accediendo a través de terminales Accediendo a través de la red Lo que hace login X y xdm Control de acceso Intérprete de comandos 11. Administrando cuentas de usuario ¿Qué es una cuenta? Crear una cuenta de usuario /etc/passwd y otros archivos informativos/de información /etc/shadow Elegir números de identificación de usuario y grupo Ambiente inicial: /etc/skel Crear un usuario a mano Cambiar las propiedades del usuario Borrando usuarios. Deshabilitar un usuario temporalmente 12. Copias de seguridad (Backups) Importancia de las copias de seguridad Seleccionando el medio de backup Seleccionando la herramienta de backup Copias de respaldo simples Realizando copias de seguridad con tar Recuperando archivos con tar Copias de seguridad de múltiples niveles Que copiar Copias de seguridad comprimidas 13. Manteniendo La Hora Zonas horarias Los relojes de software y hardware Configurar y visualizar la hora Cuando el reloj es erróneo NTP - Protocolo de reloj en red Configuración básica de NTP La herramienta NTP Algunos servidores NTP conocidos Enlaces NTP 14. Encontrando Ayuda Grupos de noticias y listas de correo Encontrar el foro correcto Antes de enviar un mensaje Escribir su mensaje Dar formato al mensaje Seguimiento Más información IRC Colores Sea educado Escriba adecuadamente, en Inglés Escanear puertos Mantenerse en el canal Ceñirse al tema del canal CTCP Hacking, Cracking, Phreaking, Warezing Recogiendo Lecturas adicionales A. GNU Free Documentation License 0. PREAMBLE 1. APPLICABILITY AND DEFINITIONS 2. VERBATIM COPYING 3. COPYING IN QUANTITY 4. MODIFICATIONS 5. COMBINING DOCUMENTS 6. COLLECTIONS OF DOCUMENTS 7. AGGREGATION WITH INDEPENDENT WORKS 8. TRANSLATION 9. TERMINATION 10. FUTURE REVISIONS OF THIS LICENSE How to use this License for your documents B. Licencia de Documentación Libre GNU (traducción) 0. Preámbulo 1. Aplicabilidad y definiciones 2. Copia literal 3. Copiado en cantidades 4. Modificaciones 5. Combinando documentos 6. Colecciones de documentos 7. Agregación con trabajos independientes 8. Traducción 9. Terminación 10. Futuras revisiones de esta licencia Como utilizar esta licencia para sus documentos Lista de figuras 3.1. Partes más importantes del núcleo de GNU/Linux 4.1. Partes de un árbol de directorios Unix. Las líneas discontinuas indican los límites de la partición. 6.1. A schematic picture of a hard disk. 6.2. A sample hard disk partitioning. 6.3. Tipos de partición (obtenida del programa de Linux fdisk). 6.4. Tres sistemas de archivos independientes. 6.5. /home y /usr montados. 6.6. Salida de ejemplo de dumpe2fs 10.1. Accediendo a través de terminales: la interacción de init, getty, login y el intérprete de comandos. 12.1. A sample multilevel backup schedule. Lista de tablas 9.1. Números de los niveles de ejecución 12.1. Efficient backup scheme using many backup levels Disponibilidad del código fuente El código fuente de este documento puede encontrarse en el sitio web del Proyecto de Documentación de Linux, http://es.tldp.org. La última versión siempre se puede descargar del cvs del proyecto bajo el módulo de nombre doc-guia-admon-sistemas. Para la versión original ( en inglés ), el código fuente y otros formatos para lectura de este libro pueden encontrarse en Internet vía FTP anónimo en la página principal del Proyecto de Documentación de Linux http://tldp.org , o en la página principal de este libro http://www.taylexson.org/sag/. El documento estará disponible al menos en formato HTML y PDF. Capítulo 1. Introducción ?En el principio el archivo estaba vacío y sin forma; y había oscuridad sobre la superficie de los bits. Y los dedos del Autor se movían sobre la superficie del teclado. Y el Autor dijo: "Que haya palabras", y entonces hubieron palabras.? En este documento, la Guía para Administradores de Sistemas GNU/Linux, se describen los aspectos del uso de GNU/Linux relativos a la administración del sistema. Está destinado a personas con pocos conocimientos en la administración del sistema (aquellos que se preguntan "¿Qué es esto?"), pero que ya dominan al menos los conceptos básicos sobre la utilización normal del mismo. Este manual tampoco explica cómo instalar GNU/Linux; dicho tema está desarrollado en el documento "Instalación y Primeros Pasos". En futuras secciones encontrará información adicional sobre los manuales existentes para sistemas GNU/Linux. La administración de sistemas es el conjunto de tareas necesarias para mantener un computador en buenas condiciones de uso ("utilizable" para el resto de los usuarios). Esto incluye actividades tales como realizar copias de seguridad (y restaurarlas en caso necesario), instalar nuevos programas, crear cuentas para los usuarios, verificar la integridad de los sistemas de archivos, etc. Si un ordenador fuese, por ejemplo, una casa, la administración del sistema podría ser comparada con el mantenimiento hogareño, e incluiría la limpieza, la reparación de ventanas rotas, y otras tareas similares. La estructura de este libro permite utilizar muchos de los capítulos de manera independiente, por lo que si necesita información relacionada, por ejemplo, con backups, puede leer sólo el capítulo que hace referencia a este tema. Sin embargo, este manual es principalmente un tutorial y puede ser leído secuencialmente, o como un todo Este documento no fue pensado para ser utilizado de forma aislada. También es importante para los administradores el resto de la documentación para sistemas GNU/Linux. Después de todo, un administrador de sistemas es sólo un usuario con privilegios y obligaciones especiales. Un recurso muy útil son las páginas de manual (también llamadas páginas man), las cuales deben ser consultadas siempre que un comando no le sea familiar. Si bien esta guía está centrada en GNU/Linux, un principio general de la misma es el de procurar que también se pueda utilizar con otros sistemas operativos basados en UNIX. Desafortunadamente, existen en general versiones de UNIX diferentes, y en particular existen diferencias en cuanto a la administración del sistema. Por lo que existen pocas esperanzas de que cubra todas las variantes. Incluso cubrir todas las posibilidades para GNU/Linux es difícil debido a la naturaleza de su desarrollo. No existe una distribución oficial de GNU/Linux, por lo que diferentes personas tienen diferentes configuraciones, y muchas tienen una configuración que ellos mismos realizaron. Este libro no está orientado a una distribución de GNU/Linux en particular, ya que las distintas distribuciones varían considerablemente entre sí. Por ello, siempre que sea posible se intenta hacer notar las diferencias y desarrollar alternativas. Se ha procurado describir cómo funciona cada aspecto del sistema, en vez de limitarse a listar "cinco pasos fáciles" para cada tarea. Esto significa que existe mucha información en este documento que puede no ser necesaria para todos, por lo que dichas partes del manual están marcadas especialmente y pueden ser ignoradas si se está utilizando un sistema pre-configurado. Leyendo todo el libro aumentará, naturalmente, la comprensión del funcionamiento del sistema, y se podrá lograr que la utilización y la administración del sistema sea más productiva (y agradable). Como todo desarrollo relacionado con GNU/Linux, el trabajo de escribir este manual fue realizado de manera voluntaria. Como toda labor de este tipo existe un límite en cuanto al tiempo, conocimiento y experiencia que poseen las personas que lo realizan. Esto significa que el manual no es necesariamente tan bueno como podría serlo si hubiera sido escrito como un trabajo bien retribuido, y se le pudieran dedicar unos años para perfeccionarlo. Aun así, este manual es considerablemente bueno, aunque el lector queda advertido. Un punto particular que debe aclararse es que no se han desarrollado en profundidad muchos temas que se encuentran bien documentados en otros manuales de libre distribución. Esto es aplicable especialmente a documentación de programas concretos, como por ejemplo, todos los detalles de utilización del comando mkfs. Tan sólo se describe el propósito del programa, y como mucho, su utilización en la medida en que sea necesario para lograr el propósito de este manual. Puede encontrarse información adicional en esos otros manuales libres. Normalmente, toda la documentación a la que se hace referencia es parte del conjunto completo de documentación de GNU/Linux. Capítulo 2. Acerca de este libro Tabla de contenidos Agradecimientos Agradecimientos de Joanna Agradecimientos de Stephen Agradecimientos de Alex Agradecimientos de Rafael para la versión en español Convenciones tipográficas Agradecimientos Agradecimientos de Joanna Lars intentó realizar este manual lo mejor posible, y deseo, por ser quien lo mantiene, conservar la calidad del trabajo. Me gustaría mucho recibir nuevas ideas de los lectores, si las hubiera, para mejorar este documento. Estoy interesada en corregir el lenguaje inapropiado (términos erróneos), errores en cuanto a la veracidad de lo escrito, ideas para nuevas áreas a cubrir, secciones reescritas, información acerca de cómo varias versiones de UNIX realizan ciertas cosas, etc. Mis datos de contacto están disponible vía World Wide Web en http://www.iki.fi/viu. Muchas personas me han ayudado con este libro, directa o indirectamente. Deseo agradecer especialmente a Matt Welsh por su inspiración y liderazgo en LDP, a Andy Oram por conseguir mucha información útil, a Olaf Kirch por demostrarme que este trabajo puede hacerse, y a Adam Ritcher, Yggdrasil y otros por mostrarme que otras personas pueden encontrar este documento interesante. A Stephen Tweedie, H. Peter Anvin, Remy Card y Theodore Ts'o, quienes me permitieron tomar prestados sus trabajos (y así hacer el libro mas abultado y mucho mas impresionante): una comparación entre los sistemas de archivos xia y ext2, la lista de dispositivos y una descripción del sistema de archivos ext2. Estos temas ya no forman parte del libro. Estoy agradecida por todo ello, y me disculpo por las versiones antiguas en las que a veces no se citaban las fuentes. Además, me gustaría agradecer a Mark Komarinski por enviarme su material en 1993 y por la gran cantidad de columnas que escribió sobre administración de sistemas en el Linux Journal. Fueron muy instructivas e inspiradoras. Un gran número de personas me ha enviado comentarios muy útiles. No puedo enumerar a todos ellos, pero algunos son (en orden alfabético): Paul Caprioli, Ales Capek, Marie-Frace Declerfayt, Dave Dobson, Olaf Flebbe, Helmut Geyer, Larry Greenfield y su padre, Stephen Harris, Jyrki Havia, Jim Haynes, York Lam, Timothy Andrew Lister, Jim Lynch, Michael J. Micek, Jacob Navia, Dan Poirier, Daniel Quinlan, Jouni K Seppänen, Philippe Steindl, G.B. Stotte. Mis disculpas a cualquier otro a quien haya olvidado. Agradecimientos de Stephen Me gustaría agradecer a Lars y a Joanna su duro trabajo en esta guía. En una guía como esta, probablemente existirán algunas inexactitudes menores. Y habrá casi con certeza secciones que quedarán desfasadas con el correr del tiempo. Si el lector llegase a notar eso, ruego que me lo comunique enviándome un e-mail a: bagpuss@debian.org. Aceptaré prácticamente cualquier formato de entrada (diffs, texto plano, html, otros). Con esto no estoy, de ninguna forma, permitiendo que otras personas me ayuden a mantener un texto tan largo como este :) Muchas gracias a Helen Topping Shaw por sacar el bolígrafo rojo y hacer que el texto sea mucho mejor de lo que hubiese sido de otro modo. Además las gracias son obligadas tan solo por ser una persona maravillosa. La página web actual de la guía es http://people.debian.org/~bagpuss Agradecimientos de Alex Quiero agradecer a Lars, Joanna, y a Stephen por todo el gran trabajo que han realizado en este documento a través de los años. Solamente espero que mi contribución sea digna de continuar el trabajo que ellos iniciaron. Ha habido muchas personas que me han ayudado a viajar a través del mundo "Libre de Windows", sin embargo la persona a la que siento necesidad de agradecer más que al resto es mi primer y auténtico mentor en UN*X, Mike Velasco. Volviendo atrás en el tiempo antes de que SCO se convirtiese en una "palabra grosera", Mike me ayudó en la senda de TARs, CPIOs y muchas, muchas páginas de manual. ¡Gracias Mike!. Eres el "Rey del Sofá". Agradecimientos de Rafael para la versión en español Esta traducción es posible gracias al Proyecto de Documentación de Linux en español (TLDP-ES) http://es.tldp.org . Sin las personas y herramientas de este proyecto, la coordinación de esta traducción hubiese sido realmente muy dificil. Quiero agradecer a Ismael Olea por orientarme en las etapas iniciales de este proyecto. Tambien doy las gracias a quienes aportaron su ayuda mediante la lista de correo de TLDP-es, ya que conocer la estructura del proyecto no es algo trivial. Quiero dar las gracias a las siguientes personas, las cuales ayudaron a escribir este libro en su versión al español: A Juan Ignacio Román Sánchez, quien tradujo gran parte de este libro. Varios de los capítulos son de su autoría, y ha redactado de manera simple, clara y eficiente. Fue un placer contar con su ayuda. Gracias Juan!. A Germán Carrasco, quien rápidamente se involucró en este proyecto. El se encargó de explicar en esta versión que los usuarios todavía existen ;-). Gracias por tu ayuda Sefer. A Alberto Suárez, Eduardo Rodriguez, Hernán Zurita, Victoria Pocladova, Seoane, Mariano Zurita, y a varias otras personas que ahora no recuerdo; por aportar correcciones, traducción y darle forma a este documento. Si nota el lector errores, o desea aportar sugerencias para mejorar este libro, por favor póngase en contacto conmigo, ya que este trabajo únicamente puede ser mejorado por las personas a quienes les sea de utilidad. Considere tambien la posibilidad de colaborar con TLDP-ES, siempre hay tareas por hacer en cuanto a documentación de Linux en español. Convenciones tipográficas A lo largo de este libro intentaré utilizar convenciones tipográficas uniformes. Se espera que contribuyan a hacerlo más legible. Si el lector puede sugerir cualquier mejora, le ruego que se comunique conmigo. Los nombres de archivos se expresan así: /usr/share/doc/foo. Los nombres de los comandos se expresan así: fsck Las direcciones de e-mail se expresan así: Las URLs se expresan así: http://www.tldp.org Iré agregando nueva información a esta sección según vaya surgiendo. Si se aprecia cualquier cosa que debería ser agregada, ruego al lector que me lo comunique. Capítulo 3. Visión general de un sistema GNU/Linux Tabla de contenidos Las diferentes partes de un sistema operativo Partes importantes del núcleo Servicios principales en un sistema UNIX init Inicio de sesiones desde terminales Syslog Ejecución periódica de comandos: cron y at Interfaz gráfica de usuario (GUI) Redes Inicio de sesiones a través de la red Sistemas de archivos de red (NFS) Correo Impresión La distribución del sistema de archivos ?"Dios observó todo lo que había hecho, y vio que era muy bueno"? -- Versión de la Biblia del Rey James. Génesis 1:31 En este capítulo se proporciona una visión general de un sistema GNU/Linux. En primer lugar se describen los principales servicios que ofrece el sistema operativo. A continuación, se explican con una considerable falta de detalle los programas que implementan dichos servicios. El propósito de este capítulo es hacer posible la comprensión del sistema en su conjunto, por lo cual cada parte en concreto se encuentra descrita en profundidad en capítulos posteriores. Las diferentes partes de un sistema operativo Un sistema operativo tipo UNIX consiste en un núcleo (o Kernel) y algunos programas de sistema. Existen también diversos programas de aplicación con los que podemos trabajar. El núcleo es el corazón del sistema operativo: Mantiene el control de los archivos sobre el disco, inicia los programas y los ejecuta de forma concurrente, asigna memoria y otros recursos a los distintos procesos, recibe y envía paquetes desde y hacia la red, etc. El núcleo hace muy poco por si solo, pero proporciona las herramientas básicas con las que se pueden construir los demás servicios. ^[1] Además, evita que se pueda acceder al hardware directamente, forzando a todos a utilizar las herramientas provistas. Esta manera de trabajar del núcleo otorga cierta protección a los usuarios entre sí. Las herramientas del núcleo se utilizan a través de las llamadas al sistema. Se puede encontrar información adicional sobre este tema consultando la sección 2 de este manual. Los programas de sistema utilizan las herramientas provistas por el núcleo para implementar varios servicios requeridos en un sistema operativo. Los programas de sistema (y todos los demás programas), se ejecutan 'por encima del núcleo', en lo que se denomina modo usuario. La diferencia entre los programas de aplicación y los de sistema es su finalidad: las aplicaciones tienen el propósito de realizar tareas útiles a los usuarios (o de jugar, si se tratara de un juego), mientras que los programas de sistema son necesarios para que el sistema funcione. Un procesador de textos es una aplicación; mount es un programa de sistema. La diferencia a menudo es confusa, y de cualquier manera, es solo importante para los categorizadores compulsivos. Un sistema operativo también puede contener compiladores y sus correspondientes librerías (GCC y la librería de C en particular para GNU/Linux), aunque no todos los compiladores de todos los lenguajes de programación son necesariamente parte del sistema operativo. También puede haber documentación, y en algunas ocasiones juegos. Tradicionalmente, el sistema operativo está definido por el contenido de los discos o cintas de instalación; con GNU/Linux esta definición no puede aplicarse, debido a que se encuentra repartido sobre distintos sitios FTP del mundo. Partes importantes del núcleo El núcleo de un sistema GNU/Linux consta de varias partes importantes: gestión de procesos, gestión de memoria, controladores para dispositivos de hardware, controladores para sistemas de archivos, gestión de la red, y otras partes varias. La Figura 3.1, ?Partes más importantes del núcleo de GNU/Linux? muestra algunas de éstas partes. Figura 3.1. Partes más importantes del núcleo de GNU/Linux Partes más importantes del núcleo de GNU/Linux Probablemente las partes más importantes del núcleo (nada funcionaría sin ellas) son la gestión de memoria y la gestión de procesos. El gestor de memoria se encarga de asignar áreas de memoria y de espacio de intercambio a los procesos, partes del núcleo, y también al buffer caché. El gestor de procesos crea nuevos procesos e implementa la multitarea (intercambiando los procesos activos en el procesador). A más bajo nivel, el núcleo contiene un controlador de dispositivo de hardware para cada tipo de hardware que soporta. Debido a que el mundo se encuentra lleno de diferentes tipos de hardware, el número de controladores es grande. Existen frecuentemente, muchas piezas similares de hardware que difieren en cómo son controladas por el software. Esta singularidad hace posible tener clases generales de controladores que soportan operaciones similares; cada miembro de la clase tiene la misma interfaz de cara al resto del núcleo pero difiere de los demás miembros en la forma de implementar las operaciones. Por ejemplo, todos los controladores de disco son parecidos para el resto del núcleo, P.ej., todos tienen operaciones como "iniciar la unidad", "leer el sector n", y "escribir en el sector n". Algunos servicios de software provistos por el núcleo tienen propiedades similares, y pueden de esta manera englobarse dentro de clases. Por ejemplo, los diferentes protocolos de red fueron englobados dentro de una interfaz de programación, la librería de socket BSD. Otro ejemplo es la capa del sistema de archivos virtual (VFS) que abstrae las operaciones de los sistemas de archivos de sus implementaciones. Cada tipo de sistema de archivos provee una implementación de cada operación. Cuando alguna entidad intenta utilizar un sistema de archivos, la petición se realiza a través del VFS, el cual la encamina al controlador del sistema de archivos correcto. Servicios principales en un sistema UNIX En esta sección se describen algunos de los servicios más importantes en UNIX, pero sin mucho detalle. Se describirán más profundamente en capítulos posteriores. init El servicio individual más importante en un sistema UNIX es provisto por init. init es el primer proceso que se inicia en todo sistema UNIX, siendo la última acción que el núcleo realiza al arrancar. Cuando init comienza su ejecución, continúa con el proceso de arranque del sistema, realizando varias tareas de inicio (chequear y montar sistemas de archivos, iniciar demonios, etc.). La lista exacta de cosas que init realiza depende del sistema tipo UNIX con el que estemos trabajando; existen varios para elegir. init normalmente proporciona el concepto de modo de usuario individual (single user mode), en el cual nadie puede iniciar una sesión y root utiliza un intérprete de comandos en la consola; el modo usual es llamado modo multiusuario (multiuser mode). Algunos sistemas UNIX generalizan esto como niveles de ejecución (run levels). Así, los modos individual y multiusuario son considerados dos niveles de ejecución, y pueden existir otros niveles adicionales para, por ejemplo, ejecutar X-Windows en la consola. GNU/Linux permite tener hasta 10 niveles de ejecución (runlevels) distintos, 0-9, pero normalmente solo algunos de estos niveles están definidos por defecto. El nivel de ejecución 0 se define como ?sistema detenido (system halt) ?. El nivel de ejecución 1 se define como ?modo de usuario individual (single user mode)?. El nivel de ejecución 6 se define como ?reinicio del sistema (system reboot)?. Los niveles de ejecución restantes dependen de como la distribución particular de GNU/Linux los haya definido, y varían significativamente entre distribuciones. Observando el contenido del archivo / etc/inittab podemos hacernos una idea de los niveles de ejecución preestablecidos en nuestro sistema y de como se encuentran definidos. En el funcionamiento normal, init se asegura de que getty se encuentre trabajando para permitir que los usuarios puedan iniciar una sesión, y también se encarga de adoptar procesos huérfanos (aquellos cuyo proceso padre murió; en UNIX todos los procesos deben estar en un árbol individual, y por esta razón los procesos huérfanos deben ser adoptados). Al cerrar el sistema, es init quien se encarga de matar todos los procesos restantes, desmontar todos los sistemas de archivos, y por último detener el procesador, además de cualquier otra cosa que haya sido configurado para hacer. Inicio de sesiones desde terminales El inicio de sesiones desde terminales (a través de líneas serie) y la consola (cuando no se está ejecutando X-Windows) es suministrado por el programa getty. init inicia una instancia independiente de getty por cada terminal en el que está permitido iniciar sesiones. Getty lee el nombre de usuario y ejecuta el programa login, el cual se encarga de leer la password. Si el nombre de usuario y la password son correctas, login ejecuta el intérprete de comandos. Al finalizar el intérprete de comandos (en el caso en que, por ejemplo, el usuario finaliza su sesión; o cuando login finaliza debido a que no concuerdan el nombre de usuario y la password), init se entera de este suceso e inicia una nueva instancia de getty. El núcleo no tiene noción sobre los inicios de sesiones, esto es gestionado totalmente por los programas del sistema. Syslog El núcleo y muchos programas de sistema producen mensajes de error, de advertencia y de otros tipos. La mayoría de las veces, es importante que puedan ser visualizados mas tarde, o tal vez mucho después, por lo que tales mensajes deben guardarse en un archivo. El programa que realiza esta tarea es syslog. Syslog puede ser configurado para ordenar los mensajes en diferentes archivos, de acuerdo a quien lo emite o al grado de importancia. Por ejemplo, los mensajes del núcleo son frecuentemente dirigidos a un archivo separado de los demás, debido a que son más importantes, y necesitan ser leídos regularmente para detectar problemas. Ejecución periódica de comandos: cron y at Los administradores de sistemas y los usuarios, a menudo necesitan ejecutar comandos periódicamente. Como ejemplo, supongamos que el administrador del sistema desea ejecutar un comando que elimine los archivos más antiguos de los directorios con archivos temporales (/tmp y /var/tmp) para evitar así que el disco se llene, debido a que no todos los programas eliminan correctamente los archivos temporales que ellos mismos generan. El servicio cron se configura para que realice la tarea anterior. Cada usuario tiene un archivo crontab, en el cual se listan los comandos que se desea ejecutar y la fecha y hora de ejecución. El servicio cron se encarga con precisión de iniciar cada comando, a la fecha y hora adecuada de acuerdo a lo especificado en cada archivo crontab. El servicio at es similar a cron, pero este se inicia únicamente una vez: el comando es ejecutado a la hora especificada, pero esta ejecución no vuelve a repetirse. Se puede encontrar información adicional sobre cron(1), crontab(5), at(1) y atd (8) en las páginas de manual. Interfaz gráfica de usuario (GUI) UNIX y GNU/Linux no incorporan la interfaz gráfica de usuario dentro del núcleo; en su lugar, es implementada por programas a nivel de usuario. Esto se aplica tanto a entornos gráficos como al modo texto. Esta disposición hace que el sistema sea más flexible, pero tiene la desventaja de que, al ser simple implementar una interfaz de usuario diferente para cada programa, dificulta el aprendizaje del sistema. El entorno gráfico principalmente utilizado con GNU/Linux se llama Sistema X-Windows (X para abreviar). X tampoco implementa por sí mismo una interfaz de usuario, sino solo un sistema de ventanas. Es decir, las herramientas base con las cuales se puede construir una interfaz gráfica de usuario. Algunos administradores de ventanas populares son: fvwm, icewm, blackbox y windowmaker. Existen también dos populares administradores de escritorios: KDE y Gnome. Redes Una red se construye al conectar dos o más ordenadores para que puedan comunicarse entre sí. Los métodos actuales de conexión y comunicación son ligeramente complicados, pero el resultado final es muy útil. Los sistemas operativos UNIX tienen muchas características de red. La mayoría de los servicios básicos (sistemas de archivos, impresión, copias de seguridad, etc) pueden utilizarse a través de la red. Aprovechar estas características puede ayudar a que la administración del sistema sea más fácil debido a que permiten tener una administración centralizada, a la vez que disfrutamos de los beneficios de la micro informática y la informática distribuida, tales como costes más bajos y mejor tolerancia a fallos. De cualquier modo, este libro sólo aborda superficialmente la teoría de redes; Se puede encontrar información adicional sobre este tema en La Guía De Administración De Redes con Linux (Linux Network Administrators' Guide http:// www.tldp.org/LDP/nag2/index.html), incluyendo una descripción básica de como operan las redes. Inicio de sesiones a través de la red Los inicios de sesión a través de la red funcionan de un modo un poco diferente al inicio de sesiones normales. Existe una línea serie física separada para cada terminal a través de la cual es posible iniciar sesión. Por cada persona iniciando una sesión a través de la red existe una conexión de red virtual, y puede haber cualquier número (no hay límite). ^[2] Por lo tanto, no es posible ejecutar getty por separado por cada conexión virtual posible. Existen también varias maneras diferentes de iniciar una sesión a través de la red, las principales en redes TCP/IP son telnet y rlogin. ^[3] Los inicios de sesión a través de la red tienen, en vez de una cantidad enorme de getty's, un servicio individual por tipo de inicio de sesión (telnet y rlogin tienen servicios separados) que "escucha" todos los intentos de inicio de sesión entrantes. Cuando el servicio advierte un intento de inicio de sesión, inicia una nueva instancia de si mismo para atender la petición individual; la instancia original continúa atenta a otros posibles intentos. La nueva instancia trabaja de manera similar a getty. Sistemas de archivos de red (NFS) Una de las cosas más útiles que se pueden hacer con los servicios de red es compartir archivos a través de un sistema de archivos de red. El más utilizado normalmente para compartir archivos se llama Network File System, o NFS, desarrollado por Sun Microsystems. Con un sistema de archivos de red, cualquier operación sobre un archivo realizada por un programa en una máquina es enviada a través de la red a otra máquina. Se "engaña" al programa, haciéndole creer que todos los archivos en el ordenador remoto se encuentran de hecho en el ordenador en el que el programa se está ejecutando. Con esta manera de trabajar, compartir información es extremadamente simple, ya que no se requieren modificaciones en el programa. Otra manera muy popular de compartir archivos es a través de Samba (http:// www.samba.org). Este protocolo (llamado SMB) permite compartir archivos con máquinas Windows a través del Entorno de Red. También permite compartir impresoras. Correo El correo electrónico es el método más popularmente utilizado para comunicarse a través del ordenador. Una carta electrónica se almacena en un archivo con un formato especial, y se utilizan programas de correo especiales para enviar y leer las cartas. Cada usuario tiene un buzón de correo entrante (un archivo con formato especial), en donde se almacena todo el correo nuevo. Cuando alguien envía un correo, el programa de correo localiza el buzón del destinatario y agrega la carta al archivo de buzón de correo entrante. Si el buzón del destinatario se encuentra en otra máquina, la carta es enviada allí, donde se traslada al buzón de correo como corresponda. El sistema de correo se compone de muchos programas. El transporte del correo a buzones locales o remotos es realizado por un programa: el agente de transporte de correo o MTA. (Sendmail y Smail son dos ejemplos de esto), mientras que existe un sin número de programas muy variados que los usuarios utilizan para leer y escribir correos (Estos son conocidos como agentes de usuario de correo o MUA, Pine y Elm son ejemplos de esto). Los archivos de buzones de correo están usualmente ubicados en /var/spool/mail. Impresión Solo una persona puede utilizar la impresora en un momento dado, pero sería antieconómico no compartir impresoras entre los usuarios. La impresora es por lo tanto administrada por software que implementa una cola de impresión: todos los trabajos de impresión son colocados dentro de la cola, y una vez que la impresora termina de imprimir una trabajo, el siguiente es enviado a la impresora automáticamente. Esto alivia al usuario de la organización de la cola de impresión y de luchar por el control de la impresora. El software de la cola de impresión también coloca los trabajos de impresión en disco, es decir, el texto a imprimir es mantenido en un archivo mientras que el trabajo se encuentre en la cola. Esto permite a los programas de aplicación entregar rápidamente los trabajos a imprimir al software que administra la cola de impresión; así, las aplicaciones no tienen que esperar a que el trabajo (en inglés "job") esté de hecho impreso para poder continuar su ejecución. Esta forma de trabajar es realmente cómoda, ya que permite enviar a imprimir una versión de un trabajo y no tener que esperar a que ésta sea impresa antes de poder hacer una versión nueva completamente revisada. La distribución del sistema de archivos El sistema de archivos está dividido en muchas partes; normalmente en las líneas de un sistema de archivos raíz con /bin, /lib, /etc, /dev, y otros pocos directorios; un sistema de archivos /usr con programas y datos que no tendrán cambios; un sistema de archivos /var con datos que pueden cambiar (como los archivos de log); y un sistema de archivos /home para todos los archivos personales de los usuarios. Dependiendo de la configuración del hardware y de las decisiones del administrador del sistema, la división puede llegar a ser diferente; a pesar de esto, y aunque la división es aconsejable, es también posible distribuir todos los archivos en un solo sistema de archivos. En el Capítulo 4, Visión General del Árbol de Directorios se describe la distribución del sistema de archivos con algo de detalle; el documento "Estándar de la Jerarquía del Sistema de Archivos de Linux" cubre este tema más en profundidad. ^[4] -------------- ^[1] De hecho, a menudo es considerado erróneamente como el sistema operativo en sí, aunque no lo es. Un sistema operativo proporciona muchos más servicios que el núcleo por sí mismo. ^[2] Al menos puede haber muchas. Dado que el ancho de banda es un recurso escaso, existe aún en la práctica algún límite al número de inicios de sesión concurrentes a través de una conexión de red. ^[3] Hoy en día muchos administradores de sistemas Linux consideran que telnet y rlogin son inseguros y prefieren ssh , el ?intérprete de comandos seguro? que encripta el tráfico en la red, haciendo así bastante menos probable que usuarios malintencionados puedan ?espiar? la conexión y obtener datos sensibles como nombres de usuario y passwords. Está altamente recomendado usar ssh en lugar de telnet o rlogin. ^[4] http://www.pathname.com/fhs/ Capítulo 4. Visión General del Árbol de Directorios Tabla de contenidos Información preliminar El sistema de archivos raíz El directorio /etc El directorio /dev El sistema de archivos /usr El sistema de archivos /var El sistema de archivos /proc ?Dos días mas tarde, estaba Pooh sentado en su rama, balanceando sus patas, y allí junto a él había cuatro ollas de miel?(A.A. Milne) En este capítulo se describen las partes importantes de un árbol de directorios GNU/Linux estándar, basado en el Estándar de la Jerarquía del Sistema de Archivos de Linux (Filesystem Hierarchy Standard, FHS). Además, se explica en líneas generales la forma normal de dividir el árbol de directorios en sistemas de archivos separados con diferentes propósitos y se enuncian los motivos para esta particular división. También se describirán otras formas alternativas de realizarla. Información preliminar Este capítulo está basado en el Estándar de la Jerarquía del Sistema de Archivos de Linux (FHS) versión 2.1, el cual intenta establecer un estándar para la organización del árbol de directorios en un sistema GNU/Linux. Tal estándar tiene la ventaja de facilitar el trabajo de escribir o portar software a este sistema operativo y administrar máquinas bajo el mismo, puesto que todas las cosas se encontrarán en lugares estandarizados. No existe autoridad que obligue a nadie a cumplir con el estándar, pero este tiene el apoyo de muchas distribuciones GNU/Linux. No es una buena idea romper con el FHS sin que existan justificaciones indiscutibles. El FHS pretende seguir la tradición UNIX y las tendencias actuales, haciendo así que los sistemas GNU/Linux les sean familiares a quienes tengan experiencia con otros sistemas Unix, y viceversa. Este capítulo no es tan detallado como el FHS. Un administrador de sistemas debe leer el FHS completo para entenderlo totalmente. En este capítulo no se explican todos los archivos en detalle. La intención no es describir cada uno de ellos, sino dar una visión general del sistema desde el punto de vista del sistema de archivos. Se puede encontrar información adicional sobre cada archivo en otras partes de este manual o en las páginas de manual de GNU/Linux. El árbol de directorios completo está pensado para poder ser dividido en partes más pequeñas, que pueden estar en su propio disco o partición y acomodarse así a los límites del tamaño del disco, así como para facilitar la realización de copias de seguridad y otras tareas de la administración de sistemas. Las partes principales son los sistemas de archivos raíz (/) , /usr, /var , y /home. Cada parte tiene un propósito diferente. El árbol de directorios se ha diseñado para funcionar bien en una red de máquinas GNU/Linux, las cuales pueden compartir algunas partes del sistema de archivos sobre un dispositivo de solo-lectura (CD-ROM por ejemplo), o sobre la red a través de NFS. Figura 4.1. Partes de un árbol de directorios Unix. Las líneas discontinuas indican los límites de la partición. Partes de un árbol de directorios Unix. Las líneas discontinuas indican los límites de la partición. Los roles de las diferentes secciones del árbol de directorios se describen a continuación. * El sistema de archivos raíz es específico para cada máquina (generalmente se encuentra almacenado en el disco local, aunque puede estar también en un disco RAM o en una unidad de red) y contiene los archivos que son necesarios para arrancar el sistema y dejarlo en un estado en el que se puedan montar los demás sistemas de archivos. El contenido del sistema de archivos raíz es por lo tanto suficiente para el nivel de ejecución de usuario individual. También contiene herramientas para reparar un sistema dañado y para recuperar archivos perdidos desde las copias de seguridad. * El sistema de archivos /usr contiene todos los comandos, librerías, páginas de manual, y otros archivos que no serán modificados durante el funcionamiento normal del sistema. No deben existir archivos bajo /usr que sean específicos para una máquina en particular, ni que deban ser modificados durante la utilización normal del sistema. Esto permite que los archivos sean compartidos a través de la red, lo cual puede ser efectivo en cuanto a costes, puesto que se obtiene un ahorro de espacio en disco (/usr puede ocupar fácilmente miles de megabytes) y puede facilitar la administración, ya que sólo el /usr maestro necesita ser modificado cuando actualizamos una aplicación, y no en cada máquina por separado. Aún cuando el sistema de archivos resida en el disco local, este puede ser montado en modo solo lectura, para eliminar el riesgo de que se corrompa durante un fallo. * El sistema de archivos /var contiene archivos que sí cambian durante el funcionamiento normal del sistema, tales como directorios spool ( para correo, noticias (news), impresoras, etc), archivos de log, páginas de manual formateadas y archivos temporales. Tradicionalmente, todo en /var es algo que debería estar en /usr, pero que haría imposible montar dicho sistema de archivos como solo lectura. * El sistema de archivos /home contiene los directorios específicos de los usuarios, P.Ej., todos los datos reales del sistema. Separar los directorios home a su propio árbol de directorios o sistema de archivos hace más fácil la tarea de realizar copias de seguridad; los demás sistemas de archivos no necesitan que se les haga copias de seguridad, o al menos no tan frecuentemente, puesto que rara vez cambian. Un gran directorio /home puede ser dividido en varios sistemas de archivos, lo cual requiere agregar niveles de nombres extra, como por ejemplo, /home/estudiantes y /home/ staff. * Si bien las diferentes partes del árbol de directorios se han llamado hasta ahora sistemas de archivos, no se requiere necesariamente que se encuentren en particiones separadas. Se pueden mantener fácilmente en una única partición si se trata de un sistema pequeño de un solo usuario, y este sólo desea mantener las cosas de manera simple. El árbol de directorios puede también ser dividido en diferentes particiones dependiendo del tamaño de los discos, y de como el espacio se destine a los distintos propósitos. Lo importante, no obstante, es que todos los nombres estándar funcionen; Aún cuando, digamos,/var y /usr se encuentren de hecho en la misma partición, los nombres /usr/lib/libc.a y /var/log/messages deben funcionar. Incluso si, por ejemplo, moviéramos los archivos que se encuentren en /var dentro de /usr/var, y hagamos a /var un enlace simbólico a /usr/var. La estructura del sistema de archivos en UNIX agrupa a los archivos de acuerdo a su propósito. Por lo tanto, todos los comandos están en un mismo lugar, todos los archivos de datos en otro, la documentación en un tercer lugar, etc. Otra alternativa podría ser la de agrupar los archivos de acuerdo al programa al que pertenezcan, P.Ej., todos los archivos de Emacs podrían colocarse en un mismo directorio, todos los de Tex en otro, etc. El problema con esta última aproximación es que dificulta compartir archivos (el directorio del programa frecuentemente contiene archivos no cambiantes y compartibles, y cambiantes y no compartibles), y algunas veces incluso encontrar archivos (por ejemplo, las páginas de manual se encuentran ubicadas en una gran cantidad de lugares, y hacer que los programas que leen tales páginas de manual las encuentren sería una pesadilla de mantenimiento). El sistema de archivos raíz El sistema de archivos raíz debería ser pequeño, ya que residen archivos muy críticos. Si el sistema de archivos es pequeño y rara vez es modificado, tiene más posibilidades de no sufrir daños. Un sistema de archivos raíz dañado, generalmente significa que el sistema no podrá arrancar a no ser que se tomen medidas especiales (por ej., tal vez pueda arrancar desde un disquete de emergencia), por lo que no se desea correr el riesgo. El directorio raíz no contiene generalmente archivos, exceptuando quizás la imagen del núcleo estándar, normalmente llamada /vmlinuz. Todos los demás archivos se encuentran en subdirectorios bajo el sistema de archivos raíz: /bin Comandos necesarios durante el inicio del sistema que pueden ser utilizados por usuarios normales (probablemente después de que el sistema haya arrancado). /sbin Igual que /bin, pero aquí los comandos no están destinados a los usuarios normales,aunque pueden utilizarse en caso de que sea necesario y el sistema lo permita. /sbin no se encuentra en las rutas de acceso por defecto de los usuarios normales. Sí se encuentra definido en la ruta por defecto para el usuario root. /etc Archivos de configuración específicos de la máquina. /root El directorio local para el usuario root. normalmente los demás usuarios del sistema no pueden acceder a él. /lib Librerías compartidas necesarias para los programas que se encuentran en el sistema de archivos raíz. /lib/modules Módulos cargables del núcleo, especialmente aquellos que se necesitan para arrancar el sistema tras recuperarse de algún incidente (e.g., controladores de red y sistemas de archivos). /dev Archivos de dispositivos. Algunos de los archivos de dispositivos más comúnmente utilizados son examinados en el Capítulo 5. /tmp Archivos temporales. Los programas que se ejecuten después de que el sistema se haya iniciado deben utilizar /var/tmp, no /tmp, debido a que / var/tmp probablemente resida en una partición o disco con más espacio. Frecuentemente /tmp es un enlace simbólico para /var/tmp. /boot Archivos utilizados por el cargador de arranque, por ejemplo, GRUB o LILO. Las imágenes del núcleo se guardan con frecuencia en este directorio, en vez de en el directorio raíz. Si existen muchas imágenes del núcleo,el directorio puede llegar a crecer mucho, por lo que es mejor mantener este directorio en un sistema de archivos separado. Otra razón puede ser la de asegurarse de que las imágenes del núcleo se encuentren dentro de los primeros 1024 cilindros de un disco IDE. /mnt Punto de montaje temporal para los sistemas de archivos montados por el administrador del sistema. Se supone que los programas no deben montar en / mnt automáticamente. Es posible que /mnt se encuentre dividido en subdirectorios (por ej., /mnt/dos puede ser el punto de montaje para la unidad de disquete con sistema de archivos MS-DOS, y /mnt/extra puede llegar a ser lo mismo con un sistema de archivos ext2). /proc /usr /var /home Puntos de montaje para otros sistemas de archivos. El directorio /etc El directorio /etc contiene gran cantidad de archivos. Algunos de ellos se describen aquí, mas abajo. Para otros archivos, se debe determinar a que programa pertenecen y leer la página de manual correspondiente. Muchos archivos de configuración de red se encuentran también en /etc, y se encuentran descritos en La Guía para Administradores de Redes en Linux. /etc/rc o /etc/rc.d o /etc/rc?.d Scripts o directorios de scripts que se ejecutan durante el arranque del sistema o al cambiar el nivel de ejecución. Se puede encontrar información adicional en el capítulo dedicado a Init. /etc/passwd La base de datos de los usuarios, que incluye campos como el nombre de usuario, nombre real, directorio home, password encriptada y otra información acerca de cada usuario. El formato de este archivo se encuentra documentado en la página de manual del comando passwd. Sin embargo, hoy día es muy común encontrar las contraseñas encriptadas en /etc/shadow. Esto significa que en tal caso, los datos de los usuarios excepto la password encriptada se encontrarían almacenados en passwd. /etc/fdprm Tabla de parámetros para los discos flexibles. Describe cómo son los diferentes formatos de estos discos. Este archivo es utilizado por el programa setfdprm. Se puede encontrar información adicional en la página de manual de setfdprm. /etc/fstab Lista los sistemas de archivos montados automáticamente en el arranque del sistema por el comando mount -a (en /etc/rc o archivo de inicio equivalente). En Linux, este archivo también contiene información acerca de áreas de swap utilizadas automáticamente por swapon -a. Se puede encontrar información adicional en ?Montar y desmontar?, la página de manual del comando mount. /etc/group Este archivo es similar a /etc/passwd , pero describe grupos en vez de usuarios. Se puede encontrar información adicional en la página de manual del comando group. /etc/inittab Archivo de configuración para init. /etc/issue Archivos que utiliza getty como salida antes de que el sistema pida el nombre de usuario. Usualmente contiene una descripción corta o mensaje de bienvenida al sistema. El contenido es establecido por el administrador del sistema. /etc/magic El archivo de configuración para el programa file. Contiene las descripciones de varios formatos de archivos que utiliza file para determinar el tipo de archivo. Se puede encontrar información adicional en las páginas de manual para magic y file. /etc/motd Contiene el mensaje del día, que se emite automáticamente tras iniciar una sesión con éxito. El contenido es definido por el administrador del sistema. Con frecuencia se utiliza para dar información a todos los usuarios, como por ejemplo, mensajes de advertencias acerca de la hora en que está planeada una parada técnica del servidor. /etc/mtab Contiene un listado de los sistemas de archivos actualmente montados. Se establece Inicialmente por los scripts del arranque del sistema, y se actualiza automáticamente por el comando mount. Se utiliza cuando se necesita un listado de los sistemas de archivos que estén actualmente montados (por ejemplo por el comando df). /etc/shadow Archivo de contraseñas ocultas en sistemas donde se encuentre instalado el software de contraseñas ocultas. Al utilizar contraseñas ocultas la password encriptada de cada usuario es eliminada de /etc/passwd y colocada en el archivo /etc/shadow; este último no puede ser leído por nadie a excepción del usuario root. De esta manera se dificulta el proceso de descifrado de las contraseñas de los usuarios. Si la distribución GNU/Linux que estemos utilizando nos permite elegir utilizar o no contraseñas ocultas (muchas lo hacen), está altamente recomendado hacerlo. /etc/login.defs Archivo de configuración para el comando login. El archivo login.defs se describe en el capítulo 5. /etc/printcap Similar a /etc/termcap, con la excepción de que está destinado a la configuración de colas de impresión. La sintaxis también es diferente. printcap se describe en el capitulo 5. /etc/profile, /etc/csh.login, /etc/csh.cshrc Archivos que se ejecutan en el momento de iniciar los intérpretes de comandos C o Bourne. Permite al administrador del sistema establecer parámetros globales por defecto para todos los usuarios. Se puede encontrar información adicional en las páginas de manual para los respectivos intérpretes de comandos. /etc/securetty Identifica las terminales seguras, esto es, las terminales por las cuales el usuario root tiene permitido iniciar una sesión. Típicamente sólo las consolas virtuales se encuentran listadas en este archivo, con lo que se hace imposible (o al menos mas difícil) obtener privilegios de superusuario accediendo a través de un módem o la red. No se debe permitir iniciar una sesión como usuario root desde la red. Es preferible iniciar una sesión con un usuario sin privilegios y utilizar después su o sudo para obtener privilegios de superusuario. /etc/shells Listado de intérpretes de comandos admitidos. El comando chsh permite a los usuarios cambiar su intérprete de comandos por defecto a otro que se encuentre listado en este archivo. Ftpd, el proceso servidor que proporciona servicios FTP en una máquina, comprueba que los intérpretes de comandos de los usuarios estén listados en /etc/shells y no permite que nadie inicie una sesión si el intérprete de comandos no se encuentra en dicho listado. /etc/termcap La base de datos de capacidades del terminal. Describe las ?secuencias de escape? por medio de las cuales se pueden controlar diversos tipos de terminales. Los programas se escriben para que, en lugar de generar directamente una secuencia de escape que solo funcione en un tipo de terminal, busquen la secuencia correcta para hacer lo que necesiten en /etc /termcap. Como resultado, la mayoría de los programas trabajan con la mayoría de los tipos de terminales existentes. Se puede encontrar información adicional en las páginas de manual de termcap, curs_termcap, y de terminfo. El directorio /dev El directorio /dev contiene los archivos de dispositivos especiales para todos los dispositivos hardware. Los archivos de dispositivos se nombran utilizando convenciones especiales; y se describen con mayor detalle en el Capítulo 5, Archivos de Dispositivos. Los archivos de dispositivos se crean durante la instalación del sistema, y también pueden ser creados con el script /dev/ MAKEDEV. /dev/MAKEDEV.local es un script escrito por el administrador del sistema que crea archivos de dispositivos locales o enlaces (es decir, aquellos que no son parte del MAKEDEV estándar, como los archivos de dispositivos para algún controlador de dispositivo no estándar). El sistema de archivos /usr El sistema de archivos /usr es con frecuencia grande, debido a que todos los programas están instalados allí. Normalmente, todos los archivos en /usr provienen de la distribución Linux que hayamos instalado; los programas instalados localmente y algunas otras cosas se encuentran bajo /usr/local. De esta manera es posible actualizar el sistema desde una nueva versión de la distribución, o incluso desde una distribución completamente nueva, sin tener que instalar todos los programas nuevamente. Algunos de los directorios de /usr están explicados aquí debajo (algunos de los menos importantes se han omitido, se puede encontrar información adicional en el Estándar del Sistema de Ficheros). /usr/X11R6 Se encuentran aquí todos los archivos del Sistema X-Windows. Para simplificar el desarrollo y la instalación de X, sus archivos no fueron integrados dentro del resto del sistema. Existe un árbol de directorios bajo /usr/X11R6 similar al que está bajo /usr. /usr/bin En este directorio se encuentran la gran mayoría de los comandos para los usuarios. Algunos otros comandos pueden encontrarse en /bin o en /usr/local /bin. /usr/sbin Comandos para la administración del sistema que no son necesarios en el sistema de archivos raíz, como por ejemplo la mayoría de los programas que proveen servicios. /usr/share/man, /usr/share/info, /usr/share/doc Páginas de manual, documentos de información GNU, y archivos de documentación de los programas instalados. /usr/include Archivos cabecera para el lenguaje de programación C. Estos deberían estar de hecho debajo de /usr/lib por coherencia, pero tradicionalmente se ha apoyado de forma mayoritaria esta ubicación. /usr/lib Archivos de datos de programas y subsistemas que no sufren cambios, incluyendo algunos archivos de configuración globales. El nombre lib viene de librería; originariamente las librerías de las subrutinas de programación se almacenaban en /usr/lib. /usr/local Es la ubicación para el software instalado localmente y para algunos otros archivos. Las distribuciones no deben colocar archivos bajo este directorio. Se reserva para ser utilizado únicamente por el administrador local del sistema. De esta manera, aquel se asegura totalmente de que ninguna actualización de su distribución sobreescribirá el software que él mismo haya instalado localmente. El sistema de archivos /var El sistema de archivos /var contiene datos que cambian cuando el sistema se ejecuta normalmente. Es específico para cada sistema y por lo tanto no es compartido a través de la red con otras computadoras. /var/cache/man Actúa como una caché para las páginas de manual que son formateadas bajo demanda. Las fuentes de las páginas de manual se encuentran almacenadas normalmente en /usr/man/man? (donde ? es la sección de las páginas de manual que corresponda. Se puede encontrar información adicional en la página de manual para man en el capítulo 7); algunas páginas de manual pueden llegar a venir con una versión pre-formateada, la cual estaría almacenada en /usr/share/man/cat*. Otras páginas de manual necesitan ser formateadas al ser visualizadas por primera vez; la versión formateada es almacenada entonces en var/cache/man para que la próxima vez que un usuario necesite ver la misma página no tenga que esperar a que se le de formato. /var/games Cualquier información variable perteneciente a juegos existente en /usr debería colocarse aquí. Esto es así por si se da el caso de que /usr esté montado como solo lectura /var/lib Contiene archivos que cambian mientras el sistema se ejecuta normalmente. /var/local Datos variables de los programas que se encuentran instalados en /usr/local (aquellos que fueron instalados localmente por el administrador del sistema). Conviene reseñar que aunque los programas se encuentren instalados localmente, deben utilizar los otros directorios /var en caso de ser apropiado, como por ejemplo: /var/lock. /var/lock Archivos de bloqueo. Muchos programas siguen una convención para crear un archivo de bloqueo en /var/lock que indique que están utilizando un dispositivo particular o un archivo de forma exclusiva. Así, Los demás programas se encontrarán con el archivo de bloqueo y no intentarán acceder al dispositivo o archivo. /var/log Archivos de log (en español bitácora) de diferentes programas, especialmente de login (/var/log/wtmp, el cual registra todos los inicios y cierres de sesión en el sistema) y de syslog (/var/log/messages, en donde se almacenan todos los mensajes del núcleo y de los programas del sistema). Los Archivos dentro del directorio /var/log pueden crecer indefinidamente, por lo que se requiere una limpieza a intervalos regulares. /var/mail Esta es la ubicación definida por el FHS (Estándar de la jerarquía del sistema de ficheros) para almacenar los archivos de buzón de correos de los usuarios. Dependiendo de en qué grado su distribución cumpla con el FHS, estos archivos pueden llegar a estar ubicados en /var/spool/mail. /var/run Directorio que contiene archivos con información acerca del sistema, la cual es válida hasta el próximo inicio del mismo. Por ejemplo: /var/run/ utmp contiene información de las personas que actualmente tienen sesiones iniciadas. /var/spool Contiene directorios para las noticias, el correo, colas de impresión, y otros programas que necesiten trabajar con colas. Cada spool diferente tiene su propio directorio debajo de /var/spool, por ejemplo: el spool de noticias se encuentra en /var/spool/news. Cabe destacar que si alguna instalación no cumple totalmente con la última versión del FHS, los buzones de correo entrante de los usuarios pueden encontrarse en /var/spool/mail. /var/tmp Archivos temporales grandes o que necesitan existir por un tiempo más amplio de lo permitido en /tmp. (De todas formas, el administrador del sistema puede no permitir muchos archivos antiguos en /var/tmp si así lo desea). El sistema de archivos /proc El sistema de archivos /proc contiene un sistema de archivos imaginario o virtual. Este no existe físicamente en disco, sino que el núcleo lo crea en memoria. Se utiliza para ofrecer información relacionada con el sistema (originalmente acerca de procesos, de aquí su nombre). Algunos de los archivos más importantes se encuentran explicados mas abajo. El sistema de archivos / proc se encuentra descrito con más detalle en la página de manual de proc. /proc/1 Un directorio con información acerca del proceso número 1. Cada proceso tiene un directorio debajo de /proc cuyo nombre es el número de identificación del proceso (PID). /proc/cpuinfo Información acerca del procesador: su tipo, marca, modelo, rendimiento, etc. /proc/devices Lista de controladores de dispositivos configurados dentro del núcleo que está en ejecución. /proc/dma Muestra los canales DMA que están siendo utilizados. /proc/filesystems Lista los sistemas de archivos que están soportados por el kernel. /proc/interrupts Muestra la interrupciones que están siendo utilizadas, y cuantas de cada tipo ha habido. /proc/ioports Información de los puertos de E/S que se estén utilizando en cada momento. /proc/kcore Es una imagen de la memoria física del sistema. Este archivo tiene exactamente el mismo tamaño que la memoria física, pero no existe en memoria como el resto de los archivos bajo /proc, sino que se genera en el momento en que un programa accede a este. (Recuerde: a menos que copie este archivo en otro lugar, nada bajo /proc usa espacio en disco). /proc/kmsg Salida de los mensajes emitidos por el kernel. Estos también son redirigidos hacia syslog. /proc/ksyms Tabla de símbolos para el kernel. /proc/loadavg El nivel medio de carga del sistema; tres indicadores significativos sobre la carga de trabajo del sistema en cada momento. /proc/meminfo Información acerca de la utilización de la memoria física y del archivo de intercambio. /proc/modules Indica los módulos del núcleo que han sido cargados hasta el momento. /proc/net Información acerca del estado de los protocolos de red. /proc/self Un enlace simbólico al directorio de proceso del programa que esté observando a /proc. Cuando dos procesos observan a /proc, obtienen diferentes enlaces. Esto es principalmente una conveniencia para que sea fácil para los programas acceder a su directorio de procesos. /proc/stat Varias estadísticas acerca del sistema, tales como el número de fallos de página que han tenido lugar desde el arranque del sistema. /proc/uptime Indica el tiempo en segundos que el sistema lleva funcionando. /proc/version Indica la versión del núcleo Conviene aclarar que aunque los archivos anteriores tienden a ser archivos de texto fáciles de leer, algunas veces pueden tener un formato que no sea fácil de interpretar. Por ello existen muchos comandos que solamente leen los archivos anteriores y les dan un formato distinto para que la información sea fácil de entender. Por ejemplo, el comando free, lee el archivo /proc/meminfo y convierte las cantidades dadas en bytes a kilobytes (además de agregar un poco más de información extra). Capítulo 5. Archivos de Dispositivos Tabla de contenidos El Script MAKEDEV El comando mknod Listado de dispositivos En este capítulo se ofrece una visión general de lo que es un archivo de dispositivo y se explica cómo crearlo. También se listan algunos de los archivos de dispositivo más comunes. El listado canónico de los archivos de dispositivo se encuentra en /usr/src/linux/Documentation/devices.txt, siempre y cuando el código fuente del núcleo de Linux se encuentre instalado en el sistema. El listado de dispositivos que se presenta en este capítulo corresponde a los soportados por la versión 2.2.17 del núcleo. El Script MAKEDEV Después de haber instalado un sistema GNU/Linux, la mayoría de los archivos de dispositivo se encuentran ya creados y listos para ser utilizados. Si por alguna razón es necesario crear un archivo de dispositivo, debe utilizarse en primer lugar el Script MAKEDEV. Este script se encuentra ubicado generalmente en /dev/MAKEDEV, aunque también puede existir una copia (o un enlace simbólico) en /sbin/MAKEDEV. Si alguna o ambas rutas son correctas y no se encuentran definidas en la variable de entorno PATH, entonces se deberá especificar la ruta completa de forma explícita. En general el comando se utiliza de la siguiente forma: #/dev/MAKEDEV -v ttyS0 create ttyS0 c 4 64 root:dialout 0660 El comando anterior creará el archivo de dispositivo /dev/ttyS0 como un dispositivo de caracteres, con un valor de 4 para el nodo mayor y con un valor de 64 para el nodo menor; tendrá como permisos de acceso 0660 y su dueño y grupo serán root y dialout respectivamente. ttyS0 es un puerto serie. Los números de nodo mayor y menor son valores entendidos por el núcleo, el cual utiliza números para referirse a los distintos dispositivos hardware. Esta forma de referenciar dispositivos puede llegar a ser muy difícil de recordar, por lo que en su lugar se utilizan nombres de archivo. Los permisos de acceso 0660 se interpretan como permisos de lectura y escritura para su dueño (en este caso root), permisos de lectura y escritura para los miembros del grupo al que pertenece este archivo (en este caso dialout), y ningún permiso para todos los demás usuarios. El comando mknod MAKEDEV es la manera preferida de crear archivos de dispositivo que no se encuentren presentes. No obstante, algunas veces el script MAKEDEVno tiene información referente al archivo de dispositivo que desea crear, por lo que no podrá hacerlo. Aquí es cuando se debe emplear el comando mknod. Para poder utilizar mknod es necesario conocer los valores numéricos de los nodos mayor y menor del archivo de dispositivo a crear. El archivo devices.txt es la fuente canónica para obtener esta información, y viene con la documentación del núcleo. Como ejemplo, supongamos que la versión instalada del script MAKEDEV no conoce como crear el archivo de dispositivo /dev/ttyS0. En ese caso, se necesita utilizar el comando mknod para crearlo. Al observar el archivo devices.txt, conocemos que ttyS0 es un archivo de dispositivo de caracteres con número mayor 4 y número menor 64. Con estos datos ya contamos con toda la información necesaria para crear el archivo. # mknod /dev/ttyS0 c 4 64 # chown root.dialout /dev/ttyS0 # chmod 0644 /dev/ttyS0 # ls -l /dev/ttyS0 crw-rw---- 1 root dialout 4, 64 Oct 23 18:23 /dev/ttyS0 Como se podrá observar, se necesitan muchos más pasos (sin MAKEDEV) para poder crear el archivo. En este ejemplo es posible contemplar todo el proceso requerido. Es improbable de que el archivo ttyS0 no pueda ser proporcionado por el script MAKEDEV, pero es suficiente para ilustrar el ejemplo. Listado de dispositivos El siguiente listado no tiene la intención de ser tan exhaustivo o detallado como pudiera. Muchos de estos archivos de dispositivo necesitan soporte compilado dentro del núcleo. Es posible obtener los detalles de cada archivo en particular en la documentación del núcleo. Si el lector cree que existen otros archivos de dispositivo que deben estar en este listado, se ruega que lo comunique, para intentar incluirlos en la próxima revisión. /dev/dsp Procesador de Señal Digital. Básicamente constituye la interfaz entre el software que produce sonido y la tarjeta de sonido. Es un dispositivo de caracteres con nodo mayor 14 y menor 3. /dev/fd0 La primera unidad de disquete. Si se tiene la suerte de contar con varias unidades, estas estarán numeradas secuencialmente. Este es un dispositivo de caracteres con nodo mayor 2 y menor 0. /dev/fb0 El primer dispositivo framebuffer. El framebuffer es una capa de abstracción entre el software y el hardware de video. De esta manera las aplicaciones no necesitan conocer el tipo de hardware existente, aunque si es necesario que conozcan como comunicarse con la API (Interfaz de Programación de Aplicaciones) del controlador del framebuffer, que se encuentra bien definida y estandarizada. El framebuffer es un dispositivo de caracteres con nodo mayor 29 y nodo menor 0. /dev/hda /dev/hda es el dispositivo IDE maestro que se encuentra conectado a la controladora IDE primaria. /dev/hdb es el dispositivo IDE esclavo sobre la controladora primaria. /dev/hdc y /dev/hdd son los dispositivos maestro y esclavo respectivamente sobre la controladora secundaria. Cada disco se encuentra dividido en particiones. Las particiones 1 a 4 son particiones primarias y las particiones 5 en adelante son particiones lógicas que se encuentran dentro de particiones extendidas. De esta manera los nombres de los archivos de dispositivo que referencian a cada una de las particiones están compuestos por varias partes. Por ejemplo, /dev/hdc9 es el archivo de dispositivo que referencia a la partición 9 (una partición lógica dentro de un tipo de partición extendida) sobre el dispositivo IDE maestro que se encuentra conectado a la controladora IDE secundaria. Los números de los nodos mayor y menor son algo más complejos. Para la primera controladora IDE todas las particiones son dispositivos de bloques con nodo mayor 3. El dispositivo maestro hda tiene número de nodo menor 0 y el dispositivo esclavo hdb tiene un valor para el nodo menor 64. Por cada partición dentro de la unidad el valor para el nodo menor se obtiene de sumar el valor del nodo menor para la unidad más el número de partición. Por ejemplo, /dev/ hdb5 tiene un valor para el nodo mayor 3 y para el nodo menor 69 (64 + 5 = 69). Para las unidades conectadas a la controladora secundaria los valores para los nodos son obtenidos de la misma manera, pero con valor para el nodo mayor 22. /dev/ht0 La primera unidad de cinta IDE. Las unidades subsiguientes son numeradas ht1, ht2, etc. Son dispositivos de caracteres con valor 27 para el nodo mayor y comienzan con valor 0 para el nodo menor de ht0 , nodo menor 1 para ht1, etc. /dev/js0 El primer joystick analógico. Los joysticks subsiguientes se nombran js1, js2, etc. Los joysticks digitales se nombran djs0, djs1, etc. Son dispositivos de caracteres con valor 15 para el nodo mayor. Los valores para el nodo menor en los joysticks analógicos comienzan en 0 y llegan a 127 (más que suficiente hasta para el más fanático de los jugadores). Los valores para el nodo menor para joysticks digitales son del 128 en adelante. /dev/lp0 El primer dispositivo para impresoras con puerto paralelo. Las impresoras subsiguientes tienen los nombres lp1, lp2, etc. Son dispositivos de caracteres con valor 6 para el nodo mayor y 0 para el nodo menor, numerados secuencialmente. /dev/loop0 El primer dispositivo loopback. Los dispositivos Loopback son utilizados para montar sistemas de archivos que no se encuentren localizados en dispositivos de bloques tales como los discos. Por ejemplo, si necesita montar una imagen CD ROM iso9660 sin "quemarla" en un CD, se debe utilizar un dispositivo loopback. Normalmente, este proceso es transparente para el usuario y es manejado por el comando mount. Se puede encontrar información adicional en las páginas de manual para mount y losetup. Los dispositivos loopback son dispositivos de bloques con valor 7 para el nodo mayor y valores para los nodos menores comenzando en 0 y numerados secuencialmente. /dev/md0 Primer grupo de meta-discos. Los meta-discos están relacionados con los dispositivos RAID (en Inglés, Redundant Array of Independent Disks). Se pueden leer los COMOs (HOWTOs) relacionados con RAID existentes en LDP para conocer más detalles. Los dispositivos de meta-discos son dispositivos de bloques con valor 9 para el nodo mayor y valores para el nodo menor comenzando en 0 y numerados secuencialmente. /dev/mixer Este archivo de dispositivo es parte del controlador OSS (en Inglés, Open Sound System). Se pueden conocer más detalles en la documentación de OSS. / dev/mixer es un dispositivo de caracteres con valor 14 para el nodo mayor y 0 para el nodo menor. /dev/null El cubo de los bits. Un agujero negro a donde enviar datos que nunca más se volverán a ver. Todo lo que se envíe a /dev/null desaparece. Puede utilizarse, por ejemplo, para ejecutar un comando y no ver en la terminal la salida estándar (debe redirigirse la salida estándar a /dev/null). Es un dispositivo de caracteres con valor 1 para el nodo mayor y 3 para el nodo menor. /dev/psaux El puerto para el ratón PS/2. Este es un dispositivo de caracteres con valor 10 para el nodo mayor y 1 para el nodo menor. /dev/pda Discos IDE conectados al puerto paralelo. Los nombres para estos discos son similares a los utilizados para los discos internos conectados a las controladoras IDE (/dev/hd*). Son dispositivos de bloque con un valor de 45 para el nodo mayor. Los valores para los nodos menores necesitan un poco de explicación. El primer dispositivo /dev/pda tiene un valor de 0 para el nodo menor. Para cada partición dentro de la unidad, el valor del nodo menor se obtiene de sumar el valor del nodo menor para la unidad más el número de partición. Cada dispositivo tiene un límite de 15 particiones como máximo en vez de las 63 que tienen los discos IDE internos. /dev/pdb tiene un valor de 16 para el nodo menor, /dev/pdc 32 y /dev/pdd48. Por ejemplo, el valor del nodo menor para el dispositivo /dev/pdc6 debe ser 38 (32 + 6 = 38). Este esquema tiene un límite de 4 discos paralelos con 15 particiones cada uno como máximo. /dev/pcd0 Unidades CD ROM conectadas al puerto paralelo. Los nombres para estos dispositivos están numerados secuencialmente /dev/pcd0, /dev/pcd1, etc. Son dispositivos de bloques con un valor de 16 para el nodo mayor. /dev/pcd0 tiene un valor de 0 para el nodo menor, las demás unidades tienen valores secuenciales para el nodo menor 1, 2, etc. /dev/pt0 Dispositivos de cinta conectados al puerto paralelo. Las cintas no tienen particiones, por lo tanto los nombres para estos dispositivos están numerados secuencialmente /dev/pt0,/dev/pt1,etc. Son dispositivos de caracteres con un valor de 96 para el nodo mayor. Los valores para el nodo menor comienzan con 0 para /dev/pt0 , 1 para /dev/pt1, etc. /dev/parport0 Los puertos paralelos. La mayoría de los dispositivos conectados a los puertos paralelos tienen sus propios controladores. Este es un dispositivo que permite acceder al puerto paralelo directamente. Es un dispositivo de caracteres con un valor de 99 para el nodo mayor y con un valor de 0 para el nodo menor. Los dispositivos subsiguientes tienen valores secuenciales obtenidos incrementando el valor del nodo menor. /dev/random o /dev/urandom Estos dispositivos son generadores de números aleatorios para el núcleo. / dev/random es un generador no-determinístico, lo que significa que el valor del próximo número aleatorio no puede ser obtenido utilizando los números generados anteriormente. Para generar los números utiliza la entropía del hardware del sistema. Cuando esta se agota, debe esperar a conseguir más para generar un nuevo número. /dev/urandom trabaja de manera similar. Inicialmente utiliza la entropía del hardware del sistema, cuando esta se agota, continúa retornando números que se elaboran a partir de una fórmula generadora de números pseudo aleatorios. Utilizar este dispositivo es menos seguro para propósitos críticos como la generación de una clave criptográfica. Si la seguridad es el factor importante se debe utilizar / dev/random, en cambio si lo que se necesita es velocidad, el dispositivo / dev/urandom funciona mejor. Ambos son dispositivos de caracteres con un valor de 1 para el nodo mayor, los valores para el nodo menor son 8 y 9 para /dev/random y /dev/urandom respectivamente. /dev/zero Este es un dispositivo que se puede utilizar de manera simple para obtener ceros. Cada vez que se lee el dispositivo se obtiene como respuesta un cero. Puede ser útil, por ejemplo, para crear un archivo de tamaño fijo sin que importe su contenido. /dev/zero es un dispositivo de caracteres con un valor de 1 para el nodo mayor y 5 para el nodo menor. Capítulo 6. Utilizando Discos y Otros Medios de Almacenamiento Tabla de contenidos Dos tipos de dispositivos Discos Rígidos Disquetes CD-ROM Cintas Dar formato Particiones El MBR, sectores de arranque y la tabla de particiones Particiones extendidas y lógicas Tipos de particiones Particionando el disco duro Archivos de dispositivo y particiones Sistemas de archivos ¿Qué son los sistemas de archivos? Sistemas de archivos soportados por Linux ¿Qué sistemas de archivos deben utilizarse? Crear un sistema de archivos Montar y desmontar Comprobar la integridad de un sistema de archivos con fsck Comprobar errores en el disco mediante badblocks Luchar contra la fragmentación Otras herramientas para todos los sistemas de archivos Otras herramientas para el sistema de archivos ext2/ext3 Discos sin sistemas de archivo Situando el espacio en disco Esquemas de particionamiento Requerimientos de espacio Ejemplos de colocación de disco duro Añadir más espacio en disco para Linux Consejos para liberar espacio en disco ?"En un disco limpio puede buscar por siempre"? Cuando instala o actualiza su sistema, necesita realizar una cantidad de trabajo razonable en sus discos. Para que los archivos puedan ser almacenados en los discos debe crear sistemas de archivos y reservar espacio para las diferentes partes del sistema. En este capítulo se explican todas las actividades iniciales que necesitan realizarse sobre los discos. Usualmente, una vez que consiga configurar su sistema, no tendrá que realizar el trabajo nuevamente, excepto para utilizar disquetes. Solo necesitará volver a este capítulo si agrega un nuevo disco o desea poner a punto de manera muy fina a la utilización del disco. Las tareas básicas en la administración de discos son: * Formatear los discos. Formatear los discos realiza varias tareas, tal como chequear y registrar la existencia de bloques dañados, y los prepara que que puedan ser utilizados. (El dar formato no es necesario en estos días para la mayoría de los discos rígidos). * Particionar los discos rígidos. Si desea utilizar los discos para varias actividades, las cuales supuestamente no deben interferir con ninguna otra, debe crear particiones (o al menos debe crear una para poder utilizarlo). Una razón por la que debe particionar en varias partes un disco es almacenar varios sistemas operativos en el mismo. Otra razón es para mantener los archivos de los usuarios separados de los archivos del sistema, lo cual simplifica la tarea de realizar copias de seguridad y ayuda a proteger el sistema de una corrupción. * Crear un sistema de archivos (de un tipo particular) en cada disco o partición. El disco no significa nada para un sistema GNU/Linux hasta que no genere un sistema de archivos; entonces luego, los archivos pueden ser creados y accedidos. * Montar sistemas de archivos diferentes para formar una estructura de árbol individual, automáticamente o manualmente como sea necesario. (Si se montan sistemas de archivos manualmente, entonces usualmente, necesitan que también sean desmontados manualmente). El Capítulo 7, Administración de Memoria contiene información acerca de memoria virtual y caché de disco, de lo cual necesita estar percatado al momento de utilizar discos. Dos tipos de dispositivos UNIX, y por lo tanto GNU/Linux, reconoce dos tipos de dispositivos: dispositivos de bloques de acceso-aleatorio (tales como discos), y dispositivos de caracteres (tales como cintas y lineas seriales), algunos de estos últimos pueden ser de acceso secuencial y algunos de accesos-aleatorio. Cada dispositivo soportado en GNU/Linux es representado en el sistema de archivos como un archivo de dispositivo. Cuando lea o escriba sobre un archivo de dispositivo, los datos van o vienen desde el dispositivo que este representa. De esta manera no se necesitan programas especiales (y no se necesitan ningún método especial de programación, como descubrir interrupciones o escudriñar puertos seriales) para acceder a los dispositivos. Por ejemplo, para enviar un archivo a la impresora, puede simplemente ejecutar : $ cat filename > /dev/lp1 $ y el contenido del archivo es impreso (en este caso, el archivo debe estar en un formato que la impresora comprenda). Note, que no es una buena idea tener a varias personas realizando cat de sus archivos a la impresora al mismo tiempo. Generalmente se utiliza un programa especial para enviar los archivos a que sean impresos (usualmente lpr). Estos programas se aseguran de que solo un archivo esté siendo impreso en un momento dado, y automáticamente envía archivos a la impresora en cuanto se finalice la impresión del archivo previo. Algo similar puede ser necesario para la mayoría de los dispositivos. De hecho, raramente los archivos de dispositivos son utilizados directamente. Desde que los archivos de dispositivos se muestran como archivos en el sistema (en el directorio /dev), es fácil ver cuales de ellos existen, utilizando ls o algún otro comando similar. En la salida del comando ls -l, la primera columna indica el tipo de archivo y sus permisos. Por ejemplo, observe la salida al inspeccionar un archivo de dispositivo de un puerto serial : $ ls -l /dev/ttyS0 crw-rw-r-- 1 root dialout 4, 64 Aug 19 18:56 /dev/ttyS0 $ El primer caractér en la primera columna arriba, es decir `c' en crw-rw-rw-, le indica el tipo de archivo, en este caso un dispositivo de caracteres. Para archivos comunes el primer caractér es `-', para directorios es`d' y para dispositivos de bloques es `b'. Examine la página de manual de ls para obtener información mas detallada. Note que usualmente todos los archivos de dispositivos existen, aún cuando el dispositivo por si mismo no se encuentre instalado. Esto quiere decir que aunque exista un archivo llamado /dev/sda, no significa que realmente haya un disco SCSI instalado. Tener todos los archivos de dispositivos facilita la instalación de los programas, y la incorporación de nuevo hardware (no existe la necesidad de tener que conocer los parámetros correctos para crear los archivos de dispositivos de los nuevos dispositivos). Discos Rígidos Esta subsección introduce terminología relacionada a los discos rígidos. Si ya conoce los términos y conceptos, entonces puede obviar esta subsección. La Figura 6.1, ?A schematic picture of a hard disk.? muestra un esquema de las partes importantes de un disco rígido. Un disco rígido consiste de uno o más discos circulares. ^[5] Las superficies de estos discos se encuentran cubiertas de una substancia magnética utilizada para grabar los datos. Por cada superficie existe una cabeza lectora-escritora que examina o altera los datos allí grabados. Los discos rotan sobre un eje común, y típicamente la velocidad de rotación es de 3600 vueltas o revoluciones por minuto, aunque los discos rígidos de altas prestaciones tienen velocidades mucho mayores. Las cabezas se mueven a lo largo de los radios de los discos; y este movimiento combinado con el de rotación de los discos, permite a las cabezas acceder a todas las partes de las superficies. El procesador (CPU) y el disco se comunican a través de una controladora de disco. Esto libera al resto de la computadora de tener que conocer como utilizar el dispositivo, debido a que los controladores para diferentes tipos de discos pueden ser construidos para que utilicen la misma interfase para comunicarse con el resto de la computadora. Por lo tanto, la computadora solo tiene que decir ?"hey!, Disco!, dame lo que yo quiero"?, en vez de de tener que indicarle, con una larga y compleja serie de señales eléctricas, como mover la cabeza a la ubicación apropiada, esperar a que ls posición correcta del disco pase por debajo de la cabeza y realizar todos los pasos necesarios pocos amistosos. En realidad, la interfase de la controladora es bastante compleja, pero mucho menos de lo que puede llegar a ser un acceso directo al disco si esta no existiera. La controladora puede además realizar otras tareas, como reemplazar automáticamente sectores defectuosos o hacer caché. Lo anterior es usualmente todo lo necesita comprender acerca del funcionamiento del hardware. Existen también un puñado de otras cosas, tales como el motor que gira los discos y mueve las cabezas, y la electrónica que controla las operaciones de las partes mecánicas. Pero estas cuestiones no son relevantes para entender los principios de como trabaja un disco rígido. Las superficies están normalmente divididas en anillos concéntricos, llamado pistas, y estos por su parte, se encuentran divididas en sectores. Esta división es utilizada para especificar ubicaciones dentro de los discos rígidos y para asignar espacio en disco para los archivos. Para encontrar una ubicación en particular en el disco rígido, uno puede decir ?"superficie 3, pista 5, sector 7"?. Normalmente la cantidad de sectores es el mismo en todas las pistas, pero algunos discos ponen más sectores en las pistas más externas al centro (todos los sectores son del mismo tamaño físico, por lo que mayor cantidad de ellos caben en las pistas mas salientes-externas). Típicamente, un sector alberga 512 bytes de datos. El disco, por si sólo, no puede manejar cantidades mas pequeñas de datos que las contenidas en un sector. Figura 6.1. A schematic picture of a hard disk. A schematic picture of a hard disk. Cada superficie esta dividida dentro de pistas (y sectores) de la misma forma. Esto significa que cuando la cabeza se encuentra sobre una pista particular, las cabezas para las otras superficies están también en el mismo número de pista. Todas las pistas correspondientes a un mismo número de pista de cada superficie es llamado un cilindro. El movimiento de las cabezas desde una pista (cilindro) a otra toma un determinado intervalo de tiempo. Entonces, si los datos que se desean acceder (digamos un archivo), se encuentran en ubicaciones contiguas dentro del disco, el movimiento de las cabezas sería menor, mejorando la performance del sistema. Sin embargo, no siempre es posible almacenar los archivos de esta forma; así que los archivos que están ubicados en diversos lugares del disco son llamados fragmentados. El número de superficies (o cabezas, lo cual es la misma cosa), cilindros, y sectores varían bastante. La especificación del número de cada uno de estos ítems es llamada la geometría del disco rígido. La geometría es usualmente almacenada en una memoria especial alimentada a batería, llamada la CMOS RAM, desde donde el sistema operativo puede obtenerla durante el inicio del sistema o la iniciación del controlador. Desafortunadamente, ^[6] la BIOS tiene una limitación de diseño, lo cual hace imposible que se especifique un número de pista que sea mas grande que 1024 en la CMOS RAM, aunque este valor sea muy pequeño para un disco grande. Para solucionar este inconveniente, la controladora del disco rígido "miente" acerca de la geometría, y traduce las direcciones dadas por la computadora dentro de valores que se ajustan realmente. Por ejemplo, un disco rígido puede tener 8 cabezas, 2048 pistas, y 35 sectores por pista. Esta controladora puede mentirle a la computadora y decirle que el disco tiene 16 cabezas, 1024 pistas y 35 sectores por pista. ^[7] Estos valores no exceden el número de pistas permitido y traduce las direcciones suministrada por la computadora dividiendo por dos el número de cabezas y duplicando el número de pistas. En realidad, la matemática es un poco más complicada, porque los números pueden no ser tan exactos como en nuestro ejemplo. Sin embargo,estos detalles no son relevantes para la comprensión del principio. Este tipo de traducción distorsiona la vista que tienen los sistemas operativos sobre como están organizados los discos, por lo tanto, dificulta la acción de almacenar toda la información (por ej. de un archivo) en un mismo cilindro para mejorar la performance. La traducción es solo un problema para los discos de tipo IDE. Los discos SCSI utilizan un número de sector secuencial. En este caso, la controladora traduce un número de sector secuencial en una dirección compuesta por cabeza, cilindro y sector, y utilizan un método completamente diferente de comunicación entre la CPU y la controladora, por lo que no tienen el tipo de problema que existe con los discos IDE. Note, sin embargo, que la computadora tampoco puede conocer la verdadera geometría de un disco SCSI. Debido a que Linux no conoce con frecuencia la verdadera geometría de un disco, sus sistemas de archivos no intentan colocar los archivos en un mismo cilindro. En vez de esto, intenta utilizar sectores consecutivos, lo que proporciona una performance similar. El tema es un poco más complicado si existen prelecturas automáticas y caché manejadas por la controladora. Cada disco rígido es representado por un archivo de dispositivo separado. Los archivos de dispositivos para los discos rígidos IDE son /dev/hda, /dev/hdb, / dev/hdc, y /dev/hdd, respectivamente. Los archivos de dispositivos para los discos rígidos SCSI son /dev/sda, /dev/sdb, etc. Existen convenciones de nombres similares para otros tipos de discos rígidos; lea el Capítulo 5, Archivos de Dispositivos para obtener más información. Note que los archivos de dispositivos para los discos rígidos dan acceso a todo el disco, no a particiones individuales (las cuales están explicadas en subsecciones siguientes). Por esta razón, puede ser simple tener inconveniente con la información entre las particiones si no tiene cuidado al accederlos. Usualmente, solo debe utilizar los archivos de dispositivos de discos para acceder al master boot record (el cual también es explicado más adelante). Disquetes Un disco flexible (o disquete) consiste de una membrana flexible, la cual se encuentra cubierta en uno o en ambos lados con una substancia magnética similar a la de los discos rígidos. El disco flexible por si mismo no tiene una cabeza lectora-escritora, esta se encuentra incluida en la unidad. Un disquete se corresponde a lo que es un solo disco en un disco rígido, pero este es de carácter removible, lo que significa que una misma unidad puede ser utilizada para acceder a diferentes disquetes, a diferencia de los discos rígidos en la que cada unidad es indivisible. Al igual que un disco rígido, un disquete se encuentra dividido en pistas y sectores (y las dos pistas que se corresponden en ambos lados del disquete forman un cilindro), aunque existe mucha menos cantidad de ellas que en un disco rígido. Una unidad de disquetes soporta en general varios tipos diferentes de discos; por ejemplo, una unidad de 3.5 pulgadas puede utilizar discos de 720 Kb y también de 1,44 Mb. Debido a que la unidad tiene para operar un bit que utiliza para distinguir, y el sistema operativo debe conocer que tan grande (en capacidad) es el disco, existen muchos archivos de dispositivos para unidades de disquetes, uno por combinación de unidad y de tipo de disco. Por ejemplo, el archivo /dev/fd0H1440 es la primera unidad de disquetes (fd0), la cual debe ser una unidad de 3.5 pulgadas, utilizando un disco de alta densidad (H) de 3.5 pulgadas de 1440 kB (1440), es decir, un disquete de alta densidad de 3.5 pulgadas normal. Para más información sobre las convenciones de nombres para los dispositivos de disquetes, vea XXX (lista de dispositivos). Los nombres de los archivos de dispositivos para unidades de disquetes son complejos, sin embargo, en Linux existen tipos especiales de dispositivos que pueden detectar automáticamente el tipo de disco flexible que se encuentra en la unidad. Este trabaja intentando leer el primer sector de un disquete recién insertado, utilizando diferentes tipos, hasta que alguno de ellos consiga leer el disquete correctamente. Se requiere que el disquete se encuentre formateado para que este procedimiento funcione. Los archivos de dispositivos automáticos son /dev/fd0, /dev/fd1,..., etc. Los parámetros que los dispositivos automáticos utilizan para acceder a un disco pueden ser establecidos mediante el programa setfdprm. Este comando es útil en aquellos casos en que desees acceder a un disco flexible que no tiene un tamaño de los que normalmente se utilizan, debido a que por ejemplo, contiene un número de sectores inusual. O también, si por alguna razón la auto detección falla y el archivo de dispositivo no se encuentra. Linux puede utilizar muchos formatos de discos flexibles no estándar, que se suman a todos los estándar a los que Linux tiene soporte. Algunos de estos requieren que se utilice programas especiales para darles formato. Omitiremos estos tipos de discos por ahora, pero en el momento en que debas utilizar uno de ellos, puedes examinar el archivo /etc/fdprm. Este especifica los parámetros que setfdprm reconoce. El sistema operativo debe conocer cuando se cambia un disco flexible en la unidad, por ejemplo, para evitar que los datos que están en caché y que pertenecían al disquete que se estuvo utilizando previamente, sigan siendo válidos para el nuevo disquete insertado. Desafortunadamente, la línea serial que se utiliza para esta tarea algunas veces está dañada, y para peor, no siempre notifica cuando se está utilizando una unidad como sucedía con MS-DOS. Si experimentas problemas utilizando disquetes, esta puede ser la razón. La única forma de solucionar este problema es reparando la unidad de disquete. CD-ROM Un dispositivo CD-ROM utiliza un disco cubierto de plástico el cuál se lee de forma óptica. La información se graba sobre la superficie del disco ^[8] en pequeños "surcos" alineados a lo largo de una espiral desde el centro hacia el borde. El dispositivo dirige un rayo láser sobre la espiral para leer el disco. Cuando el láser choca contra un surco, se refleja de una determinada manera; cuando choca contra la superficie lisa lo hace de otra. Esto hace posible codificar bits, y por lo tanto información. El resto es sencillo, es simplemente mecánica. Los dispositivos CD-ROM resultan lentos comparados con los discos duros. Típicamente mientras un disco duro tiene un tiempo medio de búsqueda inferior a 15 milisegundos, un CD-ROM puede tardar décimas de segundo en una búsqueda. La velocidad actual de transferencia de datos es medianamente alta, de unos cientos de kilobytes por segundo. La lentitud significa que los CD-ROM no son tan agradables de usar como los discos duros (algunas distribuciones de Linux proporcionan sistemas "live" en CD-ROM, haciendo innecesario copiar archivos al disco duro, facilitando la instalación y salvando espacio en disco), aunque es todavía posible. Para instalar programas nuevos, los CD-ROM son muy adecuados, ya que una alta velocidad no es esencial durante la instalación. Hay varias maneras de acomodar datos en un CD-ROM. La más popular se encuentra definida en el estándar internacional ISO 9660. Este estándar especifica un sistema de archivos mínimo, que incluso es más tosco que el que usa MS-DOS. Por otro lado, es tan mínimo que cualquier sistema operativo debería ser capaz de mapearlo hacia su sistema nativo. Para un uso normal UNIX no puede utilizar el sistema de archivos ISO 9660, así que se ha desarrollado una extensión del estándar, denominada extensión Rock Ridge. Rock Ridge permite nombres de archivo largos, enlaces simbólicos, y un montón de otros regalos, haciendo que un CD-ROM parezca más o menos como cualquier sistema de archivos UNIX contemporáneo. Mejor aún, un sistema de archivos Rock Ridge todavía es un sistema de archivos ISO 9660 válido, posibilitando su uso también en sistemas no UNIX. Linux soporta tanto ISO 9660 como la extensión Rock Ridge; ambas son reconocidas y utilizadas automáticamente. De todas formas, el sistema de archivos es tan sólo la mitad de la batalla. La mayoría de los CD-ROM contienen datos que requieren un programa especial para acceder a ellos, y la mayoría de estos programas no funcionan en Linux (excepto posiblemente bajo dosemu, el emulador Linux de MS-DOS, o wine, el emulador de Windows). [16] ^[9] También está VMWare, un producto comercial que emula mediante software una máquina x86 completa [17]) ^[10]) . Un dispositivo CD-ROM se accede a través del correspondiente archivo de dispositivo. Hay varias formas de conectar un CD-ROM a un ordenador: vía SCSI, a través de una tarjeta de sonido, o mediante EIDE. Las técnicas hardware necesarias para hacer esto caen fuera del objetivo de este libro, pero el tipo de conexión determina el archivo de dispositivo. Cintas Un dispositivo de cinta utiliza una banda magnética, similar ^[11] a las casetes de música. Una cinta es de tipo serie por naturaleza, lo que significa que para acceder a cualquier parte de ella, primero se deben atravesar todas las partes anteriores. Un disco puede accederse de forma aleatoria, esto es, se puede saltar directamente a cualquier lugar del disco. El acceso serie de las cintas hacen de ellas dispositivos lentos. Por otro lado, las cintas son relativamente baratas de fabricar, ya que no es necesario que sean muy rápidas. Además pueden hacerse bastante largas, y por lo tanto contener una gran cantidad de datos. Esto hace que las cintas sean muy adecuadas para archivar o realizar copias de seguridad, que no requieren altas velocidades, pero se benefician del bajo coste y alta capacidad de almacenamiento. Dar formato Se denomina formatear al proceso de escribir marcas en el medio magnético que se utilizan para delimitar pistas y sectores. Antes de formatear un disco, su superficie magnética es un completo desorden de señales magnéticas. Cuando se le da formato, se trae un cierto orden al caos básicamente dibujando líneas en los lugares donde van las pistas, y donde son divididas para formar sectores. En una descripción en detalle no sería exactamente así, pero esto es irrelevante. Lo importante aquí es que un disco no puede utilizarse a menos que haya sido formateado. La terminología aquí se vuelve un poco confusa: en MS-DOS y MS Windows, la palabra formatear se utiliza para cubrir el proceso de creación de un sistema de archivos (que discutiremos más abajo). Allí, los dos procesos se combinan, especialmente en los discos flexibles. Cuando se necesita realizar la distinción, el formateo real se denomina formateo de bajo nivel, mientras que construir el sistema de archivos se llama formateo de alto nivel. En los círculos UNIX, los dos se llaman formatear y crear un sistema de archivos, y así será como también lo usemos en este libro. Para los discos IDE y algunos SCSI el formateo se realiza en la fábrica y no necesita repetirse; así que la mayoría de la gente no deberá preocuparse por él. De hecho, formatear un disco duro puede hacer que funcione peor, por ejemplo porque necesite ser formateado de una forma especial para que funcione la sustitución automática de sectores defectuosos. Discos que necesitan o pueden ser formateados usualmente requieren un programa especial, ya que, debido a que la interfase para realizar un formateo logico de un disco difiere de un disco a otro. El programa para formatear el disco está usualmente en la controladora de la BIOS o es suministrado por un programa MS-DOS. Ninguno de ellos puede ser usado facilmente dentro de Linux. Durante el formateo uno puede encontrarse puntos defectuosos en el disco, llamados bloques malos o sectores defectuosos. Algunas veces estos son manejados por el propio disco, pero incluso entonces, si aparecen más de ellos, debe hacerse algo para evitar utilizar esas partes del disco. Lo lógico para hacer esto se encuentra dentro del propio sistema de archivos; cómo añadir la información al sistema de archivos se describe más abajo. De forma alternativa. uno puede crear una partición pequeña que cubra exactamente la parte mala del disco; esta opción puede ser una buena idea si la parte mala es muy grande, ya que los sistemas de archivos tienen problemas con zonas defectuosas muy grandes. Los discos flexibles se formatean con fdformat. El archivo de dispositivo de disquete se proporciona como parámetro. Por ejemplo, el comando siguiente formatea un disquete de 3.5 pulgadas y alta densidad en ubicado en la primera unidad lectora-escritora de discos flexibles: $ fdformat /dev/fd0H1440 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done Verifying ... done $ Tenga en cuenta que si desea utilizar el dispositivo auto-detectable (es decir, /dev/fd0), debe primero configurar los parámetros del dispositivo con setfdprm. Para lograr el mismo efecto que antes, debería hacer los siguiente: $ setfdprm /dev/fd0 1440/1440 $ fdformat /dev/fd0 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done Verifying ... done $ Generalmente es más conveniente elegir el archivo de dispositivo que mejor se adapte al tipo del disquete. Tenga en cuenta que es desaconsejable formatear disquetes para contener más información que aquella para la que ha sido diseñado. fdformat también comprobará el disquete, es decir, buscará sectores defectuosos. Intentará recuperar un sector defectuoso varias veces (normalmente se puede oír esto, el ruido del disco cambia drásticamente). Si el disco está solamente defectuoso temporalmente (debido a polvo en la cabeza de lectura/ escritura, algunos errores son falsas alarmas), fdformat no lo indicará, pero un error real abortará el proceso de comprobación. El núcleo imprimirá mensajes por cada error de entrada/salida que encuentre; estos irán a parar a la consola, o si se usa syslog, al archivo /usr/log/messages. fdformat por sí mismo no indicará dónde está el error (tampoco importa mucho, los disquetes son lo suficientemente baratos como para desechar uno defectuoso). $ fdformat /dev/fd0H1440 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB. Formatting ... done Verifying ... read: Unknown error $ El comando badblocks puede utilizarse para buscar bloques defectuosos en cualquier disco o partición (incluidos los disquetes). No formatea el disco, así que puede utilizarse incluso con sistemas de archivos existentes. El ejemplo siguiente comprueba un disquete de 3,5 pulgadas con dos sectores malos. $ badblocks /dev/fd0H1440 1440 718 719 $ La salida de badblocks es el número de los bloques malos que encuentra. La mayoría de sistemas de archivos pueden evitar estos bloques. Mantienen una lista de sectores defectuosos conocidos, que se inicia cuando se crea el sistema de archivos, y se puede modificar más adelante. La búsqueda inicial de bloques malos puede hacerse a través del comando mkfs(que inicia el sistema del archivos), pero más adelante las comprobaciones deben realizarse con badblocks y los nuevos bloques deben añadirse con fsck. Describiremos mkfs y fsck más adelante. Muchos discos modernos automáticamente detectan bloques malos, e intentan arreglarlos utilizando en su lugar un bloque especial reservado en buen estado. Esto es transparente al sistema operativo. Esta característica debe estar documentada en el manual del disco, si es lo bastante curioso para mirar si aparece. Incluso estos discos pueden fallar, si el número de sectores defectuosos crece demasiado, aunque existen posibilidades de que por entonces el disco esté tan estropeado que no pueda utilizarse. Particiones Un disco duro puede dividirse en varias particiones. Cada partición funciona como si fuera un disco duro independiente. La idea es que si sólo se tiene un disco, y se quieren tener, digamos, dos sistemas operativos en él, se pueda dividir el disco en dos particiones. Cada sistema operativo utilizará su propia partición tal y como se desea, y no tocará la otra. De esta forma los dos sistemas operativos pueden coexistir pacíficamente en el mismo disco duro. Sin particiones se tendría que comprar un disco duro para cada sistema operativo. Los disquetes generalmente no se particionan. No hay ninguna razón técnica para ello, pero dado que son tan pequeños, particionarlos sería útil sólo en extrañas ocasiones. Los CD-ROM tampoco se suelen particionar, ya que es más fácil utilizarlos como un disco grande, y raramente existe la necesidad de tener varios sistemas operativos en uno de ellos. El MBR, sectores de arranque y la tabla de particiones La información sobre cómo se particiona un disco se almacena en su primer sector (esto es, el primer sector de la primera pista sobre la primera superficie del disco). Este primer sector es el registro de arranque maestro (MBR) del disco; éste es el sector que la BIOS lee y arranca cuando se enciende la máquina. El registro de arranque maestro integra un pequeño programa que lee la tabla de particiones, comprueba qué partición está activa (es decir, marcada como arrancable), y lee el primer sector de esa partición, el sector de arranque de la partición (el MBR también es un sector de arranque, pero tiene una importancia especial y de ahí su nombre especial). Este sector de arranque contiene otro pequeño programa que lee la primera parte del sistema operativo almacenado en esa partición (asumiendo que es arrancable), y entonces la inicia. El esquema de partición no está integrado en el hardware, ni siquiera en la BIOS. Tan sólo es una convención que muchos sistemas operativos siguen. No todos los sistemas operativos la siguen, pero son las excepciones. Algunos sistemas operativos soportan particiones, pero ocupan una partición en el disco duro, y utilizan su propio sistema de particionamiento dentro de esa partición. El último convive pacíficamente con otros sistemas operativos (incluido Linux), y no requiere de medidas adicionales, pero un sistema operativo que no soporte particiones no puede coexistir en el mismo disco con otro sistema operativo. Como medida de precaución, es buena idea anotar la tabla de particiones en papel, de manera que si alguna vez se corrompe no tenga que perder todos sus archivos. (Una tabla de partición errónea puede corregirse con fdisk). La información relevante la proporciona el comando fdisk: $ fdisk -l /dev/hda Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders Units = cylinders of 855 * 512 bytes Device Boot Begin Start End Blocks Id System /dev/hda1 1 1 24 10231+ 82 Linux swap /dev/hda2 25 25 48 10260 83 Linux native /dev/hda3 49 49 408 153900 83 Linux native /dev/hda4 409 409 790 163305 5 Extended /dev/hda5 409 409 744 143611+ 83 Linux native /dev/hda6 745 745 790 19636+ 83 Linux native $ Particiones extendidas y lógicas El esquema original de particionamiento para discos duros de PC permitía solamente cuatro particiones. Esto rápidamente se volvió demasiado escaso para la vida real, en parte porque algunas personas querían más de cuatro sistemas operativos (Linux, MS-DOS, OS/2, Minix, FreeBSD, NetBSD, o Windows/NT, por nombrar algunos), pero principalmente porque algunas veces es buena idea tener varias particiones para un sistema operativo. Por ejemplo, el espacio swap está generalmente mejor colocado para Linux en su propia partición en lugar de la partición principal por cuestiones de rapidez (vea más abajo). Para superar este problema de diseño, se inventaron las particiones extendidas. Este truco permite particionar una partición primaria en sub-particiones. Esta partición primaria subdividida es la partición extendida; las sub-particiones son las particiones lógicas. Se comportan como particiones primarias, pero se crean de diferente manera. No existen diferencias de rendimiento entre ellas. La estructura de particiones de un disco duro debe parecerse a la que aparece en la Figura 6.2, ?A sample hard disk partitioning.?. El disco se divide en tres particiones primarias, la segunda de las cuales se divide en dos particiones lógicas. Una parte del disco no está particionada. El disco como un todo y cada partición primaria tienen un sector de arranque. Figura 6.2. A sample hard disk partitioning. A sample hard disk partitioning. Tipos de particiones Las tablas de particiones (aquella en el MBR, y las de las particiones extendidas) tienen un byte por partición que identifica el tipo de esa partición. Ésta intenta identificar el sistema operativo que utiliza la partición, o el que suele hacerlo. El propósito es evitar que dos sistemas operativos accidentalmente utilicen la misma partición. De cualquier modo, en realidad, los sistemas operativos no tienen en cuenta el byte de tipo de partición; por ejemplo, Linux no lo toma en consideración en absoluto. Incluso peor, algunos lo utilizan incorrectamente; por ejemplo, al menos una versión de DR-DOS ignora el bit más significativo del byte, mientras que otras no lo hacen. No existe un estándar para especificar lo que significa cada valor del byte, pero algunos comúnmente aceptados se incluyen en la Figura 6.3, ?Tipos de partición (obtenida del programa de Linux fdisk).?. Una lista más exhaustiva está disponible en el programa de Linux fdisk . Figura 6.3. Tipos de partición (obtenida del programa de Linux fdisk). Hex code (type L to list codes): L 0 Empty 1e Hidden W95 FAT1 80 Old Minix 1 FAT12 24 NEC DOS 81 Minix / old Lin 2 XENIX root 39 Plan 9 82 Linux swap / So 3 XENIX usr 3c PartitionMagic 83 Linux 4 FAT16 -32M 40 Venix 80286 84 OS/2 hidden C: 5 Extended 41 PPC PReP Boot 85 Linux extended 6 FAT16 42 SFS 86 NTFS volume set 7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set 8 AIX 4e QNX4.x 2nd part 88 Linux plaintext 9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi f W95 Extd (LBA) 54 OnTrackDM6 a5 FreeBSD 10 OPUS 55 EZ-Drive a6 OpenBSD 11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP 12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS 14 Hidden FAT16 -3 61 SpeedStor a9 NetBSD 16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs 18 AST SmartSleep 65 Novell Netware b8 BSDI swap 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid 1c Hidden W95 FAT3 75 PC/IX Particionando el disco duro Existen muchos programas para crear y eliminar particiones. La mayoría de sistemas operativos tienen el suyo propio, y es buena idea utilizar el propio con cada sistema operativo, por si se diera el caso que haga algo inusual que los otros no puedan hacer. Muchos de estos programas se llaman fdisk, incluido el de Linux, o variaciones de esa palabra. Los detalles de uso del fdisk de Linux se dan en su página de manual. El comando cfdisk es similar a fdisk, pero tiene una interfaz más agradable (a pantalla completa). Cuando se utilizan discos EIDE, la partición de arranque (la partición con los archivos de imagen del núcleo arrancable) debe estar completamente definida en los primeros 1024 cilindros. Esto es así porque el disco se utiliza a través de la BIOS durante el arranque (antes de que el sistema entre en el modo protegido), y la BIOS no puede manejar más de 1024 cilindros. A veces es posible utilizar una partición de arranque que parcialmente se encuentre dentro de los primeros 1024 cilindros. Esto funciona siempre que todos los archivos que lee la BIOS se encuentran en los primeros 1024 cilindros. Como esto es difícil de conseguir, es mala idea intentarlo; nunca se sabe si una actualización del núcleo o una desfragmentación del disco originará un sistema no arrancable. Así que asegúrese que su partición de arranque está completamente colocada dentro de los primeros 1024 cilindros. ^[12] . Algunas versiones modernas de BIOS y discos IDE pueden, de hecho, manejar discos de más de 1024 cilindros, Si tiene uno de esos sistemas, se puede olvidar del problema; si no está seguro, coloque la partición de arranque en los primeros 1024 cilindros. Cada partición debe tener un número par de sectores, puesto que el sistema de archivos Linux utiliza un tamaño de bloque de 1 kilobyte , es decir, dos sectores. Un número impar de sectores provocará que el último no pueda utilizarse. Esto no es ningún problema, pero resulta feo, y algunas versiones de fdisk avisarán de ello. Cambiar el tamaño de una partición requiere que primero se realice una copia de seguridad de todo lo que quiera salvar de esa partición (a ser posible de todo el disco, por si acaso), borrar la partición, crear una nueva, y entonces restaurarlo todo a la nueva partición. Si la partición crece, puede necesitar ajustar los tamaños (y guardar y restaurar) las particiones adjuntadas también. Como cambiar una partición es doloroso, es preferible establecerlas correctamente al principio, o tener un rápido y fácil de utilizar sistema de copia de seguridad. Si está instalando desde un medio que no requiere demasiada intervención humana (digamos, desde un CD-ROM, en contraposición a los disquetes), es generalmente más fácil probar con diferentes configuraciones al principio. Como no tiene todavía datos que guardar, no es tan costoso el modificar particiones varias veces. Existe un programa de MS-DOS, llamado fips, ^[13] que redimensiona una partición MS-DOS sin tener que guardar y restaurar, pero para otros sistemas de archivos es todavía necesario. N.T.: Existe un programa muy útil para Linux llamado ntfs-resize que pertenece al proyecto Linux-ntfs. Puede redimensionar de manera segura y no destructiva particiones de tipo NTFS. Además soporta todas las versiones de NTFS y trabaja aún cuando el sistema de archivos se encuentre fragmentado. (11/05/2005) Archivos de dispositivo y particiones Cada partición y partición extendida posee su propio archivo de dispositivo. El convenio de nombres para estos archivos es que se añade un número de partición detrás del nombre del disco entero, con el convenio de que las particiones primarias van del 1 al 4 (independientemente de cuantas particiones primarias existan) y las particiones lógicas tienen números mayores que 5 (independientemente de la partición primaria en la que residan). Por ejemplo, / dev/hda1 es la primera partición primaria del primer disco duro IDE, y /dev/ sdb7 es la tercera partición extendida en el segundo disco duro SCSI. Sistemas de archivos ¿Qué son los sistemas de archivos? Un sistema de archivos son los métodos y estructuras de datos que un sistema operativo utiliza para seguir la pista de los archivos de un disco o partición; es decir, es la manera en la que se organizan los archivos en el disco. El término también es utilizado para referirse a una partición o disco que se está utilizando para almacenamiento, o el tipo del sistema de archivos que utiliza. Así uno puede decir ?tengo dos sistemas de archivo? refiriéndose a que tiene dos particiones en las que almacenar archivos, o que uno utiliza el sistema de ?archivos extendido?, refiriéndose al tipo del sistema de archivos. La diferencia entre un disco o partición y el sistema de archivos que contiene es importante. Unos pocos programas (incluyendo, razonablemente, aquellos que crean sistemas de archivos) trabajan directamente en los sectores crudos del disco o partición; si hay un archivo de sistema existente allí será destruido o corrompido severamente. La mayoría de programas trabajan sobre un sistema de archivos, y por lo tanto no utilizarán una partición que no contenga uno (o que contenga uno del tipo equivocado). Antes de que una partición o disco sea utilizada como un sistema de archivos, necesita ser iniciada, y las estructura de datos necesitan escribirse al disco. Este proceso se denomina construir un sistema de archivos. La mayoría de los sistema de archivos UNIX tienen una estructura general parecida, aunque los detalles exactos pueden variar un poco. Los conceptos centrales son superbloque, nodo-i, bloque de datos, bloque de directorio, y bloque de indirección. El superbloque tiene información del sistema de archivos en conjunto, como su tamaño (la información precisa aquí depende del sistema de archivos). Un nodo-i tiene toda la información de un archivo, salvo su nombre. El nombre se almacena en el directorio, junto con el número de nodo-i. Una entrada de directorio consiste en un nombre de archivo y el número de nodo-i que representa al archivo. El nodo-i contiene los números de varios bloques de datos, que se utilizan para almacenar los datos en el archivo. Sólo hay espacio para unos pocos números de bloques de datos en el nodo-i; en cualquier caso, si se necesitan más, más espacio para punteros a los bloques de datos son colocados de forma dinámica. Estos bloques colocados dinámicamente son bloques indirectos; el nombre indica que para encontrar el bloque de datos, primero hay que encontrar su número en un bloque indirecto. Los sistemas de archivos UNIX generalmente nos permiten crear un agujero en un archivo (esto se realiza con la llamada al sistema lseek(); compruebe su página de manual), lo que significa que el sistema de archivos simplemente intenta que en un lugar determinado en el archivo haya justamente cero bytes, pero no existan sectores del disco reservados para ese lugar en el archivo (esto significa que el archivo utilizará un poco menos de espacio en disco). Esto ocurre frecuentemente en especial para pequeños binarios, librerías compartidas de Linux, algunas bases de datos, y algunos pocos casos especiales. (los agujeros se implementan almacenando un valor especial en la dirección del bloque de datos en el bloque indirecto o en el nodo-i. Esta dirección especial indica que ningún bloque de datos está localizado para esa parte del archivo, y por lo tanto, existe un agujero en el archivo). Sistemas de archivos soportados por Linux Linux soporta una gran cantidad de tipos diferentes de sistemas de archivos. Para nuestros propósitos los más importantes son: minix El más antiguo y supuestamente el más fiable, pero muy limitado en características (algunas marcas de tiempo se pierden, 30 caracteres de longitud máxima para los nombres de los archivos) y restringido en capacidad (como mucho 64 MB de tamaño por sistema de archivos). xia Una versión modificada del sistema de archivos minix que eleva los límites de nombres de archivos y tamaño del sistema de archivos, pero por otro lado no introduce características nuevas. No es muy popular, pero se ha verificado que funciona muy bien. ext3 El sistema de archivos ext3 posee todas las propiedades del sistema de archivos ext2. La diferencia es que se ha añadido una bitácora (journaling). Esto mejora el rendimiento y el tiempo de recuperación en el caso de una caída del sistema. Se ha vuelto más popular que el ext2. ext2 El más sistema de archivos nativo Linux que posee la mayor cantidad de características. Está diseñado para ser compatible con diseños futuros, así que las nuevas versiones del código del sistema de archivos no necesitará rehacer los sistemas de archivos existentes. ext Una versión antigua de ext2 que no es compatible en el futuro. Casi nunca se utiliza en instalaciones nuevas, y la mayoría de la gente que lo utilizaba han migrado sus sistemas de archivos al tipo ext2. reiserfs Un sistema de archivos más robusto. Se utiliza una bitácora que provoca que la pérdida de datos sea menos frecuente. La bitácora es un mecanismo que lleva un registro por cada transacción que se va a realizar, o que ha sido realizada. Esto permite al sistema de archivos reconstruirse por sí sólo fácilmente tras un daño ocasionado, por ejemplo, por cierres del sistema inadecuados. Adicionalmente, existe soporte para sistemas de archivos adicionales ajenos, para facilitar el intercambio de archivos con otros sistemas operativos. Estos sistemas de archivos ajenos funcionan exactamente como los propios, excepto que pueden carecer de características usuales UNIX , o tienen curiosas limitaciones, u otros inconvenientes. msdos Compatibilidad con el sistema de archivos FAT de MS-DOS (y OS/2 y Windows NT). umsdos Extiende el dispositivo de sistema de archivos msdos en Linux para obtener nombres de archivo largos, propietarios, permisos, enlaces, y archivos de dispositivo. Esto permite que un sistema de archivos msdos normal pueda utilizarse como si fuera de Linux, eliminando por tanto la necesidad de una partición independiente para Linux. vfat Esta es una extensión del sistema de archivos FAT conocida como FAT32. Soporta tamaños de discos mayores que FAT. La mayoría de discos con MS Windows son vfat. iso9660 El sistema de archivos estándar del CD-ROM; la extensión popular Rock Ridge del estándar del CD-ROM que permite nombres de archivo más largos se soporta de forma automática. nfs Un sistema de archivos de red que permite compartir un sistema de archivos entre varios ordenadores para permitir fácil acceso a los archivos de todos ellos. smbfs Un sistema de archivos que permite compartir un sistema de archivos con un ordenador MS Windows. Es compatible con los protocolos para compartir archivos de Windows. hpfs El sistema de archivos de OS/2. sysv EL sistema de archivos de Xenix, Coherent y SystemV/386.. La elección del sistema de archivos a utilizar depende de la situación. Si la compatibilidad o alguna otra razón hace necesario uno de los sistemas de archivos no nativos, entonces hay que utilizar ése. Si se puede elegir libremente, entonces lo más inteligente sería utilizar ext3, puesto que tiene todas las características de ext2, y es un sistema de archivos con bitácora. Existe también el sistema de archivos proc, generalmente accesible desde el directorio /proc, que en realidad no es un sistema de archivos, aún cuando lo parece. El sistema de archivos proc facilita acceder a ciertas estructura de datos del núcleo, como la lista de procesos (de ahí el nombre). Hace que estas estructuras de datos parezcan un sistema de archivos, y que el sistema de archivos pueda ser manipulado con las herramientas de archivos habituales. Por ejemplo, para obtener una lista de todos los procesos se puede utilizar el comando $ ls -l /proc total 0 dr-xr-xr-x 4 root root 0 Jan 31 20:37 1 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95 dr-xr-xr-x 4 root users 0 Jan 31 20:37 98 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99 -r--r--r-- 1 root root 0 Jan 31 20:37 devices -r--r--r-- 1 root root 0 Jan 31 20:37 dma -r--r--r-- 1 root root 0 Jan 31 20:37 filesystems -r--r--r-- 1 root root 0 Jan 31 20:37 interrupts -r-------- 1 root root 8654848 Jan 31 20:37 kcore -r--r--r-- 1 root root 0 Jan 31 11:50 kmsg -r--r--r-- 1 root root 0 Jan 31 20:37 ksyms -r--r--r-- 1 root root 0 Jan 31 11:51 loadavg -r--r--r-- 1 root root 0 Jan 31 20:37 meminfo -r--r--r-- 1 root root 0 Jan 31 20:37 modules dr-xr-xr-x 2 root root 0 Jan 31 20:37 net dr-xr-xr-x 4 root root 0 Jan 31 20:37 self -r--r--r-- 1 root root 0 Jan 31 20:37 stat -r--r--r-- 1 root root 0 Jan 31 20:37 uptime -r--r--r-- 1 root root 0 Jan 31 20:37 version $ (Puede haber no obstante algunos archivos adicionales que no correspondan con ningún proceso. El ejemplo anterior se ha recortado.) Tenga en cuenta que aunque se llame sistema de archivos, ninguna parte del sistema de archivos proc toca el disco. Existe tan sólo en la imaginación del núcleo. Cuando alguien intenta echar un vistazo a alguna parte del sistema de archivos proc, el núcleo hace que parezca como si esa parte existiera en alguna parte, aunque no lo haga. Así, aunque exista un archivo /proc/kcore de muchos megabytes, no quita espacio del disco. ¿Qué sistemas de archivos deben utilizarse? Existe generalmente poca ventaja en utilizar muchos sistemas de archivos distintos. Actualmente, el más popular sistema de archivos es ext3, debido a que es un sistema de archivos con bitácora. Hoy en día es la opción más inteligente. Reiserfs es otra elección popular porque también posee bitácora. Dependiendo de la sobrecarga del listado de estructuras, velocidad, fiabilidad (percibible), compatibilidad, y otras varias razones, puede ser aconsejable utilizar otro sistema de archivos. Estas necesidades deben decidirse en base a cada caso. Un sistema de archivos que utiliza bitácora se denomina sistema de archivos con bitácora. Un sistema de archivos con bitácora mantiene un diario, la bitácora, de lo que ha ocurrido en el sistema de archivos. Cuando sobreviene una caída del sistema, o su hijo de dos años pulsa el botón de apagado como el mío adora hacer, un sistema de archivos con bitácora se diseña para utilizar los diarios del sistema de archivos para recuperar datos perdidos o no guardados. Esto reduce la pérdida de datos y se convertirá en una característica estándar en los sistemas de archivos de Linux. De cualquier modo, no extraiga una falsa sensación de seguridad de esto