Índice 1.- INTRODUCCIÓN A LINUX. 3 1.1.- INTRODUCCIÓN. 1.2.- DEFINICIÓN DE UN SISTEMA OPERATIVO Y SU ESTRUCTURA. 1.3.- CARACTERÍSTICAS PRINCIPALES DE LINUX. 1.3.1.- CARACTERÍSTICAS. 1.3.2.-DISTRIBUCIONES 3 6 9 9 11 2.- INSTALACIÓN DEL LINUX. 13 2.1.- PARTICIONES DE DISCO Y FORMATO. 2.2.- DESCRIBIENDO LA ARQUITECTURA DEL DISCO. 2.2.1.- GEOMETRÍA FÍSICA DEL DISCO. 2.2.2.- SISTEMAS DE ARCHIVO. 2.3.- CLASES DE INSTALACIÓN DEL LINUX. 2.4.- INSTALACIÓN DEL LINUX. 13 19 19 22 28 31 3.- LINUX BÁSICO 45 3.1- NAVEGANDO POR EL SISTEMA DE ARCHIVOS. 3.1.1- LA ESTRUCTURA DE ARCHIVOS DE LINUX. 3.1.2- COMANDOS BÁSICOS. 3.2- COMANDOS PARA ARCHIVOS. 3.2.1.- DESPLEGANDO ARCHIVOS. 3.2.2.- MANEJO DE ARCHIVOS. 3.3.- SEGURIDAD EN LOS ARCHIVOS. 3.3.1.- PERMISOS. 3.3.2.- MODIFICANDO LOS PERMISOS. 3.4.- PERMISOS ADICIONALES PARA ARCHIVOS. 3.4.1.- PERMISOS POR DEFAULT. 3.4.2.- ENLACES. 3.4.3.- CONTROL DE LA MODIFICACIÓN DE ARCHIVOS. 3.5.- METACARACTERES Y REDIRECCIÓN. 3.5.1.- METACARACTERES. 3.6.- EL EDITOR VI. 3.6.1.- INTRODUCCIÓN AL EDITOR. 3.6.2.- COMANDOS DE EDICIÓN. 3.7.- INTRODUCCIÓN AL AMBIENTE GRÁFICO DE LINUX. 3.7.1.- INICIANDO EL AMBIENTE GRÁFICO DE LINUX. 3.7.2.- CONFIGURACIÓN DEL AMBIENTE GRÁFICO DE LINUX. 45 45 50 58 58 62 65 65 68 69 69 69 71 72 72 78 78 79 88 88 88 4.- ADMINISTRACIÓN DEL SISTEMA. 102 4.1.- CUENTAS PARA USUARIOS EN EL SISTEMA. 4.1.1.- CUENTAS DE USUARIO. 4.1.2.- PROCEDIMIENTOS DE ACCESO. 4.1.3.- CREANDO CUENTAS PARA USUARIO MANUALMENTE. 4.2.- PERSONALIZANDO EL ENTORNO. 4.2.1.- EL SHELL COMO UN LENGUAJE DE PROGRAMACIÓN. 107 107 107 107 110 110 José Luis Elvira Valenzuela, ITESO-DESI 1999 1 4.2.2.- LOS SCRIPTS DE INICIALIZACIÓN. 4.3.- CONTROL DE PROCESOS. 4.3.1.- PROCESOS EN EL SISTEMA. 4.3.2.- CORRIENDO COMANDOS EN TIEMPOS ESPECIFICADOS. 4.3.3.- PLANIFICACIÓN DE LA PRIORIDAD DE LOS PROCESOS. 4.4.- UTILERÍAS. 4.4.1.- ENCONTRANDO ARCHIVOS Y TEXTO. 4.4.2.- RESPALDANDO ARCHIVOS. 4.5.- SOFTWARE DE ADMINISTRACIÓN DE PAQUETES. 4.5.1.- INSTALACIÓN DE PAQUETES. 116 118 118 124 129 130 130 130 137 137 5.- LINUX AVANZADO. 147 5.1- EL PROCESO DE ARRANQUE. 5.1.1.- EL PROCESO DE ARRANQUE, INIT. 5.1.2.-CORRIENDO PROGRAMAS DURANTE EL PROCESO DE ARRANQUE. 5.1.3.- DANDO DE BAJA EL SISTEMA. 5.2.- CAMBIANDO NIVELES DE ARRANQUE. 5.2.1.- INTRODUCCIÓN A LOS NIVELES DE ARRANQUE. 5.2.2.- CAMBIANDO LOS NIVELES DE ARRANQUE. 5.3.- EL SISTEMA DE ARCHIVOS DE LINUX 5.3.1.- INTRODUCCIÓN AL SISTEMA DE ARCHIVOS. 5.3.2.- LA ESTRUCTURA DE ARCHIVOS DE LINUX. 5.4.- MONTANDO SISTEMAS DE ARCHIVOS. 5.4.1.- MONTANDO SISTEMAS DE ARCHIVOS. 5.4.2.- SISTEMAS DE ARCHIVOS REMOTOS. 5.5.- MANTENIMIENTO DE SISTEMAS DE ARCHIVOS. 5.5.1.- UTILERÍAS. 147 147 147 148 148 148 149 149 149 149 150 150 152 153 153 José Luis Elvira Valenzuela, ITESO-DESI 1999 2 1.- Introducción a Linux. 1.1.- Introducción. Linux es probablemente el acontecimiento mas importante del software gratuito desde el original Space War, o, mas recientemente, Emacs. Se ha convertido en el sistema operativo para los negocios, educación, y provecho personal. Linux ya no es solo para gurus de UNIX que se sientan durante horas frente a la resplandeciente consola (aunque le aseguramos que un gran numero de usuarios pertenece a esta categoría). Este libro le ayudara a sacarle el máximo partido. Linux es un clónico del sistema operativo UNIX que corre en computadoras Intel 80386 y posteriores. Soporta un amplio rango de software, desde TEX a X Windows al compilador GNU C/C++ a TCP/IP. Es una implementación de UNIX versátil, distribuida gratuitamente en los términos de la Licencia GNU. Linux puede convertir cualquier PC en una estación de trabajo. Le pondrá todo el poder de UNIX en la punta de sus dedos. En los negocios ya se instala Linux en redes enteras, usando el sistema operativo para manejar registros financieros y de hospitales, un entorno de usuario distribuido, telecomunicaciones, etc. Universidades de todo el mundo usan Linux para dar cursos de programación y diseño de sistemas operativos. Y, por supuesto, entusiastas de los computadoras de todo el mundo están usando Linux en casa, para programar, entretenerse, y conocerlo a fondo. Lo que hace a Linux tan diferente es que es una implementación gratuita de UNIX. Fue y aun es desarrollado por un grupo de voluntarios, principalmente en Internet, intercambiando código, comentando fallos, y arreglando los problemas en un entorno abierto. Cualquiera es bienvenido a sumarse al esfuerzo de desarrollo de Linux: todo lo que se pide es interés en producir un clónico gratuito de UNIX y algunos conocimientos de programación. El libro que tiene en sus manos es su guía de viaje. Breve historia de Linux UNIX es uno de los sistemas operativos mas populares del mundo debido a su extenso soporte y distribución. Originalmente fue desarrollado como sistema multitarea con tiempo compartido para mini computadoras y mainframes a mediados de los 70, y desde entonces se ha convertido en uno de los sistemas mas utilizados a pesar de su, ocasionalmente, confusa interfaz con el usuario y el problema de su estándarización. >Cual es la verdadera razón de la popularidad de UNIX? Muchos hackers consideran que UNIX es el autentico y único sistema operativo. El desarrollo de Linux parte de José Luis Elvira Valenzuela, ITESO-DESI 1999 3 un grupo en expansión de hackers de UNIX que quisieron hacer su sistema con sus propias manos. Existen numerosas versiones de UNIX para muchos sistemas, desde computadoras personales hasta supercomputadoras como el Cray Y-MP. La mayoría de las versiones de UNIX para computadoras personales son muy caras. Cuando se escribía este libro, una copia para una maquina 386 del UNIX System V de AT&T costaba unos 1500 dólares estadounidenses. Linux es una versión de UNIX de libre distribución, inicialmente desarrollada por Linus Torvalds en la Universidad de Helsinki, en Finlandia. Fue desarrollado con la ayuda de muchos programadores y expertos de UNIX a lo largo y ancho del mundo, gracias a la presencia de Internet. Cualquier habitante del planeta puede acceder a Linux y desarrollar nuevos módulos o cambiarlo a su antojo. El núcleo de Linux no utiliza ni una sola linea del código de AT&T o de cualquier otra fuente de propiedad comercial, y buena parte del software para Linux se desarrolla bajo las reglas del proyecto de GNU de la Free Software Foundation, Cambridge, Massachusetts. Inicialmente, solo fue un proyecto de aficionado de Linus Torvalds. Se inspiraba en Minix, un pequeño UNIX desarrollado por Andy Tanenbaum, y las primeras discusiones sobre Linux surgieron en el grupo de News comp.os.minix. Estas discusiones giraban en torno al desarrollo de un pequeño sistema UNIX de carácter académico dirigido a aquellos usuarios de Minix que querían algo mas. El desarrollo inicial de Linux ya aprovechaba las características de conmutación de tareas en modo protegido del 386, y se escribió todo en ensamblador. Linus dice, "Comencé a utilizar el C tras escribir algunos drivers, y ciertamente se acelero el desarrollo. En este punto sentí que mi idea de hacer un Minix mejor que Minix' se hacia mas seria. Esperaba que algún día pudiese recompilar el gcc bajo Linux. . . "Dos meses de trabajo, hasta que tuve un driver de discos (con numerosos bugs, pero que parecía funcionar en mi PC) y un pequeño sistema de archivos. Aquí tenia ya la versión 0.01 [al final de Agosto de 1991]: no era muy agradable de usar sin el driver de diskettes, y no hacia gran cosa. No pense que alguien compilaría esa versión." No se anuncio nada sobre esa versión, puesto que las fuentes del 0.01 jamas fueron ejecutables: contenían solo rudimentos de lo que seria el nucleo , y se asumía que se tenia acceso a un Minix para poderlo compilar y jugar con el. El 5 de Octubre de 1991, Linus anuncio la primera versión "oficial" de Linux, la 0.02. Ya podía ejecutar bash (el shell de GNU) y gcc (el compilador de C de GNU), pero no José Luis Elvira Valenzuela, ITESO-DESI 1999 4 hacia mucho mas. La intención era ser un juguete para hackers. No había nada sobre soporte a usuarios, distribuciones, documentación ni nada parecido. Hoy, la comunidad de Linux aun trata estos asuntos de forma secundaria. Lo primero sigue siendo el desarrollo del kernel. Linus escribía en comp.os.minix, ">Suspiras al recordar aquellos días de Minix-1.1, cuando los hombres eran hombres y escribían sus propios drivers?” “>Te sientes sin ningún proyecto interesante y te gustaría tener un verdadero S.O. que pudieras modificar a placer?” “>Te resulta frustraste el tener solo a Minix?” Entonces, este articulo es para ustedes. "Como dije hace un mes, estoy trabajando en una versión gratuita de algo parecido a Minix para computadoras At-386. He alcanzado la etapa en la que puede ser utilizable y voy a poner las fuentes para su distribución. Es solo la versión 0.02. . . pero he conseguido ejecutar en el bash, gcc, gnu-make, gnu-sed, compress, etc. Tras la versión 0.03, Linus salto a la versión 0.10, al tiempo que mas gente empezaba a participar en su desarrollo. Tras numerosas revisiones, se alcanzo la versión 0.95, reflejando la esperanza de tener lista muy pronto una versión "oficial". (Generalmente, la versión 1.0 de los programas se corresponden con la primera teóricamente completa y sin errores). Esto sucedía en Marzo de 1992. Año y medio después, en Diciembre del 93, el núcleo estaba en la revisión 0.99.pl14, en una aproximación asintótica al 1.0. Actualmente, el núcleo se encuentra en la versión 1.1 parche 52, y se acerca la 1.2. Hoy Linux es ya un clónico de UNIX completo, capaz de ejecutar X Windows, TCP/IP, Emacs, UUCP y software de correo y News. Mucho software de libre distribución ha sido ya portado a Linux, y están empezando a aparecer aplicaciones comerciales. El hardware soportado es mucho mayor que en las primeras versiones del núcleo. Mucha gente ha ejecutado tests de rendimiento en sus sistemas Linux 486 y se han encontrado que son comparables a las estaciones de trabajo de gama media de Sun Microsystems y Digital. >Quien iba a imaginar que este "pequeño" clonico de UNIX iba a convertirse en un estándar mundial para las computadoras personales? José Luis Elvira Valenzuela, ITESO-DESI 1999 5 1.2.- Definición de un sistema operativo y su estructura. Sistema de computación, consta de : Hardware. Software. Programas de aplicación. Arquitectura de una computadora : Atributos de un sistema que son visibles a un programador. Conjunto de instrucciones. Organización de la memoria. Entrada y salida. Estructura del bus. Funciones básicas de una computadora : Procesamiento de datos. Almacenamiento de datos. Transferencias de datos. Control. Sistema operativo : Controla todos los recursos de la computadora y ofrece la base sobre la cual pueden escribirse los programas de aplicación. El sistema operativo como una máquina ampliada : 1. Es el programa que oculta la verdad del hardware al programador. 2. Disimula mucho el trabajo displicente concerniente a interrupciones, relojes o cronómetros, manejo de la memoria y otras características de bajo nivel. 3. La abstracción que se presenta al usuario del sistema operativo es más simple y sencilla de utilizar que el hardware implícito. Una función del sistema operativo es : presentar al usuario una máquina ampliada o una máquina virtual que sea más fácil de programar que el hardware implícito. José Luis Elvira Valenzuela, ITESO-DESI 1999 6 El sistema operativo como un manejador de recursos: El trabajo del sistema operativo consiste en ofrecer una distribución ordenada y controlada de los procesadores, memorias y dispositivos de E/S entre los diversos programas que compiten por ellos. Componentes principales de un Sistema Operativo : El manejo del proceso. Entrada y salida. Manejo de la memoria. Sistema de archivo. Historia de los sistemas operativos. Primera generación (1945-1955) : tubos de vacío y tableros enchufables. Se desconocían los lenguajes de programación. Los sistemas operativos eran extraños. Segunda generación (1955-1965) : transistores y sistemas de lote. Tercera generación (1965-1980) : circuitos integrados y multiprogramación. Popularizaron varias técnicas importantes ausentes en los sistemas operativos de la segunda generación. La más importante, la multiprogramación. Técnica de manejo por cola de impresión : la capacidad de leer trabajos de tarjetas contenidas en el disco tan pronto se llevaban al cuarto de computación. Siempre que se terminaba el trabajo, el sistema operativo podía cargar uno nuevo del disco en la partición no vacía y ejecutarlo. Sistema de tiempo compartido : variante de la multiprogramación, cada usuario tiene una terminal en línea, si hay 20 usuarios en el sistema y 17 están pensando, trabajando o tomando café, la CPU puede distribuirse en turno para los 3 trabajos que necesitan servicio. Cuarta generación (1980-....) : computadoras personales. Sistemas operativos en red : los usuarios tienen conocimiento de la existencia de múltiples computadoras y pueden ingresar en máquinas remotas y reproducir archivos de una máquina a la otra. José Luis Elvira Valenzuela, ITESO-DESI 1999 7 Sistema operativo distribuido : se presenta ante sus usuarios como un sistema uniprocesador tradicional, aunque en realidad esté compuesto de múltiples procesadores. Sistema distribuido real : los usuarios no tienen conocimiento de donde están ejecutando sus programas o donde están ubicados sus archivos. Estructura de un sistema operativo. Sistemas monolíticos. Es la organización más común. Se le llama “El gran lío”, ya que no exhibe una estructura. El sistema operativo se escribe como un conjunto de procedimientos, cada uno de los cuales puede llamar a cualquiera de los otros siempre que los necesite. 1.- El programa de usuario captura el kernel. 2.- El sistema operativo determina el número de servicio que se le pide. 3.- El sistema operativo localiza y llama al procedimiento de servicio. 4.- El control se devuelve al programa de usuario. Esta organización sugiere una estructura básica del sistema operativo : 1.- Un programa central que invoque el procedimiento de servicio solicitado. 2.- Un conjunto de procedimientos de servicios que realice las llamadas al sistema. 3.- Un conjunto de procedimientos de uso general que ayude a los procedimientos de servicio. Sistemas en estratos. Consiste en organizar el sistema operativo como una jerarquía de estratos. Cada estrato está construido arriba del que está debajo de el. Máquinas virtuales. (CMS) sistema con monitor convencional. El corazón del sistema conocido como monitor de la máquina virtual, corre en el hardware y realiza la multiprogramación, ofreciendo no una, sino varias máquinas virtuales para el siguiente estrato hacia arriba. Estas máquinas virtuales no son máquinas extendidas, con archivos y otras características atractivas. Son copias exactas del hardware simple, incluyendo el modo de kernel/usuario, E/S, interrupciones, y todo lo demás que tiene la máquina real. Cada máquina virtual es idéntica al hardware real, cada una puede correr cualquier sistema operativo que correrá directamente en el hardware. José Luis Elvira Valenzuela, ITESO-DESI 1999 8 Modelo del servidor del cliente. 1.3.- Características principales de Linux. 1.3.1.- Características. Características de Linux Multitarea: varios programas (realmente procesos) ejecutándose al mismo tiempo. Multiusuario: varios usuarios en la misma máquina al mismo tiempo (¡y sin licencias para todos!). Multiplataforma: corre en muchas CPUs distintas, no sólo Intel. Funciona en modo protegido 386. Tiene protección de la memoria entre procesos, de manera que uno de ellos no pueda colgar el sistema. Carga de ejecutables por demanda: Linux sólo lee de disco aquellas partes de un programa que están siendo usadas actualmente. Política de copia en escritura para la compartición de páginas entre ejecutables: esto significa que varios procesos pueden usar la misma zona de memoria para ejecutarse. Cuando alguno intenta escribir en esa memoria, la página (4Kb de memoria) se copia a otro lugar. Esta política de copia en escritura tiene dos beneficios: aumenta la velocidad y reduce el uso de memoria. Memoria virtual usando paginación (sin intercambio de procesos completos) a disco: una partición o un archivo en el sistema de archivos, o ambos, con la posibilidad de añadir más áreas de intercambio sobre la marcha (se sigue denominando intercambio, es en realidad un intercambio de páginas). Un total de 16 zonas de intercambio de 128Mb de tamaño máximo pueden ser usadas en un momento dado con un límite teórico de 2Gb para intercambio. La memoria se gestiona como un recurso unificado para los programas de usuario y para el caché de disco, de tal forma que toda la memoria libre puede ser usada para caché y éste puede a su vez ser reducido cuando se ejecuten grandes programas. José Luis Elvira Valenzuela, ITESO-DESI 1999 9 Librerías compartidas de carga dinámica (DLL's) y librerías estáticas también, por supuesto. Se realizan volcados de estado (core dumps) para posibilitar los análisis postmortem, permitiendo el uso de depuradores sobre los programas no sólo en ejecución sino también tras abortar éstos por cualquier motivo. Casi totalmente compatible con POSIX, System V y BSD a nivel fuente. Mediante un módulo de emulación de iBCS2, casi completamente compatible con SCO, SVR3 y SVR4 a nivel binario. Todo el código fuente está disponible, incluyendo el núcleo completo y todos los drivers, las herramientas de desarrollo y todos los programas de usuario; además todo ello se puede distribuir libremente. Hay algunos programas comerciales que están siendo ofrecidos para Linux actualmente sin código fuente, pero todo lo que ha sido gratuito sigue siendo gratuito. Control de tareas POSIX. Pseudo-terminales (pty's). Emulación de 387 en el núcleo, de tal forma que los programas no tengan que hacer su propia emulación matemática. Cualquier máquina que ejecute Linux parecerá dotada de coprocesador matemático. Por supuesto, si tu computadora ya tiene una FPU (unidad de coma flotante), será usada en lugar de la emulación, pudiendo incluso compilar tu propio kernel sin la emulación matemática y conseguir un pequeño ahorro de memoria. Soporte para muchos teclados nacionales o adaptados y es bastante fácil añadir nuevos dinámicamente. Consolas virtuales múltiples: varias sesiones de login a través de la consola entre las que se puede cambiar con las combinaciones adecuadas de teclas (totalmente independiente del hardware de video). Se crean dinámicamente y puedes tener hasta 64. Soporte para varios sistemas de archivo comunes, incluyendo minix-1, Xenix y todos los sistemas de archivo típicos de System V, y tiene un avanzado sistema de archivos propio con una capacidad de hasta 4 Tb y nombres de archivos de hasta 255 caracteres de longitud. José Luis Elvira Valenzuela, ITESO-DESI 1999 10 Acceso transparente a particiones MS-DOS (o a particiones OS/2 FAT) mediante un sistema de archivos especial: no necesitas ningún comando especial para usar la partición MS-DOS, parece un sistema de archivos normal de Unix (excepto por algunas graciosas restricciones en los nombres de archivo, permisos, y esas cosas). Un sistema de archivos especial llamado UMSDOS que permite que Linux sea instalado en un sistema de archivos DOS. Soporte en sólo lectura de HPFS-2 del OS/2 2.1 Sistema de archivos de CD-ROM que lee todos los formatos estándar de CDROM. TCP/IP, incluyendo ftp, telnet, NFS, etc. Appletalk disponible en el actual núcleo de desarrollo. Software cliente y servidor Netware disponible en los núcleos de desarrollo. 1.3.2.-Distribuciones Se llaman “distribuciones” un conjunto de soportes (diskettes, CD-ROM ...) que contengan lo necesario para instalar un programa en una maquina. No existe una distribución oficial de linux. Solo las distribuciones circulan. He aquí las principales : slackware : es la distribución de referencia históricamente. En la medida en que era la única distribución mas o menos correctamente hecha hace unos 2 años. En nuestros días ella tiene una competecia correcta de parte de nuevas distribuciones como RedHat y se puede temer que termine como SLS por sus dificultades para evolucionar. Ademas solo funciona en un arquitectura Intel. Su tamaño es de 113 Mb (comprimida) o sea 89 diskettes. Es todo ELF. Utiliza la libc 5.3.12, el núcleo es el 2.0.0 y el Xfree86 3.2.0. La ultima versión es de Diciembre de 1996. Su sitio oficial es : ftp.cdrom.com Red Hat : es una distribución inicialmente comercial, pero es igualmente disponible vía FTP. Es mucho mas profesional que la Slackware. Ademas es disponible para otros tipos de arquitectura con procesadores " no Intel " (Alpha, Sparc). Versión 4.0 (Colgate). Esta distribución se distingue por su seriedad, la simplicidad de sus instalación y sobre todo su extrema convivialidad. Ademas la puesta al día se hace mediante un sistema de paquetes (los RPM). Sitio oficial : ftp.redhat.com Sitio Web : http://www.redhat.com José Luis Elvira Valenzuela, ITESO-DESI 1999 11 Debian : es la versión de Linux apoyada por la FSF (Free Software Foundacion). Esta basada en programas relativamente antiguos, los autores de esta distribución quieren principalmente una distribución “estable”, lo que interfiere con el desarrollo de nuevas funciones. MCC : Versión 1.2+ . Ultima versión Mayo / Junio 1995 (parece caída en el olvido...) Bogus : Es una distribución estable y muy bien hecha. El único problema con Bogus es que su frecuencia de puesta al día es bastante irregular. Versión 1.0.1 Ultima puesta al día Julio 1994. SLS : Primera gran distribución de Linux, la SLS es ya obsoleta : Versión 1.06. Ultima puesta al día : Noviembre 1994. Mini-Linux : Como su nombre lo indica, se trata de una distribución muy reducida de Linux (demasiado reducida a mi gusto pero bueno) Se puede encontrar en ftp.loria.fr, la versión francesa. Esta compuesta de 5 diskettes y la ultima puesta al día es del 10 Abril 1995 Jurix : Es una distribución creada en Alemania a partir de las ultimas versiones de los programas disponibles. Esta siempre “en la punta del progreso” pero a veces pone problemas a veces puesto que los programas no están completamente debogados. La ultima puesta al día es del 8 Diciembre de 1996. José Luis Elvira Valenzuela, ITESO-DESI 1999 12 2.- Instalación del Linux. 2.1.- Particiones de disco y formato. Conceptos sobre particiones En general, los discos duros se encuentran divididos en particiones, donde cada partición corresponde a un sistema operativo. Por ejemplo, en un disco duro se pueden tener varias particiones una dedicada a, digamos, MS-DOS, otra a OS/2 y otra a Linux. Si se tiene ya otro software instalado en su sistema, puede necesitar cambiar el tamaño de sus particiones con el fin de reservar espacio para Linux. En el espacio reservado se crearan una o mas particiones para almacenar el software de Linux y el espacio de intercambio. A este proceso lo llamamos reparticionar. La mayoría de los sistemas MS-DOS o Windows utilizan una única partición que ocupa todo el disco. Para MS-DOS, esta partición es accedida como C:. Si se tiene mas de una partición, MS-DOS las llamara D:, E:, y así sucesivamente, de modo que cada partición actúa como si fuera un disco duro independiente. En el primer sector del disco esta el registro de arranque maestro junto a la tabla de particiones. El registro de arranque (como su nombre indica) se usa para arrancar el sistema. La tabla de particiones contiene información acerca del lugar y el tamaño de cada partición. Hay tres clases de particiones: primarias, extendidas, y lógicas. De estas, las mas usadas son las primarias. Sin embargo, debido al limite del tamaño de la tabla de particiones, solo pueden tenerse hasta cuatro particiones primarias en un disco. La forma de superar este limite de cuatro particiones es usar particiones extendidas. Una partición extendida no tiene datos ella misma; en su lugar, actúa como "soporte" de particiones lógicas. Por lo tanto, se puede crear una partición extendida que ocupe todo el disco, y dentro crear cualquier numero de particiones lógicas. Sin embargo, solo puede tenerse una partición extendida por disco. Necesidades de reparticionado en Linux Antes de que expliquemos como reparticionar sus discos, necesita tener una idea acerca del espacio que necesita para Linux. En los sistemas UNIX, los archivos se almacenan en un sistema de archivos, que es esencialmente una zona del disco duro (u otro dispositivo, como un CD-ROM o un diskette) formateado para almacenar archivos. Cada sistema de archivos se encuentra asociado con una parte especifica del árbol de directorios; por ejemplo, en José Luis Elvira Valenzuela, ITESO-DESI 1999 13 la mayoría de los sistemas, existe un sistema de archivos para todos los archivos del directorio /usr, otro para /tmp, etc. El sistema de archivos raíz es el principal, que corresponde con el directorio raíz, /. Bajo Linux, cada sistema de archivos ocupa una partición del disco duro. Por ejemplo, si tenemos un sistema de archivos para / y otro para /usr, necesitaremos dos particiones para almacenar ambos sistemas. Antes de instalar Linux, usted necesitara preparar sistemas de archivos para almacenar el software de Linux. Por lo menos tiene que tener un sistema de archivos (el sistema de archivos raíz), y una partición reservada a Linux. La mayoría de los usuarios de Linux optan por almacenar todos sus archivos en el sistema de archivos raíz, pues en la mayor parte de los casos es mas facil de gestionar que tener diferentes sistemas de archivos y particiones. Sin embargo, usted puede crear varios sistemas de archivos para Linux si lo desea por ejemplo, puede que quiera usar sistemas separados para /usr y /home. Aquellos lectores con experiencia en administracion de sistemas UNIX sabrán como usar diferentes sistemas de archivos adecuadamente. >Por que usar mas de un sistema de archivos? Lo mas habitual es por seguridad; si, por alguna razón, uno de sus sistemas de archivos resulta dañado, los otros normalmente no resultaran afectados. Por otro lado, si usted almacena todos sus archivos en el sistema de archivos raíz, y por alguna razón resulta dañado, puede perder todos los archivos de una vez. Sin embargo, esto no es lo habitual; si se hacen copias de seguridad (backups) regularmente, no hay de que preocuparse. Otra razón para utilizar varios sistemas de archivos es repartir el almacenamiento entre varios discos duros. Si usted tiene, digamos, 40 megabytes libres en un disco duro y 50 en otro, se pueden querer crear un sistema de archivos raíz de 40 megabytes en el primer disco y un sistema /usr de 50 megabytes en el otro. Actualmente no es posible que un sistema de archivos abarque varios discos; si su espacio libre de disco esta repartido entre los discos, necesitara utilizar varios sistemas de archivos para aprovecharlos. En resumen, Linux requiere por lo menos una partición, para el sistema de archivos raíz. Si se desea crear varios sistemas de archivos, se necesitara una partición por cada sistema de archivos. Algunas distribuciones de Linux crean particiones y sistemas de archivos de forma automática, de modo que usted no necesita preocuparse demasiado de estos asuntos. José Luis Elvira Valenzuela, ITESO-DESI 1999 14 Otra cuestion a considerar cuando se deciden las particiones es el espacio de intercambio (swap). Si se desea usar espacio de intercambio en Linux, se tienen dos opciones. La primera es usar un archivo de intercambio que existe dentro de uno de los sistemas de archivos de Linux. Se crea el archivo de intercambio para usarlo como RAM virtual una vez instalado el software. La segunda opcion es crear una partición de intercambio, una partición reservada exclusivamente como espacio de swap. La mayoría de la gente usa una partición para el intercambio en lugar de un archivo. Cada archivo o partición de intercambio puede ser de hasta 16 megabytes. Si se desea tener mas de 16 megabytes de swap, se pueden crear varios archivos o particiones de intercambio hasta ocho a la vez. Por ejemplo, si se necesitan 32 megabytes de swap, se pueden crear dos particiones de 16 megabytes. Por lo general, se crearan dos particiones para Linux: una para ser usada como sistema de archivos del directorio raíz, y la otra como espacio de intercambio. Por supuesto, hay otras opciones pero esta es la opción mínima. El espacio de swap no es obligatorio en Linux, pero esta muy recomendado si posee menos de 16 megabytes de memoria física. También necesita conocer el espacio requerido para cada partición. El tamaño de los sistemas de archivos de su sistema Linux depende en gran parte de que software quiera instalar en el y de la distribución de Linux que este utilizando. Afortunadamente, la Documentación de la distribución le dará una idea del espacio requerido. Un sistema pequeño puede utilizar solo 20 megabytes o menos; un sistema grande siempre necesitara 80 a 100 megabytes, o mas. Tenga en cuenta que hay que añadir a esto el espacio extra para los directorios de usuario, expansiones futuras, etc. El tamaño de sus particiones de swap (debe elegirse una para esto) depende de la RAM virtual que necesite. Lo típico es crear una partición de intercambio del doble de espacio de su RAM física; por ejemplo, si tiene 4 megabytes de RAM, una partición de 8 megabytes suele bastar. Por supuesto, esto es solo una idea la cantidad de espacio de swap que requiere dependerá del software que quiera ejecutar. Si usted tiene una gran cantidad de memoria física (digamos, 16 megabytes o mas) puede que al final no necesite espacio de intercambio. Nota importante: Debido a las limitaciones de la BIOS, habitualmente no es posible arrancar desde particiones que empiecen mas allá del cilindro 1023. Así pues, cuando se decida el espacio para Linux, recuerde que no debe usar una partición que sobrepase ese cilindro para el sistema de archivos raíz. Linux puede usar perfectamente particiones con cilindros mas allá del 1023, pero dichas particiones no servirán para arrancar . Decir esto aqui puede parecer prematuro, pero es importante a la hora de planificar el uso del disco en Linux. José Luis Elvira Valenzuela, ITESO-DESI 1999 15 Si se usara una partición para el sistema de archivos raíz mas allá del cilindro 1023, siempre podrá arrancar Linux con un disco boot. Esto no es un inconveniente solo tarda unos segundos mas que si se arrancara desde el disco duro. Reparticionado de los discos En esta sección vamos a describir como cambiar el tamaño de sus particiones actuales (si las hay) para reservar espacio para Linux. Si usted esta instalando Linux en un disco duro "limpio", puede pasar directamente a la Sección 2.3 de mas adelante. La manera habitual de cambiar el tamaño de una partición es borrarla (lo que implica borrar toda la información que contenga) y rehacerla. Antes de reparticionar sus discos, haga un backup. Después de cambiar las particiones, puede proceder a reinstalar el software desde el backup. Sin embargo, podemos encontrar programas para MS-DOS que consiguen cambiar el tamaño de las particiones de forma no destructiva. Uno de estos se conoce como "FIPS", y puede encontrarse en muchos servidores de FTP de Linux. Recuerde también que debido a que se empequeñecen las particiones originales, no se va a poder reinstalar todo el software que se tenia antes. En este caso, hay que borrar el software innecesario para permitir que el resto quepa en las particiones mas pequeñas. El programa utilizado para hacer particiones es fdisk. Cada sistema operativo tiene su propia versión de este programa; por ejemplo, bajo MS-DOS, se activa con el comando FDISK. Debe consultarse la Documentación de los sistemas operativos en uso para obtener información sobre este asunto. Aquí nos referiremos únicamente a MS-DOS con FDISK, pero lo que digamos puede ser fácilmente extrapolado a otros sistemas operativos. Consulte, por favor , la Documentación de sus sistemas operativos actuales antes de proceder a reparticionar sus discos. Esta sección pretende ser solo una visión general del proceso; y hay muchos detalles que no vamos a mencionar. Tenga en cuenta que se puede perder todo el software de su sistema si no se hace correctamente el reparticionado. Un aviso: No modifique o cree particiones para otros sistemas operativos (incluyendo Linux) utilizando FDISK bajo MS-DOS. Solo pueden modificarse particiones de cada sistema operativo con la versión de fdisk correspondiente a ese sistema; por ejemplo, se crearan las particiones para Linux utilizando el programa fdisk que viene con Linux. Mas adelante, en la Sección 2.3.3, describiremos como crear José Luis Elvira Valenzuela, ITESO-DESI 1999 16 particiones de Linux, pero por ahora nos ocuparemos solo de cambiar el tamaño de las actuales. Supongamos que usted tiene un solo disco duro en su sistema, dedicado, por ahora, enteramente a MS-DOS. Esto es, su disco duro contiene una partición MS-DOS, conocida habitualmente como "C:". Puesto que este método de reparticionado destruirá todos los datos de la partición, necesita crear un disco de sistema MS-DOS "arrancable" que contenga lo necesario para ejecutar FDISK y restaurar el software desde el backup cuando se complete el proceso de reparticionado. En muchos casos, se pueden usar para esto los discos de instalación de MS-DOS. Sin embargo, si necesita el disco de sistema, formateelo mediante el comando FORMAT /s A: Copie en ese disco todas las utilidades de MS-DOS necesarias (normalmente, casi todo lo que hay en el directorio \DOS de su disco), así como los programas FORMAT.COM y FDISK.EXE. Ahora se debe poder arrancar desde este diskette, y ejecutar el comando FDISK C: para arrancar FDISK. La utilización de FDISK debería ser autoexplicativa, pero puede consultarse la Documentación de MS-DOS para obtener detalles. Cuando comience el programa FDISK, utilice el menú de opciones para mostrar la tabla de particiones, y anote la información que se le muestre. Es importante guardar copia de su configuración original en caso de que quiera detener la instalación de Linux. Para borrar una partición, seleccione la opcion del menú "Delete an MS-DOS Partition or Logical DOS Drive" (Eliminar partición o unidad lógica DOS). Especifique el tipo de partición que desea borrar (primaria, extendida o lógica) y el numero de la partición. Verifique todos los avisos que se le presenten. Para crear una nueva partición para MS-DOS (mas pequeña), seleccione la opcion de FDISK "1. Crear partición DOS o unidad lógica DOS". Especifique el tipo de partición (primaria, extendida o lógica) y el tamaño (en megabytes). FDISK deberá crear la partición. Después de hacer esto mediante FDISK, debe abandonar el programa y reformatear las nuevas particiones. Por ejemplo, si se cambio el tamaño de la partición C: se tecleara el comando José Luis Elvira Valenzuela, ITESO-DESI 1999 17 FORMAT /s C: Ahora puede reinstalar el software desde el backup. Instalación del software de Linux Después de modificar sus particiones para reservar espacio a Linux, usted esta preparado para instalar el software. A continuación se muestra un resumen del procedimiento a seguir: Arrancar con el dispositivo de arranque de Linux (diskette). Ejecutar fdisk bajo Linux para crear las particiones de Linux. Ejecutar mke2fs y mkswap para crear los sistemas de archivos y el espacio de intercambio. Instalar el software de Linux. Finalmente, instalar el cargador LILO en el disco duro, o crear un disco de arranque con el fin de arrancar su nuevo sistema Linux. Como hemos dicho, uno (o mas) pasos de los anteriores pueden estar automatizados por los programas de instalación, según la distribución que este utilizando. Por favor, consulte la documentación de su distribución para ver las instrucciones especificas. José Luis Elvira Valenzuela, ITESO-DESI 1999 18 2.2.- Describiendo la arquitectura del disco. 2.2.1.- Geometría física del disco. Ya que el disco está constantemente girando y las cabezas de lectura y escritura se mueven como una sola unidad, las búsquedas más eficientes ocurren cuando los bloques que van a ser leidos o escritos están localizados en el mismo cilindro. Los datos almacenados en cada plato son leídos y escritos por una serie de cabezas que flotan sobre las superficies. José Luis Elvira Valenzuela, ITESO-DESI 1999 19 Sector Es la menor unidad en el plato y son de 512 bytes cada uno. Pista Los sectores son secciones de una pista. Los sectores que forman una pista puede ser leídos o escritos por una cabeza durante una sola revolución del disco. Cilindros Las superficies son formateadas como pistas de datos concéntricas, las cuales se completan en una rotación completa del disco por una posición de cabeza dada. La suma de pistas provistas por todas las cabezas en una posición dada es conocida como cilindro. Para calcular el tamaño del disco. (512 bytes) * # sectores por pista * # pistas por cilindro *# cilindros. Particiones del disco. Los discos duros usados pueden ser divididos en particiones. Cada partición es tratada por el sistema operativo como un disco lógico (un dispositivo de disco aparte). Las ventajas de particionar son : Funcionalmente organiza los datos. Permite a los superusuarios desarrollar estrategias para respaldar. Los discos pueden ser divididos en particiones para separar tipos de datos. La razón más común es facilitar la tarea de respaldar. José Luis Elvira Valenzuela, ITESO-DESI 1999 20 La tabla de particiones define los límites de cada partición y el número de cilindros en cada partición. Las particiones son descritas por un desplazamiento (distancia desde el cilindro 0) y un tamaño. Los desplazamientos y tamaños para un disco son definidos por una tabla de particiones. En el diagrama que sigue, el desplazamiento para la partición 0 es 0 cilindros y su tamaño es de 46 cilindros. Por lo tanto, el límite de la partición inicia en el cilindro 0 y termina en el cilindro 45. La partición 1 está en el desplazamiento 46 y su tamaño es 91 cilindros, y así sucesivamente. Por default la partición 2 describe todo el disco. José Luis Elvira Valenzuela, ITESO-DESI 1999 21 2.2.2.- Sistemas de archivo. El sistema de archivo es la parte más visible de un sistema operativo. Desde el punto de vista del usuario, el aspecto más importante de un sistema de archivo es la forma en que él lo concibe. Lo que constituye un archivo. La forma en que los archivos se nominan y protegen. Las operaciones que se permiten con los archivos. Son de importancia considerable para los diseñadores del sistema de archivo y de menor interés para el usuario. Los detalles de si las listas enlazadas o mapas de bits se utilizan para llevar el control del almacenamiento libre. Cuantos sectores hay en un bloque lógico. Directorios : Un directorio suele contener varias captaciones, una por archivo. La manera más simple consiste en que el sistema conserve un solo directorio que contenga todos los archivos de todos los usuarios. José Luis Elvira Valenzuela, ITESO-DESI 1999 22 Un directorio puede tener varias entradas, donde cada una describe un archivo. Las entradas pueden contener cierta información acerca del archivo o bien apuntar a otras estructuras que la tengan. Diseño de un sistema de archivos. A los diseñadores de un sistema de archivo les interesa : Cómo se maneja el espacio en el disco. Cómo se almacenan los archivos. Cómo hacer que todo funcione eficiente y confiablemente. José Luis Elvira Valenzuela, ITESO-DESI 1999 23 Manejo del espacio en el disco. Son posibles dos estrategias para almacenar un archivo de n bytes : Se distribuyen n bytes consecutivos de espacio del disco. El archivo se divide en varios bloques (no necesariamente) contiguos. Los bloques. Casi todos los sistemas de archivo recortan los archivos en bloques de tamaño fijo que no necesitan ser adyacentes. ¿Qué tan grande debe de ser el bloque? Tener una unidad de asignación grande, como un cilindro, significa que todos los archivos, aun uno de 1 byte, se le asigna un cilindro completo. Una unidad de asignación pequeña, quiere decir que cada archivo consta de muchos bloques. La lectura de cada bloque requiere una localización y una demora rotatoria, de modo que un archivo de muchos bloques será lenta. José Luis Elvira Valenzuela, ITESO-DESI 1999 24 ¿Cómo llevar el control de los bloques libres? Se utilizan dos métodos : Lista enlazada de bloques de disco, donde cada bloque contenga tantos números de bloque de disco libres como le quepan. Mapa de bits con n bits. Un disco con n bloques, requiere un mapa de bits con n bits. Los bloques libres suelen ser representados con 1 (unos); los bloques asignados con 0 (ceros), o viceversa. José Luis Elvira Valenzuela, ITESO-DESI 1999 25 Almacenamiento en archivos. Un archivo consta de una sucesión de bloques, el sistema de archivo debe contar con alguna manera de llevar el control de los bloques de cada archivo. La forma más evidente (el almacenamiento consecutivo de los bloques), suele no ser viable por los archivos pueden crecer. Un método que resulta adecuado consiste en almacenar los bloques de un archivo como una lista enlazada. Desventajas : 1.- El número de bytes de datos en un bloque ya no es potencia de dos. 2.- El acceso al azar es costoso, hay que leer todos los bloques anteriores antes de localizar un dato. José Luis Elvira Valenzuela, ITESO-DESI 1999 26 El esquema de asignación que usa MS-DOS. Es la idea de representar un archivo como una lista enlazada conservando los apuntadores en memoria. Con cada disco hay una tabla llamada tabla de asignación de archivos (FAT) Tiene una captación por cada bloque del disco. La captación del directorio de cada archivo da el número de bloque del primero del archivo. Esa ranura en la FAT contiene el número de bloque del siguiente bloque. José Luis Elvira Valenzuela, ITESO-DESI 1999 27 Nodos i (UNIX) Por cada archivo de UNIX hay una tabla pequeña (en el disco) llamada nodo i. Esta contiene información contable y de protección. 2.3.- Clases de instalación del Linux. Red Hat Linux define tres clases diferentes de instalación o tipos de instalación : Esas son : Workstation Server Custom Estas clases nos dan la opción de simplificar el proceso de instalación (con una pérdida en la flexibilidad de la configuración), o retomando la flexibilidad total con un proceso de instalación un poco más complejo. José Luis Elvira Valenzuela, ITESO-DESI 1999 28 Solo la instalación clase “custom” nos permite una flexibilidad total. La instalación clase “workstation” y clase “server” se instalan automáticamente y pasan al proceso de instalación omitiendo ciertos pasos. La clase de instalación “Workstation”. La clase de instalación “workstation” es la más apropiada para aquel que es nuevo en el mundo de linux. Contestando unas cuantas preguntas, se puede tener corriendo el Red Hat Linux en un momento dado. Una instalación clase “workstation” remueve cualquier partición de linux en todos los discos duros instalados ( y usa todo el espacio libre sin particionar) para crear las siguientes particiones : Una partición de 64MB para swap. Una partición de16MB (montada como /boot) en la cual el kernel del linux y los archivos relacionados residen. Una partición de tamaño variable (el tamaño exacto depende del espacio disponible en disco) (montada como /) en la cual todos los demas archivos residen. Este esquema de particiones del disco resulta en la configuración más sencilla del sistema de archivos. Nota : Se necesitarán aproximadamente 600 Mb de espacio libre en disco para hacer una instalación clase “workstation”. Si el sistema actualmente corre Windows, una instalación clase “workstation” automáticamente configura el sistema a un arranque dual usuando LILO. La instalación clase “Server”. Una instalación clase “server” es la más apropiada si se quiere que el sistema funcione como un servidor basado en Linux, y no se quiere tener un trabajo pesado en la configuración del sistema. Una instalación clase server remueve todas las particiones existentes en todos los discos duros instalados, tal que sólo hay que hacer ésta clase de instalación si se está seguro que toda la información que tienen los discos se puede borrar. Cuando la instalación se completa, se encontrarán las siguientes particiones : Una partición de 64 Mb para swap . José Luis Elvira Valenzuela, ITESO-DESI 1999 29 Una partición de 16 Mb (montada como /boot) en la cual se mantienen el kernel de linux y los archivos relacionados. Una partición de 256 Mb (montada como /). Una partición de al menos 512 Mb (montada como /usr). Una partición de al menos 512MB (mountada como /home). Una partición de 256 Mb (montada como /var). Este esquema de particiones del disco resulta en una configuración de sistema de archivos flexible para la mayoría de las tareas de un server. Nota : Se necesitarán aproximadamente 1.6 Gb de espacio libre en disco para hacer una instalación clse “server”. Nota : Una instalación clase server removerá culaquier partición existente de cualquier tipo en todos los discos duros existentes del sistema. Todos los discos serán borrados sin importar que las particiones que tenga sean de Linux o no lo sean. La instalación clase “Custom”. Una instalación clase “custom” pone el énfasis en la flexibilidad durante una instalación. queda a decisión de quien instala como el espacio en disco debe ser particionado. Se tiene control total de los paquetes que serán instalados en el sistema. También se puede determinar cuando se usará el LILO para arrancar el sistema. Para aquellos que ya tengan experiencia previa instalando Red Hat Linux, es el mismo procedimiento que se había usado en versiones anteriores de Red Hat Linux. José Luis Elvira Valenzuela, ITESO-DESI 1999 30 2.4.- Instalación del Linux. Descripción Para instalar Linux primero es conveniente recoger la información sobre el hardware disponible: controlador de disco duro, tarjeta de vídeo dispositivo de CD-ROM. . . Ya que es posible que el proceso de instalación necesite saber determinadas características sobre el sistema en el que se va a instalar. Preparación del PC y componentes Comenzamos una sección dedicada a describir el hardware de la PC según el punto de vista de Linux. Este punto de vista está heredado de la filosofía Unix, en la que todo son archivos, incluidos los dispositivos de hardware. Por lo tanto, Linux virtualiza el acceso a los dispositivos por medio de archivos que suelen estar en el directorio /dev. Discos duros Dentro del PC pueden haber normalmente hasta cuatro discos en total, cada disco duro tiene un nombre en Linux en función de como se haya instalado. Si el disco duro es IDE y está funcionando en el primer canal como maestro se llamará /dev/hda, y si es esclavo /dev/hdb. En caso de que estemos en el segundo canal IDE los nombres correspondientes serán /dev/hdc y /dev/hdd. Es posible confundirse con todo esto y que no se conozca como es el disco duro. En ese caso hay que tener en cuenta que casi todas las computadoras vienen de fábrica con un solo disco duro que siempre es el /dev/hda. Un caso a notar son los lectores de cdrom, los lectores normalmente funcionan conectados como un disco duro más, aunque hay varias excepciones. Por lo que el nombre será igual que si fuese un disco duro, en la mayor parte de los sistemas /dev/hdb. Si tu disco es SCSI entonces el esquema de nombres es parecido, pasando a ser en este caso /dev/sd0, /dev/sd1,. . . José Luis Elvira Valenzuela, ITESO-DESI 1999 31 Unidades de disco flexible Las unidades de disco flexible en Linux se llaman /dev/fd0 y /dev/fd1, correspondiendo cada nombre a las unidades A: y B: en DOS. Actualmente, las computadoras nuevas con una única unidad por lo que sólo podremos utilizar /dev/fd0. Puertos de serie Los dos dispositivos más comunes que se conectan a los puertos de serie suelen ser ratones y módems. En Linux existe dos maneras de nombrar a los puertos serie, en la primera se llama al com1 /dev/cua0 y al com2 /dev/cua1. La segunda manera es /dev/ttyS0 y /dev/ttyS1. Si es posible, se prefiere utilizar la segunda manera porque la primera está llamada a desaparecer. Existe un problema con los puertos serie en el hardware de la PC y que puede provocar problemas desconcertantes. Este problema es independiente del sistema operativo y consiste en que no se puede utilizar a la vez /dev/ttyS0 y /dev/ttyS2, ni tampoco /dev/ttyS1 y /dev/ttyS3 (com1, com3 y com2, com4 en DOS, respectivamente). Por lo general aquellos que tengan un ratón conectado a un puerto de serie lo tendrán en /dev/ttyS0. Si el ratón es tipo PS/2 entonces estará conectado en un dispositivo especial llamado /dev/psaux. Puertos Paralelos El uso más habitual para un puerto paralelo en la PC es el de conexión a la impresora. El primer puerto paralelo, donde se suele conectar la impresora, se llama bajo Linux /dev/lp1. Tabla de dispositivos y sus nombres en Linux Tipo de dispositivo Unidad maestra primer canal IDE Primera partición primaria Segunda partición primaria Tercera partición primaria Cuarta partición primaria Primera partición lógica José Luis Elvira Valenzuela, ITESO-DESI 1999 Nombre en Linux /dev/hda /dev/hda1 /dev/hda2 /dev/hda3 /dev/hda4 /dev/hda5 32 Segunda partición lógica Unidad esclava primer canal IDE Unidad maestra segundo canal IDE Unidad esclava segundo canal IDE Primer disco SCSI Primera partición primaria Segunda partición primaria Segundo disco SCSI Tercer disco SCSI Primera unidad lectora de diskettes (A:) Segunda unidad lectora de diskettes (B:) Primer puerto serie (com1) Segundo puerto serie (com2) Tercer puerto serie (com3) Cuarto puerto serie (com4) Puerto para ratón tipo PS/2 Primer puerto paralelo Segundo puerto paralelo /dev/hda6 /dev/hdb /dev/hdc /dev/hdd /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/fd0 /dev/fd1 /dev/ttyS0 o /dev/cua0 /dev/ttyS1 o /dev/cua1 /dev/ttyS2 o /dev/cua2 /dev/ttyS3 o /dev/cua3 /dev/psaux /dev/lp1 (kernel 2.2.x /dev/lp0) /dev/lp2 (kernel 2.2.x /dev/lp1) Particiones Los discos duros pueden ser divididos en compartimentos independientes entre sí. Estos compartimentos son llamados particiones y es el esquema que seguiremos para repartir el disco duro entre DOS o Windows y Linux. El número de particiones de un disco duro está limitado a cuatro, aunque una partición primaria puede ser subparticionada por el sistema operativo que la use. La información de como está particionado un disco duro es guardada al principio del mismo, y es un estándar que siguen todos los sistemas operativos, además cada partición tiene un número que identifica de que tipo es. Suponiendo que tenemos cuatro particiones primarias en /dev/hda, estas serán denominadas por Linux /dev/hda1, /dev/hda2, /dev/hda3 y /dev/hda4. Las particiones lógicas que crea DOS se denominarán a partir de /dev/hda5 en adelante. Existe un primer sector en el disco duro que no pertenece a ninguna partición llamado MBR 2 y contiene un pequeño programa de inicio que es el primero en ejecutarse. El es el encargado de iniciar el sistema operativo, windows y DOS ponen José Luis Elvira Valenzuela, ITESO-DESI 1999 33 ahí el suyo. Nosotros lo cambiaremos por el de Linux, que se llama LILO 3 , y que nos permitirá escoger el sistema operativo con el que deseamos arrancar. Linux necesita al menos una partición primaria para poder funcionar. Aunque lo mínimo aconsejable es tener dos particiones, una dedicada a Linux para su sistema de archivos y otra de tamaño menor dedicada a la memoria de intercambio denominada swap. La memoria de intercambio nos permite funcionar con más memoria RAM de la que en realidad tenemos, por ejemplo es posible tener 8 Mbytes de RAM y 20 de swap por lo que nuestro sistema parecerá tener en realidad 28 Mbytes. Por supuesto el disco duro es mucho más lento que la RAM, por lo que sigue siendo bueno tener mucha RAM. Linux es capaz de distribuir su sistema de archivos entre varias particiones, esto tiene una clara ventaja, si una partición falla el resto de los datos correspondientes a otras particiones sigue intacto. Aunque una instalación casera y por primera vez será suficiente con tener todo el sistema de archivos en una sola partición. FIPS Para poder crear las particiones de Linux es necesario quitar un trozo a la de DOS/Windows. Esto normalmente significa destruir la partición actual y volver a crear unas nuevas, perdiendo todos los datos que pudiese contener. Sin embargo existe un programa que nos permite reparticionar sin perder los datos, este se llama FIPS, y es una utilidad que suele venir en todas las distribuciones. En el cdrom de Red Hat suele estar en el directorio D:\DOSUTILS. Para utilizar FIPS debemos seguir una serie de pasos: 1. Copiar los datos importantes. Reparticionar un disco es una operación peligrosa en la que podemos perder todos los datos, por ello es recomendable copiar todos los datos importantes antes de hacer nada. De todas formas, aunque no se vaya a instalar Linux ni se vaya a reparticionar el disco duro, copia es conveniente tener siempre una copia de seguridad de los datos importantes, los problemas nunca avisan. 2. Leer la documentación de FIPS. José Luis Elvira Valenzuela, ITESO-DESI 1999 34 Es importante leer la documentación de FIPS, existen muchos aspectos y detalles correspondientes a particularidades del hardware que se deben tener en cuenta. 3. Defragmentar el disco duro. Para poder dividir la partición eficientemente es necesario que todos los datos esten al principio de la misma. Sino es posible que incluso no se pueda hacer. Para defragmentar puedes usar la utilidad defrag. 4. Crear un disco de arranque. Se debe crear un diskette de arranque del sistema operativo y copiar a él los archivos FIPS.EXE, RESTORRB.EXE y ERRORS.TXT. También se debe copiar FDISK.EXE, si estas en DOS seguramente esté en C:\DOS y si estas con Windows en C:\WINDOWS\COMMAND. Para crear un diskette de arranque se puede utilizar la orden FORMAT A: /s 5. Arrancar con el diskette. Inserta el diskette en la unidad A: y enciende la computadora. La computadora deberá ejecutar el sistema operativo contenido en ésta. A continuación inicia FIPS. Este mostrará diversa información y por último te dará la opción de dividir la partición en DOS, ajustando el tamaño con las teclas de los cursores, a la izquierda y la derecha. Un tamaño orientativo para Linux puede ser de unos 800 Mbytes, aunque todo dependerá del tamaño lo que pienses instalar y del espacio libre de tu disco duro. Una vez hayas terminado con FIPS este habrá dividido la partición de DOS/Windows en dos particiones. El espacio de la segunda partición es el que se dedicará a Linux. 6. Borrar la nueva partición. Es necesario borrar la nueva partición creada para dejar su espacio disponible para Linux. Esto lo haremos ejecutando FDISK y seleccionando la opción 3 (Eliminar partición o unidad lógica DOS) y posteriormente seleccionando la opción 1 (Eliminar partición primaria DOS). Cuidado con la partición que se vaya a eliminar, hay que recordar que es la segunda partición. Más adelante, durante la instalación de Linux utilizaremos este espacio disponible para crear las particiones que necesita Linux. José Luis Elvira Valenzuela, ITESO-DESI 1999 35 Proceso de instalación Nuestro objetivo es instalar Linux en una computadora con una configuración típica de fáabrica. Esta es un solo disco duro IDE, con una sola partición primaria dedicada totalmente a Windows o DOS. Una vez terminada la instalación deberemos tener una primera partición dedicada a Windows o DOS, una segunda partición dedicada al espacio de intercambio para Linux y la última para contener todo el sistema de archivos de Linux. Además instalaremos en el MBR del disco duro el LILO de forma que podremos escoger entre los dos sistemas operativos instalados a la hora de arrancar. Iniciando la instalación Para poder instalar Linux se ha de iniciar una versión especial del sistema operativo que contiene el cdrom de la instalación preparada para realizar todo el proceso. Si la computadora es moderna seguramente pueda iniciar el sistema operativo directamente desde el CD-ROM con tan solo dejar el disco en la unidad lectora y reiniciando el ordenador, es posible que se tengan que cambiar algunos parámetros de la BIOS para poder iniciar desde el CDROM. Si no quieres estar cambiando los parámetros no te preocupes, simplemente actúa como si tu computadora no tuviese esta característica. En caso de no tener una computadora ultramoderna inicia la computadora en modo MS-DOS. Si usas Windows no vale con una ventanita con MS-DOS, tienes que salirte de Windows. Una vez que estas en modo MSDOS vete a la unidad de cdrom, y en el directorio /DOSUTILS ejecuta el comando AUTOBOOT con esta orden se iniciará Linux directamente desde el CD-ROM y comenzará la instalación. Si por alguna falla no se puede iniciar la instalación queda la posibilidad de arrancar desde diskette. Para hacerlo introduce un diskette sin errores en la unidad y ve al directorio /DOSUTILS del CD-ROM. Encontraras un programa llamado rawrite.exe si lo ejecutalo de esta forma: C:\DOSUTILS>rawrite -f ..\images\boot.img -d a: Pasos a seguir Una vez comenzada la instalación es cuestión de seguir cada paso que nos indica la computadora. La primera pantalla es una presentación de Red Hat Linux, a continuación veremos que se nos pregunta por el lenguaje que deseamos usar José Luis Elvira Valenzuela, ITESO-DESI 1999 36 durante la presentación. En la siguiente pantalla deberemos indicar cual es el tipo de teclado que estamos usando, buscaremos es, correspondiente al teclado español. Es posible instalar Linux desde diversas fuentes, como puede ser a través de una red, desde un disco duro o un CD-ROM. En este caso la instalación se está haciendo desde un CD-ROM por lo que se deberá seleccionar como fuente de la instalación el CD-ROM. El proceso nos pedirá que insertemos el CD-ROM, cosa que haremos si no estuviese ya insertado. El sistema de paquetes de Red Hat tiene la habilidad de poder actualizar una instalación de una versión anterior respetando en la medida de lo posible la configuración actual del sistema. Como deseamos crear una instalación completamente nueva se seleccionará install. Red Hat nos da tres opciones para escoger los paquetes, que son: Workstation Server Custom Workstation configura una estación de trabajo y Server un servidor. Custom es la opción recomendada en esta guía porque permite seleccionar los paquetes que utilizaremos con Linux. Por lo tanto seleccionamos Custom. La siguiente pregunta nos pedirá que le indiquemos si existe algún dispositivo SCSI en el sistema. Creando las particiones para Linux El siguiente paso en la instalación consiste en particionar el disco, para ello se dan dos opciones. Utilizar fdisk o utilizar Disk Druid. El primero de ellos es más potente pero tambien más arduo de utilizar. Recomendamos utilizar Disk Druid por ser más sencillo. En Disk Druid veremos una pantalla en donde la parte superior está dedicada a información sobre las particiones y la inferior a presentar una serie de opciones. Nos podremos mover entre y seleccionar opciones con el tabulador y las echas. Disk Druid permite modificar particiones y establecer como será el sistema de archivos, sin embargo todos los cambios que se hagan no serán guardados hasta que le seleccionemos OK. Si en cualquier momento descubrimos que hemos cometido un error grave podremos recuperar el estado inicial presionando la opción RESET. Una vez que hayamos seleccionado OK y aceptado los cambios no existe posibilidad de recuperar el estado inicial. José Luis Elvira Valenzuela, ITESO-DESI 1999 37 Si se han seguido las instrucciones de esta guía existirá una primera partición para DOS/Windows y un espacio vacio a continuación. Si este es el caso seleccionaremos la opción Add para añnadir una nueva partición, Disk Druid nos presentará un menú en donde la primera pregunta es cual será el punto de montaje (mount point), como es una partición dedicada por completo a todo el sistema de archivos de Linux habrá que introducir el símbolo "/" que significa el directorio raíz de Linux. En el campo size (tamaño) introduciremos el tamaño que habiamos reservado para Linux menos unos 30 Mbytes que guardaremos para la partición de swap. Por último que seleccionar el tipo de partición, que será Linux Native. Para la partición de intercambio volvemos a pulsar la opción Add, en este caso no introduciremos ningún punto de montaje. El tamaño será lo que queda de disco duro y el tipo será Linux swap. El tamaño de 30 Mbytes para la partición de intercambio es solamente orientativo, dependiendo del uso del sistema y de la memoria RAM que tenga puede que se necesite más o menos, algunas personas dicen que la partición de intercambio debe de ser el doble de la memoria RAM. En cualquier caso no se debe poner más de 128 Mbytes a una partición intercambio porque es lo máximo que admite Linux por partición. Si se necesita más habrá que crear más particiones de intercambio. Es posible que Disk Druid te cree alguna de las particiones como extendidas y no primarias. En este caso recuerda que se llamarán por ejemplo /dev/hda5 o /dev/hda6. Con las dos particiones creadas podemos salir de Disk Druid, seleccionaremos OK y nos preguntará si queremos salvar los cambios. Contestaremos que Sí, si estamos de acuerdo con los cambios realizados. Continuando la instalación después de haber creado las particiones. Una vez creadas las particiones el proceso instalación continuará y nos preguntará cuales serán las particiones de swap. Aceptaremos las que nos indica porque serán las que hayamos introducido con Disk Druid y seleccionaremos que las formatee comprobando defectos ( Check for bad partitions). Veremos una barra que indica el proceso de formateo de la partición de swap. La siguiente pregunta es que particiones formateará, estas particiones serán las que contengan el sistema de archivos de Linux. Nos presentará la unica partición que hemos creado con Disk Druid, aceptaremos todo, incluido que compruebe defectos. A continuación veremos una lista de componentes a instalar, para alguien novato puede presentar un problema porque no sabrá lo que es la mayor a de las cosas. Tranquilidad, los componentes básicos necesarios para el funcionamiento de Linux José Luis Elvira Valenzuela, ITESO-DESI 1999 38 se instalan automáticamente, lo que se puede seleccionar ahora son grupos de programas relaccionados, recomendamos que aquello que no se sepa lo que es que no se instale. Ya habrá tiempo más adelante de instalar y desinstalar cosas. Existe una opción de instarlo todo, es mejor no seleccionarla porque seguramente no tengas suficiente disco duro. Hay otra opción que es seleccionar paquetes individualmente. Si escoges esta última opción podrás seleccionar los paquetes por grupos relaccionados. Una vez escogidos los paquetes el proceso de instalación nos informa que se guardará un informe con el proceso de instalación en /tmp/install.log. Aceptaremos la información sin preocuparnos demasiado. Si todo va bien veremos como se crean los sistema de archivos y a continuación como se empiezan a instalar los paquetes. La pantalla de instalación indicará, entre otras informaciones, el tiempo que ha transcurrido, el tiempo total estimado y el tiempo restante estimado. Una vez instalados todos los paquetes comenzará una configuración básica de Linux. Lo primero que nos preguntará es por el tipo de ratón que utilizamos, elegir el modelo. Si no se sabe con seguridad hay que probar con un Microsoft Compatible, otras opciones comunes suelen ser Mouse Systems o Logitech. Existe una casilla que pregunta si deseamos emular 3 botones, si el ratón sólo tiene dos botones hay que seleccionar la casilla. En Linux el botón central de los ratones es muy utilizado, en los ratones de dos botones la emulación se hace pulsando los botones de la izquierda y de la derecha a la vez. Si el ratón seleccionado no es del tipo PS/2 se nos preguntará por el puerto serie donde está instalado. Normalmente es el /dev/cua0, aunque puede ser otro. La siguiente configuración es la de red, nos preguntará si la deseamos configurar una LAN (Local Area Network, Red de Area Local). Seleccionaremos No, ya que el tema de redes es algo complicado para alguien que empieza con Linux. El proceso de instalación nos preguntará ahora por la zona horaria donde está situado nuestra computadora. La casilla que pregunta Hardware clocl set to GMT la dejaremos sin seleccionar, y buscaremos en la lista siguiente México/Central. Ahora toca decirle a Linux cuales son los servicios que se ejecutarán en el arranque. recomendamos dejarlos todos seleccionados. Configuración de la impresora bajo Linux Si se ha seleccionado los paquetes de impresión de Red Hat, la instalación procederá a configurarla. A la pregunta de si deseamos configurar la impresora José Luis Elvira Valenzuela, ITESO-DESI 1999 39 responderemos que sí. Linux puede utilizar impresoras conectadas a la computadora que estamos utilizando o impresoras remotas en otras computadoras, veremos una pantalla para seleccionar entre estas opciones. Escogeremos una impresora local. Posiblemente la pantalla que veremos a continuación sobre la configuración de la impresora puede resultar algo confusa. En ella se pregunta por el nombre de la impresora (Name of queue) y el directorio donde se guardarán los trabajos de impresión mientras esperan a ser impresos (Spool directory). Aceptaremos los valores propuestos como buenos. Siguiendo la instalación de la impresora se nos preguntará por el dispositivo donde está conectada. Si no se está seguro de la respuesta hay que revisar la descripción del hardware de la PC, bajo el punto de vista de Linux. Normalmente la respuesta es /dev/lp1. La instalación presentará una lista de impresoras, hay que seleccionar la que se tiene o la que más se parezca al modelo. Una vez seleccionado el modelo de impresora, habrá que configurar el tipo de papel y la resolución de la misma. La resolución hay que poner la que sea más conveniente, por ejemplo 300x300. Podemos ver una casilla que pregunta si deseamos que se repare el efecto escalera (Fix stair-stepping of text). El efecto escalera es un problema que se producen con ciertas impresoras preparadas para trabajar con DOS, el efecto consiste en que cada nueva línea que se imprime bajo Linux en una impresora empieza justo debajo de donde terminó la anterior. Saber a priori si la impresora que se va a utilizar producirá el efecto escalera es complicado, la lectura del manual de la impresora puede ayudar, pero la prueba de la verdad no se sabrá hasta que se imprima por primera vez bajo Linux. Selecciona o no la opción según creas conveniente, si se descubre que no está correcto más adelante se podrá volver a cambiar la configuración. Como ayuda podemos indicar que si usas una HP seguramente si sufra el efecto escalera. Una vez configurada la impresora se nos presentará una pantalla de confirmación de la configuración. Si se está conforme con esta configuración pulsa en OK. Establecer el password de root A continuación hay que introducir una clave (password) para el usuario root. Hay que Introducir una clave dos veces, la segunda es de confirmación. Es muy importante no olvidatse de la clave, si lo haces en teoríaa no se podrá recuperar (en la práctica José Luis Elvira Valenzuela, ITESO-DESI 1999 40 existen varios "trucos" :-) ). Más adelante se discutirá sobre lo que es el root, las claves y los usuarios. Es recomendable crear un disco de arranque para situaciones de emergencia en las que no nos sea posible iniciar Linux por métodos “normales". El proceso de instalación nos dará ahora la posibilidad de crear un disco de arranque, es recomendable hacerlo. Post-instalación La instalación preguntará donde se desea poner el LILO, para ponerlo en el MBR seleccionar /dev/hda. No se debe seleccionar /dev/hda1 porque seguramente destruirá el sistema de archivos de Windows/DOS. La última pregunta es si deseamos introducir algún parámetro al LILO en el arranque, deja esta opción en blanco. Y por fín hemos llegado al final, se nos informará que hemos terminado la configuración de Linux, y que esta está completa. La siguiente vez que reiniciemos la computadora arrancara Linux. Usuarios La primera vez que arranque Linux después de la instalación nos mostrará una línea como ésta: localhost login: A esta línea se le denomina comunmente el login de Linux y en ella se pide al usuario sentado delante del terminal que se identifique, lo primero que se introduce en este caso es un nombre de usuario que sea válido en el sistema. La primera vez el único nombre existente en el sistema será root, con lo que estamos obligados a introducir ese nombre. A continuación el sistema mostrará lo siguiente: localhost login: root Password: Con lo que el sistema invita al usuario a que introduzca la clave que tiene asignada el usuario. En caso del root será la que durante la que pidió el proceso de instalación de Linux. Mientras se teclea la clave se puede observar que las pulsaciones no son mostradas en pantalla, esto es para evitar que alguien que esté observando la pantalla pueda ver una clave ajena. José Luis Elvira Valenzuela, ITESO-DESI 1999 41 Una vez ha concluido este proceso estaremos identificados para el sistema operativo. En este momento Linux aceptará ordenes escritas (poco a poco iremos viendo qué órdenes acepta Linux) y responderá en función de quién sea el usuario del terminal. En Linux existe un usuario especial que se distingue de los demás usuarios en los poderes que tiene sobre el sistema. Este usuario es normalmente conocido como root y no tiene ninguna restricción sobre el sistema. Cuando se instala Linux por primera vez la única cuenta que existe en el sistema es la del root, debido al poder de este usuario es peligroso utilizarlo habitualmente para tareas cotidianas que no necesiten los privilegios de root, esta cuenta se debe dejar para las tareas de administración y mantenimiento del sistema. Para el trabajo cotidiano hay que crearse una cuenta personal sin privilegios que nos proteja a nosotros mismos de cometer errores. Con el comando adduser miguel crearemos una cuenta para el usuario miguel, el siguiente paso es establecer la clave que usaría Miguel, esto se hace con passwd miguel. Cuando establezcamos la clave el sistema preguntará cual es la que se quiere poner, habrá que introducir dos veces a ciegas la clave. La sintaxis completa del comando adduser es: # adduser -u uid -g gid -c nombre -d home -s shell cuenta donde: uid es el número de usuario, gid el número de grupo, nombre el nombre del usuario (normalmente, nombre y apellidos), home el directorio principal del usuario, shell el intérprete de comandos y cuenta es el nombre que pondremos como login. El usuario root tiene como uid=0 y gid=0. Para terminar una sesión se deberá escribir la orden exit, con lo que volveremos al login, hay que hacer notar que terminará una sesión no quiere decir apagar la computadora ni que Linux deja de funcionar. Simplemente consiste en que un usuario ha abandonado la terminal y lo deja libre para otro usuario, que puede ser el mismo pero con otro nombre. Ahora que ya está creado el usuario miguel, es posible realizar el proceso de identificación con otro usuario distinto de root. Con lo que ya no es obligatorio trabajar con root. Reinicialización del sistema Una de las característica de Linux es que utiliza la memoria RAM del ordenador para guardar aquellas zonas del disco duro que son utilizadas más frecuentemente. Esta técnica permite acelerar los acceso a archivos, ya que los datos leidos una vez del José Luis Elvira Valenzuela, ITESO-DESI 1999 42 disco duro son tomados directamente de la memoria en las siguientes lecturas. A su vez las escrituras en archivos no son realizadas directamente sino que son guardadas en memoria y se llevan a cabo cuando el sistema esta poco ocupado. Por ello no es recomendable apagar una computadora corriendo Linux sin antes advertir al sistema de alguna forma que se prepare para ser parado. Si se le advierte antes el sistema descargará la información que tenga en memoria salvandola en el disco duro, además mandará una señal de terminación a los procesos que se encuentren ejecutandose en ese momento para que finalicen. Para informar a Linux que se desea parar el sistema y apagar la computadora se utiliza la orden halt, el sistema entonces realizará diversas funciones preparandose para la parada de la máquina. Sólo cuando el sistema indique en la pantalla: The system is halted System halted Se podrá apagar la computadora. Es posible que se desee reiniciar la computadora en lugar de apagarla, entonces la orden shutdown -r now parará el sistema y después reiniciará la computadora. Un atajo a esta orden es pulsar las teclas CRTL-ALT-SUP a la vez, tendrá el mismo efecto. Este es el proceso que se debe seguir siempre para apagar la computadora cuando esté funcionando con Linux. Es posible, sin embargo, que sea imposible apagar Linux adecuadamente, como por ejemplo por un corte de luz en medio de una sesión con Linux. Linux es capaz de resistirlo y comprobará automáticamente la integridad del sistema de archivos la próxima vez que se inicia, pero es posible que se pierdan alguno de los datos que nunca llegaron a escribirse en disco. LILO Una vez instalado Linux este será el sistema operativo que se inicie por defecto. Para escoger otro sistema operativo habrá que escribir el nombre que se le puso a la partición cuando veamos el prompt de LILO y pulsar ENTER. LILO boot: dos Si LILO inicia tan rápido el sistema operativo que tenga por defecto que no da tiempo de escribir nada, o cuando se escribe no aparece nada en pantalla hay que pulsar la José Luis Elvira Valenzuela, ITESO-DESI 1999 43 tecla shift (la tecla de las mayúsculas). En caso de que se haya olvidado que nombre le pusieron a los sistemas operativos instalados se puede pulsar el tabulador y LILO mostrará una lista. Muchas veces la computadora es compartida por varias personas que no quieren saber nada de LILO ni de Linux y lo unico que quieren es que se inicie su sistema operativo sin problemas. Para ello se puede configurar LILO para que inicie un sistema operativo por defecto, esto se hace entrando en el sistema como root y escribiendo la orden : # lilo -D dos -d 50 Con lo que configuramos DOS como sistema operativo por defecto y que cargue este a los 5 segundos de no pulsar ninguna tecla. Suponiendo claro, que se haya definido así el nombre de la partición. Establecer el nombre de la computadora El sistema Linux recientemente instalado tiene como nombre localhost, si se desea personalizar el nombre de la computadora utiliza el comando hostname como root. Si por ejemplo quieres llamar a la computadora sulaco, se puede hacer con el comando : # hostname sulaco Si se ha configurado una red (al instalar Linux), no se tendrá localhost si no el nombre que se le hubiese puesto en la configuración. José Luis Elvira Valenzuela, ITESO-DESI 1999 44 3.- Linux básico 3.1- Navegando por el sistema de archivos. 3.1.1- La estructura de archivos de Linux. Explorando el Sistema de Archivos El sistema de archivos es la colección de archivos y la jerarquía de directorios de su sistema. Primero cambie al directorio raíz (cd /) y ejecute ls -F. Probablemente vera estos directorios: bin, dev, etc, home, install, lib, mnt, proc, root, tmp, user, usr, y var. Echemos un vistazo a cada uno de estos directorios. /bin : /bin es la abreviación de "binaries", o ejecutables. Es donde residen la mayoría de los programas esenciales del sistema. Use la orden "ls -F /bin" para listar los archivos. Podrá ver algunas ordenes que reconocerá, como cp, ls y mv. Estos son los programas para estas ordenes. Cuando usa la orden cp esta ejecutando el programa /bin/cp. Usando ls -F vera que la mayoría (si no todos) los archivos de /bin tienen un asterisco ("*") añadido al final de sus nombres. Esto indica que son archivos ejecutables. /dev : El siguiente es /dev. Echémosle un vistazo de nuevo con ls -F. Los "aexhivos" en /dev son conocidos como controladores de dispositivo (device drivers) son usados para acceder a los dispositivos del sistema y recursos, como discos duros, modems, memoria, etc. Por ejemplo, de la misma forma que puede leer datos de un archivo, puede leerla desde la entrada del ratón leyendo /dev/mouse. Los archivos que comienzan su nombre con fd son controladores de disco flexible. fd0 es la primera unidad de disco flexible, fd1 la segunda. Ahora, alguien astuto se dará cuenta de que hay mas controladores de dispositivo para unidades de disco flexible de los que hemos mencionado. Estos representan tipos específicos de discos. Por ejemplo, fd1H1440 accederá a discos de 3.5" de alta densidad en la unidad de disco 1. Aquí tenemos una lista de algunos de los controladores de dispositivo mas usados. Nótese que incluso aunque puede que no tenga alguno de los dispositivos listados, tendrá entradas en dev de cualquier forma. José Luis Elvira Valenzuela, ITESO-DESI 1999 45 /dev/console : hace referencia a la consola del sistema es decir, al monitor conectado directamente a su sistema. Los dispositivos /dev/ttyS y /dev/cua son usados para acceder a los puertos serie. Por ejemplo, /dev/ttyS0 hace referencia a "COM1" bajo MS-DOS. Los dispositivos /dev/cua son "callout", los cuales son usados en conjunción con un módem. Los nombres de dispositivo que comienzan por hd acceden a discos duros. /dev/hda hace referencia a la totalidad del primer disco duro, mientras que /dev/hda1 hace referencia a la primera partición en /dev/hda. Los nombres de dispositivo que comienzan con sd son dispositivos SCSI. Si tiene un disco duro SCSI, en lugar de acceder a el mediante /dev/hda, deberá acceder a /dev/sda. Las cintas SCSI son accedidas vía dispositivos st y los CD-ROM SCSI vía sr. Los nombres que comienzan por lp acceden a los puertos paralelo. /dev/lp0 hace referencia a "LPT1" en el mundo MS-DOS. /dev/null : es usado como "agujero negro" cualquier dato enviado a este dispositivo desaparece. >Para que puede ser útil esto?. Bien, si desea suprimir la salida por pantalla de una orden, podría enviar la salida a /dev/null. Hablaremos mas sobre esto después. Los nombres que comienzan por /dev/tty hacen referencia a "consolas virtuales" de su sistema (accesibles mediante las teclas <alt-F1>,<alt-F2>, etc). /dev/tty1 hace referencia a la primera VC, /dev/tty2 a la segunda, etc. Los nombres de dispositivo que comienzan con /dev/pty son "pseudo-terminales". Estos son usados para proporcionar una "terminal" a sesiones remotas. Por ejemplo, si su maquina esta en una red, telnet de entrada usara uno de los dispositivos /dev/pty. /etc : /etc contiene una serie de archivos de configuración del sistema. Estos incluyen /etc/passwd (la base de datos de usuarios), /etc/rc (scripts de inicialización del sistema), etc. /sbin : /sbin se usa para almacenar programas esenciales del sistema, que usara el administrador del sistema. José Luis Elvira Valenzuela, ITESO-DESI 1999 46 /home : /home contiene los directorios "home" de los usuarios. Por ejemplo, /home/larry es el directorio del usuario "larry". En un sistema recién instalado, no habrá ningún usuario en este directorio. /lib : /lib contiene las imágenes de las librerías compartidas. Estos archivos contienen código que compartirán muchos programas. En lugar de que cada programa contenga una copia propia de las rutinas compartidas, estas son guardadas en un lugar común, en /lib. Esto hace que los programas ejecutables sean menores y reduce el espacio usado en disco. /proc : /proc es un "sistema de archivos virtual". Los archivos que contiene realmente residen en memoria, no en un disco. Hacen referencia a varios procesos que corren en el sistema, y le permiten obtener información acerca de que programas y procesos están corriendo en un momento dado. /tmp : Muchos programas tienen la necesidad de generar cierta información temporal y guardarla en un archivo temporal. El lugar habitual para esos archivos es en /tmp. /usr : /usr es un directorio muy importante. Contiene una serie de subdirectorios que contienen a su vez algunos de los mas importantes y útiles programas y archivos de configuración usados en el sistema. Los directorios descritos arriba son esenciales para que el sistema este operativo, pero la mayoría de las cosas que se encuentran en /usr son opcionales para el sistema. De cualquier forma, son estas cosas opcionales las que hacen que el sistema sea útil e interesante. Sin /usr, tendría un sistema aburrido, solo con programas como cp y ls. usr contiene la mayoría de los paquetes grandes de programas y sus archivos de configuración. /usr/X386 : /usr/X386 contiene el sistema X Windows si usted lo instala. El sistema X Windows es un entorno gráfico grande y potente el cual proporciona un gran numero de utilidades y programas gráficos, mostrados en "ventanas" en su pantalla. Si esta familiarizado con los entornos Microsoft Windows o Macintosh, X Window le será muy familiar. El directorio /usr/X386 contiene todos los ejecutables de X Window, archivos de configuración y de soporte. /usr/bin : /usr/bin es el almacén real de programas del sistema UNIX. Contiene la mayoría de los programas que no se encuentran en otras partes como /bin. José Luis Elvira Valenzuela, ITESO-DESI 1999 47 /usr/etc : Como /etc contiene diferentes archivos de configuración y programas del sistema, /usr/etc contiene incluso mas que el anterior. En general, los archivos que se encuentran en /usr/etc/ no son esenciales para el sistema, a diferencia de los que se encuentran en /etc, que si lo son. /usr/include : /usr/include contiene los archivos de cabecera para el compilador de C. Estos archivos (la mayoría de los cuales terminan en .h, de "header") declaran estructuras de datos, sub-rutinas y constantes usados en la escritura de programas en C. Los archivos que se encuentran en /usr/include/sys son generalmente usados en la programación de UNIX a nivel de sistema. Si esta familiarizado con el lenguaje de programación C, aquí encontrará los archivos de cabecera como stdio.h, el cual declara funciones como printf(). /usr/g++-include : /usr/g++-include contiene archivos de cabecera para el compilador de C++ (muy parecido a /usr/include). /usr/lib : /usr/lib contiene las librerías equivalentes "stub" y "static" a los archivos encontrados en /lib. Al compilar un programa, este es "enlazado" con las librerías que se encuentran en /usr/lib, las cuales dirigen al programa a buscar en /lib cuando necesita el código de la librería. Además, varios programas guardan archivos de configuración en /usr/lib. /usr/local : /usr/local es muy parecido a /usr contiene programas y archivos no esenciales para el sistema, pero que hacen el sistema mas divertido y excitante. En general, los programas que se encuentran en /usr/local son específicos de su sistema esto es, el directorio /usr/local difiere bastante entre sistemas UNIX. Aquí encontrara programas grandes como TEX (sistema de formateo de documentos) y Emacs (gran y potente editor), si los instala. /usr/man : Este directorio contiene las páginas de manual. Hay dos subdirectorios para cada página "sección" de las páginas (use la orden man man para mas detalles). Por ejemplo, /usr/man/man1 contiene los fuentes (es decir, los originales por formatear) de las páginas de manual de la sección 1, y /usr/man/cat1 las paginas ya formateadas de la sección 1. /usr/src : /usr/src contiene el código fuente (programas por compilar) de varios programas de su sistema. El más importante es /usr/src/Linux, el cual contiene el código fuente del Núcleo de Linux. /var : /var contiene directorios que a menudo cambian su tamaño o tienden a crecer. Muchos de estos directorios solían residir en /usr, pero desde que estamos José Luis Elvira Valenzuela, ITESO-DESI 1999 48 tratando de dejarlo relativamente inalterable, los directorios que cambian a menudo han sido llevados a /var. Algunos de estos directorios son: /var/adm : /var/adm contiene varios archivos de interés para el administrador del sistema, específicamente históricos del sistema, los cuales recogen errores o problemas con el sistema. Otros archivos guardan las sesiones de presentación en el sistema, así como los intentos fallidos. /var/spool : /var/spool contiene archivos que van a ser pasados a otro programa. Por ejemplo, si su maquina está conectada a una red, el correo de llegada será almacenado en /var/spool/Mail hasta que lo lea o lo borre. Artículos nuevos de las “news" tanto salientes como entrantes pueden encontrarse en /var/spool/news, etc. José Luis Elvira Valenzuela, ITESO-DESI 1999 49 3.1.2- Comandos básicos. Desplegando el directorio actual. El directorio en el cual se está trabajando actualmente, se refiere al directorio actual. Formato del comando : pwd ¿Cómo desplegar el directorio actual? $ pwd /home/jluis Cambiando de directorio. Formato del comando : cd nombre_del_directorio 1.- Cambiando de directorios usando el nombre de ruta relativo. $ cd encoder entra al directorio llamado encoder que está debajo del directorio actual. 2.- Cambiando de directorios usando el nombre de ruta absoluto : $ cd /etc/mail $ cd /usr 3.- Usar el comando cd sin parámetros para cambiar al directorio home del usuario. $ cd José Luis Elvira Valenzuela, ITESO-DESI 1999 50 Abreviaciones para el nombre de ruta. Símbolo . .. ~ Significado Directorio actual Directorio padre Ruta absoluta al directorio home (solo disponible en algunos shells) Usando las abreviaciones de nombres de ruta con el comando cd para moverse en la estructura de directorios. $ pwd /usr/local/man/man1 $ cd .. $ pwd /usr/local/man $ cd ../.. $ pwd /usr $ cd ~ $ pwd /home/jluis Desplegando directorios. Formato del comando : ls [opciones] [ruta] Listando directorios y archivos. $ pwd /home/jluis $ ls /usr/etc im_palette.pal imrc $ ls /usr/games banner José Luis Elvira Valenzuela, ITESO-DESI 1999 51 Desplegando archivos ocultos. Todos los nombres de archivos que comienzan con punto son archivos ocultos. Usar ls –a para desplegar los archivos ocultos. $ ls -a . .. .AfterStep-errors .FVWM2-errors .Xauthority .addressbook .addressbook.lu .bash_history .bash_profile .ncftp .netscape .newsrc-news .pine-debug1 .pinerc .sversionrc .user.rdb .wm_style .x11amp .xsession-errors GNUstep Office50 Xrootenv.0 amp-gepi encoder freeamp mail mp3 new.xinitrc ns_imap nsmail outside.gz x11amp Desplegando tipos de archivos. Usar el comando ls –F para desplegar los tipos de archivos. Los tipos de archivos son desplegados con los siguientes símbolos. $ cd $ ls -F GNUstep/ Office50/ Xrootenv.0 a.out* amp-gepi/ encoder/ freeamp/ hola.c mail/ mp3/ new.xinitrc ns_imap/ nsmail/ outside.gz x11amp/ El –F despliega los siguientes símbolos : Tipo de archivo Directorio Ejecutable Liga simbólica Cualquier otro José Luis Elvira Valenzuela, ITESO-DESI 1999 Símbolo / * @ (nada) 52 Desplegando una lista extendida. Usar el comando ls –l para desplegar una lista de archivos en el directorio actual en el formato largo. $ ls -l total 4395 drwxr-xr-x drwxr-xr-x -rw-r--r--rwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x -rw-r--r-drwx-----drwxr-xr-x -rw-r--r-- Tipo de archivo y permisos - archivo d directorio l liga simbólica 3 21 1 1 3 3 3 1 2 2 1 jluis jluis jluis jluis jluis jluis jluis jluis jluis jluis jluis users users users users users users users users users users users 1024 1024 396 4148 1024 1024 1024 60 1024 1024 137 Jan 6 10:13 GNUstep Jan 4 09:21 Office50 Jan 15 10:23 Xrootenv.0 Jan 27 10:17 a.out Jan 5 13:14 amp-gepi Jan 6 10:12 encoder Jan 5 12:30 freeamp Jan 27 10:17 hola.c Jan 4 10:53 mail Jan 5 13:19 mp3 Jan 4 11:20 new.xinitrc Con Dueño Grupo dueño Tamaño Fecha y hora Nombre del de modificación archivo. tado r de liga s Listando directorios individuales. Usar el comando ls –ld para desplegar información detallada acerca de un directorio pero no su contenido. $ ls -l freeamp total 785 drwxr-xr-x 9 jluis -rw-r--r-1 jluis users users 1024 Jan 797987 Jan $ ls -ld freeamp drwxr-xr-x 3 jluis users 1024 Jan José Luis Elvira Valenzuela, ITESO-DESI 1999 5 13:23 freeamp-1.1.0 5 12:28 freeamp-1.1.0.tar.gz 5 12:30 freeamp 53 Listando subdirectorios. Usar el comando ls –R para desplegar los contenidos de un directorio y todos sus subdirectorios. $ ls -F Makefile.am Makefile.in localfileinput.cpp localfileinput.h win32/ $ ls -RF Makefile.am Makefile.in localfileinput.cpp localfileinput.h win32/ win32: prj/ win32/prj: fileinput.def fileinput.dsp fileinput.dsw fileinput.mak Comodines. Asterisco (*) El asterisco representa cero o más caracteres. El asterisco seguido se le nombra como el un carácter comodín. El asterisco puede ser usado donde se usa un nombre de archivo o directorio. $ ls GNUstep Office50 Xrootenv.0 a.out amp-gepi encoder freeamp hola.c mail mp3 new.xinitrc ns_imap nsmail outside.gz x11amp $ ls n* new.xinitrc ns_imap: iteso.mx nsmail: Drafts Inbox pop Sent Trash José Luis Elvira Valenzuela, ITESO-DESI 1999 Unsent Messages 54 El asterisco puede remplazar nombres para directorios. $ ls -F GNUstep/ Office50/ Xrootenv.0 a.out* amp-gepi/ encoder/ freeamp/ hola.c mail/ mp3/ new.xinitrc ns_imap/ nsmail/ outside.gz x11amp/ $ ls e* BladeEnc072-i386-linux BladeEnc072-i386-linux.tar.gz $ ls encoder BladeEnc072-i386-linux BladeEnc072-i386-linux.tar.gz Comodines Signo de interrogación (?) El signo de interrogación es un comodín que coincide con cualquier carácter. $ ls GNUstep Office50 Xrootenv.0 a.out amp-gepi encoder freeamp hola.c mail mp3 new.xinitrc ns_imap nsmail outside.gz x11amp $ ls ?.out a.out $ ls ? ls: No match. José Luis Elvira Valenzuela, ITESO-DESI 1999 55 Creando directorios. Formato del comando mkdir nombre_directorio [nombre_directorio ...] $ mkdir hola $ cd hola $ mkdir reportes $ ls -dl reportes drwxr-xr-x 2 jluis users $ mkdir reportes/semanales $ ls -l reportes total 1 drwxr-xr-x 2 jluis users semanales $ mkdir uno dos tres $ ls -F dos/ reportes/ tres/ 1024 Jan 27 12:07 reportes 1024 Jan 27 12:08 uno/ Borrando directorios. Formato del comando. rmdir directorio rm –r directorio Borrando un directorio vacío. $ rmdir dos $ ls -F reportes/ tres/ uno/ Borrando un directorio que no está vacío. $rm -r reportes $ls -F tres/ uno/ José Luis Elvira Valenzuela, ITESO-DESI 1999 56 Borrando archivos y directorios en forma intercativa $ rm -ir hola rm: descend directory `hola'? y rm: descend directory `hola/uno'? y rm: remove directory `hola/uno'? n rm: descend directory `hola/tres'? y rm: remove directory `hola/tres'? y rm: remove directory `hola' (might be nonempty)? y rm: hola: Directory not empty José Luis Elvira Valenzuela, ITESO-DESI 1999 57 3.2- Comandos para archivos. 3.2.1.- Desplegando archivos. Formato del comando cat nombre_archivo Deplegar en pantalla el contenido del archivo /etc/passwd $ cat /etc/passwd root:k8KSZnL1xnmCY:0:0:root:/root:/bin/bash bin:*:1:1:bin:/bin: daemon:*:2:2:daemon:/sbin: adm:*:3:4:adm:/var/adm: mail:*:8:12:mail:/var/spool/mail: news:*:9:13:news:/var/spool/news: operator:*:11:0:operator:/root: games:*:12:100:games:/usr/games: gopher:*:13:30:gopher:/usr/lib/gopher-data: ftp:*:14:50:FTP User:/home/ftp: nobody:*:99:99:Nobody:/: postgres:!!:100:233:PostgreSQL Server:/var/lib/pgsql:/bin/bash jluis:LRo9u120e6q.U:101:100:Jose Luis Elvira Valenzuela:/home/jluis:/bin/tcsh luis:mx3g7R2rNK7.Y:102:100:Luis Eduardo Perez Bernal:/home/luis:/bin/tcsh José Luis Elvira Valenzuela, ITESO-DESI 1999 58 Usando el comando more Para desplegar el contenido de un archivo hasta que se llena una pantalla, al llenarse esperará a que el usuario presione el teclado para continuar. Formato more archivo Al aparecer la indicación –-More—- al final de la pantalla, se pueden usar cualquiera de las siguientes teclas de control. Teclas de control. Espacio Enter f h Q /cadena José Luis Elvira Valenzuela, ITESO-DESI 1999 Propósito. Pasar a la siguiente pantalla. Pasar a la siguiente línea. Saltar una pantalla hacia delante. Para desplegar el menú de ayuda del comando more. Para salir y regresar al prompt Para buscar una cadena hacia adelante. 59 Accesando los manuales en línea. Formato del comando man comando $ man more MORE(1) UNIX Reference Manual MORE(1) NAME more - file perusal filter for crt viewing SYNOPSIS more [-dlfpcsu] [-num] [+/ pattern] [+ linenum] [file ...] DESCRIPTION More is a filter for paging through text one screenful at a time. This version is especially primitve. Users should realize that less(1) provides more(1) emulation and extensive enhancements. OPTIONS Command line options are described below. Options are also taken from the environment variable MORE (make sure to precede them with a dash (``-'')) but command line options will override them. -num This option specifies an integer which is the screen size (in lines). : José Luis Elvira Valenzuela, ITESO-DESI 1999 60 Usando el comando head Para desplegar las primeras n líneas de un archivo. Las primeras 10 es el default si no se le indica cuantas. Formato : head [-n] archivo(s) $ head -5 /etc/passwd root:k8KSZnL1xnmCY:0:0:root:/root:/bin/bash bin:*:1:1:bin:/bin: daemon:*:2:2:daemon:/sbin: adm:*:3:4:adm:/var/adm: lp:*:4:7:lp:/var/spool/lpd: Usando el comando tail Para desplegar las últimas n líneas de un archivo. Las últimas 10 es el default si no se le indica cuantas. Formato : tail [-n] archivo(s) $ tail -4 /etc/passwd nobody:*:99:99:Nobody:/: postgres:!!:100:233:PostgreSQL Server:/var/lib/pgsql:/bin/bash jluis:LRo9u120e6q.U:101:100:Jose Luis Elvira Valenzuela:/home/jluis:/bin/tcsh luis:mx3g7R2rNK7.Y:102:100:Luis Eduardo Perez Bernal:/home/luis:/bin/tcsh José Luis Elvira Valenzuela, ITESO-DESI 1999 61 El comando touch. Para crear nuevos archivos vacíos. Formato : touch nombre(s) $ touch a b c $ ls -F a b c uno/ 3.2.2.- Manejo de archivos. Copia de archivos La copia de archivos es efectuada por la orden cp: Formato del comando : cp [-opciones] fuente destino Como copiar archivos. /home/larry/foo# cp /etc/termcap . /home/larry/foo# cp /etc/shells . /home/larry/foo# ls -F shells termcap /home/larry/foo# cp shells bells /home/larry/foo# ls -F bells shells termcap /home/larry/foo# La orden cp copia los archivos listados en la línea de comandos al archivo o directorio pasado como último argumento. Nótese como se usa el directorio "." para referirnos al directorio actual. José Luis Elvira Valenzuela, ITESO-DESI 1999 62 Moviendo archivos La orden mv mueve archivos en lugar de copiarlos. La sintaxis es muy sencilla. Formato : mv [-opciones] fuente destino Como mover o renombrar archivos. /home/larry/foo# mv termcap sells /home/larry/foo# ls -F bells sells shells /home/larry/foo# Nótese como termcap ya no existe, en su lugar esta el archivo sells. Esta orden puede usarse para renombrar archivos, como acabamos de hacer, pero también para mover archivos a directorios diferentes. Nota: mv y cp sobreescribirán los archivos destino (si ya existen) sin consultar. Sea cuidadoso cuando mueva un archivo a otro directorio: puede haber ya un archivo con el mismo nombre que será sobrescrito. Borrando archivos y directorios Para borrar un archivo, use la orden rm. ("rm" viene de "remove"). Formato : rm [-opciones] nombre del archivo rm –i nombre del archivo rm –r nombre del directorio /home/larry/foo# rm bells sells /home/larry/foo# ls -F shells /home/larry/foo# Nos hemos quedado solo con el archivo "shells", pero no nos quejaremos. Nótese que rm por defecto no preguntara antes de borrar un archivo luego, sea cuidadoso. José Luis Elvira Valenzuela, ITESO-DESI 1999 63 Una orden relacionada con rm es rmdir. Esta orden borra un directorio, pero solo si esta vacío. Si el directorio contiene archivos o subdirectorios, rmdir se quejara. José Luis Elvira Valenzuela, ITESO-DESI 1999 64 3.3.- Seguridad en los archivos. 3.3.1.- Permisos. Conceptos de permisos de archivos Al ser UNIX un sistema multiusuario, para proteger archivos de usuarios particulares de la manipulación por parte de otros, UNIX proporciona un mecanismo conocido como permisos de archivos. Este mecanismo permite que archivos y directorios "pertenezcan" a un usuario en particular. Por ejemplo, como Larry creo archivos en su directorio "home", Larry es el propietario de esos archivos y tiene acceso a ellos. UNIX también permite que los archivos sean compartidos entre usuarios y grupos de usuarios. Si Larry lo desea, podría restringir el acceso a sus archivos de forma que ningún otro usuario tenga acceso. De cualquier modo, en la mayoría de los sistemas por defecto se permite que otros usuarios puedan leer tus archivos pero no modificarlos o borrarlos. Como hemos explicado arriba, cada archivo pertenece a un usuario en particular. Por otra parte, los archivos también pertenecen a un grupo en particular, que es un conjunto de usuarios definido por el sistema. Cada usuario pertenece al menos a un grupo cuando es creado. El administrador del sistema puede hacer que un usuario tenga acceso a mas de un grupo. Los grupos usualmente son definidos por el tipo de usuarios que acceden a la maquina. Por ejemplo, en un sistema UNIX de una universidad, los usuarios pueden ser divididos en los grupos estudiantes, dirección, profesores e invitados. Hay también unos pocos grupos definidos por el sistema (como bin y admin) los cuales son usados por el propio sistema para controlar el acceso a los recursos muy raramente los usuarios normales pertenecen a estos grupos. Los permisos están divididos en tres tipos: Lectura. Escritura Ejecución. Estos permisos pueden ser fijados para tres clases de usuarios: El propietario del archivo. El grupo al que pertenece el archivo. Para todos los usuarios independientemente del grupo. José Luis Elvira Valenzuela, ITESO-DESI 1999 65 El permiso de lectura permite a un usuario leer el contenido del archivo o en el caso de un directorio, listar el contenido del mismo (usando ls). El permiso de escritura permite a un usuario escribir y modificar el archivo. Para directorios, el permiso de escritura permite crear nuevos archivos o borrar archivos ya existentes en dicho directorio. Por último, el permiso de ejecución permite a un usuario ejecutar el archivo si es un programa o guión del intérprete de comandos. Para directorios, el permiso de ejecución permite al usuario cambiar al directorio en cuestion con cd. Interpretando los permisos de archivos Veamos un ejemplo del uso de permisos de archivos. Usando el comando ls con la opcion -l se mostrará un listado "largo" de los archivos, el cual incluye los permisos de archivos. /home/larry/foo# ls -l stuff -rw-r--r-- 1 larry users 505 Mar 13 19:05 stuff /home/larry/foo# El primer campo impreso en el listado representa los permisos de archivos. El tercer campo es el propietario del archivo (larry), y el cuarto es el grupo al cual pertenece el archivo (users). Obviamente, el ultimo campo es el nombre del archivo (stuff), y los demás campos los trataremos mas adelante. Este archivo pertenece a larry y al grupo users. Echemos un vistazo a los permisos. La cadena -rw-r--r-- nos informa, por orden, de los permisos para el propietario, el grupo del archivo y cualquier otro usuario. El primer carácter de la cadena de permisos ("-") representa el tipo de archivo. El "-" significa que es un archivo regular. Las siguientes tres letras ("rw-") representan los permisos para el propietario del archivo, larry. El "r" para "lectura" y "w" para escritura. Luego Larry tiene permisos de lectura y escritura para el archivo stuff. Como ya mencionamos, aparte de los permisos de lectura y escritura esta el permiso de "ejecución", representado por una "x". Como hay un "-" en lugar del "x", significa que Larry no tiene permiso para ejecutar ese archivo. Esto es correcto, puesto que stuff no es un programa de ningun tipo. Por supuesto, como el archivo es de Larry, puede darse a si mismo permiso de ejecución si lo desea. Esto será cubierto en breve. José Luis Elvira Valenzuela, ITESO-DESI 1999 66 Los siguientes tres caracteres, r-- representan los permisos para los miembros del grupo. El grupo al que pertenece el archivo es users. Como solo aparece un "r" cualquier usuario que pertenezca al grupo users puede leer este archivo. Los últimos tres caracteres, también r--, representan los permisos para cualquier otro usuario del sistema (diferentes del propietario o de los pertenecientes al grupo users). De nuevo, como solo esta presente el "r", los demás usuarios pueden leer el archivo, pero no escribir en el o ejecutarlo. Aqui tenemos otros ejemplos de permisos de grupo. -rwxr-xr-x El propietario del archivo puede leer, escribir y ejecutar el archivo. Los usuarios pertenecientes al grupo del archivo, y todos los demás usuarios pueden leer y ejecutar el archivo. -rw------El propietario del archivo puede leer y escribir. Nadie mas puede acceder al archivo. -rwxrwxrwx Todos los usuarios pueden leer, escribir y ejecutar el archivo. Dependencias Es importante darse cuenta de que los permisos de un archivo también dependen de los permisos del directorio en el que residen. Por ejemplo, aunque un archivo tenga los permisos -rwxrwxrwx, otros usuarios no podrán acceder a el a menos que también tengan permiso de lectura y ejecución para el directorio en el cual se encuentra el archivo. Si Larry quiere restringir el acceso a todos sus archivos, podría simplemente poner los permisos de su directorio "home" : /home/larry a -rwx------. De esta forma ningún usuario podrá acceder a su directorio ni a ninguno de sus archivos o subdirectorios. Larry no necesita preocuparse de los permisos individuales de cada uno de sus archivos. En otras palabras, para acceder a un archivo, debes de tener permiso de ejecución de todos los directorios a lo largo del camino de acceso al archivo, además de permiso de lectura (o ejecución) del archivo en particular. Habitualmente, los usuarios de un sistema UNIX son muy abiertos con sus archivos. Los permisos que se dan a los archivos usualmente son -rw-r--r--, lo que permite a todos los demás usuarios leer los archivos, pero no modificarlos de ninguna forma. Los directorios, usualmente tienen los permisos -rwxr-xr-x, lo que permite que los José Luis Elvira Valenzuela, ITESO-DESI 1999 67 demás usuarios puedan moverse y ver los directorios, pero sin poder crear o borrar nuevos archivos en ellos. Muchos usuarios pueden querer limitar el acceso de otros usuarios a sus archivos. Poniendo los permisos de un archivo a -rw------- no se permitirá a ningún otro usuario acceder al archivo. Igualmente, poniendo los permisos del directorio a -rwx----- no se permitirá a los demás usuarios acceder al directorio en cuestion. 3.3.2.- Modificando los permisos. El comando chmod se usa para establecer los permisos de un archivo. Solo el propietario puede cambiar los permisos del archivo. La sintaxis de chmod es: chmod {a,u,g,o}{+,-}{r,w,x} nombres de archivos Brevemente, indicamos a que usuarios afecta all, user, group u other. Entonces se especifica si se están añadiendo permisos (+) o quitándolos (-). Finalmente se especifica que tipo de permiso Read, write o execute. Algunos ejemplos: chmod a+r chmod +r toma a. stuff stuff Da a todos los usuarios acceso al archivo. Como arriba si no se indica a, u, g u o por defecto se chmod og-x stuff excepto al propietario. Quita permisos de ejecución a todos los usuarios chmod Permite al propietario leer, escribir y ejecutar el archivo. u+rwx stuff chmod o-rwx stuff Quita permisos de lectura, escritura y ejecución a todos los usuarios menos al propietario y a los usuarios del grupo del archivo. José Luis Elvira Valenzuela, ITESO-DESI 1999 68 3.4.- Permisos adicionales para archivos. 3.4.1.- Permisos por default. 3.4.2.- Enlaces. Manejando enlaces de archivos Los enlaces le permiten dar a un único archivo múltiples nombres. Los archivos son identificados por el sistema por su numero de inodo, el cual es el único identificador del archivo para el sistema de archivos. Un directorio es una lista de números de inodo con sus correspondientes nombres de archivo. Cada nombre de archivo en un directorio es un enlace a un inodo particular. Enlaces duros (Hard links) La orden ln es usada para crear múltiples enlaces para un archivo. Por ejemplo, supongamos que tiene un archivo foo en un directorio. Usando ls -i, veremos el numero de inodo para el archivo. # ls -i foo 22192 foo # Aquí, el archivo foo tiene el numero de inodo 22192 en el sistema de archivos. Podemos crear otro enlace a foo, llamado bar: # ln foo bar Con ls -i veremos que los dos archivos tienen el mismo inodo. # ls -i foo bar 22192 bar 22192 foo # Ahora, accediendo a foo o a bar accederemos al mismo archivo. Si hace cambios en foo, estos cambios también serán efectuados en bar. Para todos los efectos, foo y bar son el mismo archivo. Estos enlaces son conocidos como enlaces duros (Hard links) porque directamente crean el enlace al inodo. Nótese que solo podemos crear enlaces duros entre José Luis Elvira Valenzuela, ITESO-DESI 1999 69 archivos del mismo sistema de archivos; enlaces simbólicos (ver mas adelante) no tienen esta restricción. Cuando borra un archivo con rm, está solamente borrando un enlace a un archivo. Si usa el comando # rm foo solo el enlace de nombre foo es borrado; bar todavía existirá. Un archivo es solo definitivamente borrado del sistema cuando no quedan enlaces a el. Usualmente, los archivos tienen un único enlace, por lo que el uso de rm los borra. Pero si el archivo tiene múltiples enlaces, el uso de rm solo borrara un único enlace; para borrar el archivo, deberá borrar todos los enlaces del archivo. La orden ls -l muestra el numero de enlaces a un archivo (entre otra información). # ls -l foo bar -rw-r--r-2 root -rw-r--r-2 root # root root 12 Aug 12 Aug 5 16:51 bar 5 16:50 foo La segunda columna en el listado, "2", especifica el número de enlaces al archivo. Así resulta que un directorio no es más que un archivo que contiene información sobre la translación enlace a inodo. También, cada directorio tiene al menos dos enlaces duros en el: "." (un enlace apuntando a si mismo) y ".." (un enlace apuntando al directorio padre). En el directorio raíz (/), el enlace ".." simplemente apunta a /. Enlaces simbólicos Los enlaces simbólicos son otro tipo de enlace, que es diferente al enlace duro. Un enlace simbólico permite dar a un archivo el nombre de otro, pero no enlaza el archivo con un inodo. La orden ln -s crea un enlace simbólico a un archivo. Por ejemplo, si usamos la orden : # ln -s foo bar crearemos un enlace simbólico bar apuntando al archivo foo. Si usamos ls -i, veremos que los dos archivos tienen inodos diferentes, en efecto. José Luis Elvira Valenzuela, ITESO-DESI 1999 70 # ls -i foo bar 22195 bar 22192 foo # De cualquier modo, usando ls -l vemos que el archivo bar es un enlace simbólico apuntando a foo. # ls -l foo bar lrwxrwxrwx 1 root -rw-r--r-1 root # root root 3 Aug 12 Aug 5 16:51 bar -> foo 5 16:50 foo Los bits de permisos en un enlace simbólico no se usan (siempre aparecen como rwxrwxrwx). En su lugar, los permisos del enlace simbólico son determinados por los permisos del archivo "apuntado" por el enlace (en nuestro ejemplo, el archivo foo). Funcionalmente, los enlaces duros y simbólicos son similares, pero hay algunas diferencias. Por una parte, puede crear un enlace simbólico a un archivo que no existe; lo mismo no es cierto para enlaces duros. Los enlaces simbólicos son procesados por el núcleo de forma diferente a los duros, lo cual es solo una diferencia técnica, pero a veces importante. Los enlaces simbólicos son de ayuda puesto que identifican al archivo al que apuntan; con enlaces duros no hay forma facil de saber que archivo esta enlazado al mismo inodo. Los enlaces se usan en muchas partes del sistema Linux. Los enlaces simbólicos son especialmente importantes para las imagenes de las librerias compartidas en /lib. 3.4.3.- Control de la modificación de archivos. José Luis Elvira Valenzuela, ITESO-DESI 1999 71 3.5.- Metacaracteres y redirección. 3.5.1.- Metacaracteres. Entrada y salida estándard Muchos comandos UNIX toman su entrada de algo conocido como entrada estándard y envían su salida a la salida estándar (a menudo abreviado como "stdin" y "stdout"). El interprete de comandos configura el sistema de forma que la entrada estándar es el teclado y la salida la pantalla. Veamos un ejemplo con el comando cat. Normalmente cat lee datos de los archivos cuyos nombres se pasan como argumentos en la linea de comandos y envía estos datos directamente a la salida estándar. Luego, usando el comando /home/larry/papers# cat history-final masters-thesis mostrara por pantalla el contenido del archivo history-final seguido por masters-thesis. Si no se le pasan nombres de archivos a cat como parámetros, leerá datos de stdin y los enviara a stdout. Veamos un ejemplo. /home/larry/papers# cat Hello there. Hello there. Bye. Bye._____ <ctrl-D> /home/larry/papers# Como se puede ver, cada línea que el usuario teclea (impresa en negrita) es inmediatamente reenviada al monitor por cat. Cuando se esta leyendo de la entrada estándar, los comandos reconocen el fin de la entrada de datos cuando reciben el carácter EOT (end-of-text, fin de texto). Normalmente es generado con la combinación <ctrl-D>. José Luis Elvira Valenzuela, ITESO-DESI 1999 72 Veamos otro ejemplo. El comando sort toma como entrada líneas de texto (de nuevo leerá desde stdin si no se le proporcionan nombres de archivos en la linea de comandos), y devuelve la salida ordenada a stdout. Pruebe lo siguiente: /home/larry/papers# sort bananas carrots apples <ctrl-D> apples bananas carrots /home/larry/papers# Podemos ordenar alfabéticamente la lista de la compra... >no es útil UNIX? Redirecciónando la entrada y salida Ahora, supongamos que queremos que la salida de sort vaya a un archivo para poder salvar la lista ordenada de salida. El interprete de comandos nos permite redirecciónar la salida estándar a un archivo usando el símbolo ">". Veamos como funciona. /home/larry/papers# sort > shopping-list bananas carrots apples___ <ctrl-D> /home/larry/papers# Como puede ver, el resultado de sort no se muestra por pantalla, en su lugar es salvado en el archivo shopping-list. Echemos un vistazo al archivo. /home/larry/papers# cat shopping-list apples bananas carrots /home/larry/papers# Ya podemos ordenar la lista de la compra y además guardarla. José Luis Elvira Valenzuela, ITESO-DESI 1999 73 Supongamos ahora que teníamos guardada nuestra lista de compra desordenada original en el archivo ítems. Una forma de ordenar la información y salvarla en un archivo podría ser darle a sort el nombre del archivo a leer en lugar de la entrada estándar y redirecciónar la salida estándar como hicimos arriba. /home/larry/papers# sort ítems > shopping-list /home/larry/papers# cat shopping-list apples bananas carrots /home/larry/papers# Hay otra forma de hacer esto. No solo puede ser re-direccionada la salida estándar, también puede ser re-direccionada la entrada estándar usando el símbolo "<". /home/larry/papers# sort < ítems apples bananas carrots /home/larry/papers# Técnicamente, sort < ítems es equivalente a sort ítems, pero nos permite demostrar que sort < ítems se comporta como si los datos del archivo fueran tecleados por la entrada estándar. El interprete de comandos es quien maneja las redirecciones. sort no recibe el nombre del archivo (ítems) a leer, desde el punto de vista de sort, esta leyendo datos de la entrada estándar como si fueran tecleados desde el teclado. Esto introduce el concepto de filtro. Un filtro es un programa que lee datos de la entrada estándar, los procesa de alguna forma, y devuelve los datos procesados por la salida estándar. Usando la redirección la entrada estándar y/o salida estándar pueden ser referenciadas desde archivos. El comando sort es un filtro simple: ordena los datos de entrada y envía el resultado a la salida estándar. cat es incluso mas simple, no hace nada con los datos de entrada, simplemente envía a la salida cualquier cosa que le llega. José Luis Elvira Valenzuela, ITESO-DESI 1999 74 Uso de tuberias (pipes) Ya hemos visto como usar sort como un filtro. Pero estos ejemplos suponen que tenemos los datos en un archivo en alguna parte o vamos a introducir los datos manualmente por la entrada estándar. >Que pasa si los datos que queremos ordenar provienen de la salida de otro comando, como ls?. Por ejemplo, usando la opcion -r con sort ordenaremos los datos en orden inverso. Si queremos listar los archivos en el directorio actual en orden inverso, una forma podría ser. /home/larry/papers# ls english-list history-final masters-thesis notes /home/larry/papers# ls > file-list /home/larry/papers# sort -r file-list notes masters-thesis history-final english-list /home/larry/papers# Aqui, salvamos la salida de ls en un archivo, y entonces ejecutamos sort -r sobre ese archivo. Pero esta forma necesita crear un archivo temporal en el que salvar los datos generados por ls. La solución es usar las pipes. El uso de pipes es otra característica del interprete de comandos, que nos permite conectar una cadena de comandos en un "pipe", donde la stdout del primero es enviada directamente a la stdin del segundo y así sucesivamente. Queremos conectar la salida de ls con la entrada de sort. Para crear un pipe se usa el símbolo "|": /home/larry/papers# ls | sort -r notes masters-thesis history-final english-list /home/larry/papers# José Luis Elvira Valenzuela, ITESO-DESI 1999 75 Esta forma es mas corta y obviamente mas facil de escribir. Otro ejemplo útil usando el comando /home/larry/papers# ls /usr/bin mostrara una lista larga de los archivos, la mayoría de los cuales pasara rápidamente ante nuestros ojos sin que podamos leerla. En lugar de esto, usemos more para mostrar la lista de archivos en /usr/bin. /home/larry/papers# ls /usr/bin | more Ahora podemos ir avanzando pagina a pagina cómodamente. ¡Pero la diversión no termina aqui!. Podemos "entubar" mas de dos comandos a la vez. El comando head es un filtro que muestra la primeras líneas del canal de entrada (aquí la entrada desde una pipe). Si queremos ver el ultimo archivo del directorio actual en orden alfabético, usaremos: /home/larry/papers# ls | sort -r | head -1 notes /home/larry/papers# Donde head -1 simplemente muestra la primera linea de la entrada que recibe en este caso, el flujo de datos ordenados inversamente provenientes de ls). Redirección no destructiva El uso de ">" para redirecciónar la salida a un archivo es destructivo: en otras palabras, el comando /home/larry/papers# ls > file-list sobreescribe el contenido del archivo file-list. Si en su lugar, usamos el símbolo ">>", la salida será añadida al final del archivo nombrado, en lugar de ser sobrescrito. /home/larry/papers# ls >> file-list añadirá la salida de ls al final de file-list. José Luis Elvira Valenzuela, ITESO-DESI 1999 76 Es conveniente tener en cuenta que la redirección y el uso de pipes son características proporcionadas por el interprete de comandos éste, proporciona estos servicios mediante el uso de la sintaxis ">", ">>" y "|". José Luis Elvira Valenzuela, ITESO-DESI 1999 77 3.6.- El editor vi. 3.6.1.- Introducción al editor. ¿Qué es el editor vi? Un editor de texto es simplemente un programa usado para la edición de archivos que contienen texto, como una carta, un programa en C, o un archivo de configuración del sistema. Mientras que hay muchos editores de texto disponibles en Linux, el único editor que esta garantizado encontrar en cualquier sistema UNIX es vi el "visual editor". vi no es el editor mas fácil de usar, ni es muy autoexplicativo. De cualquier forma, como es tan común en el mundo UNIX y es posible que alguna vez necesite usarlo, aqui encontrara algo de documentación. La elección de un editor es principalmente una cuestion de gusto personal y estilo. Muchos usuarios prefieren el barroco, autoexplicativo y potente Emacs un editor con mas características que cualquier otro programa único en el mundo UNIX. Por ejemplo, Emacs tiene integrado su propio dialecto del lenguaje de programación LISP y tiene muchas extensiones (una de ellas es el programa "Eliza"- como programa de IA). Pero como Emacs y todos sus archivos de soporte es relativamente grande, puede que no tenga acceso a el en muchos sistemas. vi , por otra parte, es pequeño y potente, pero mas difícil de usar. De cualquier modo, una vez que conozca la forma de funcionamiento de vi, es muy fácil usarlo. Simplemente la curva de aprendizaje es bastante pronunciada al comienzo. Conceptos Mientras se usa vi, en cualquier momento estará en uno de tres posibles modos de operación. Estos modos son conocidos como : Modo órdenes. Modo inserción. Modo ultima línea. Cuando inicia vi, esta en el modo órdenes. Este modo le permite usar ciertas órdenes para editar archivos o cambiar a otros modos. Por ejemplo, tecleando "x" mientras esta en el modo órdenes, borra el carácter que hay debajo del cursor. Las teclas del cursor mueven este por el archivo que estamos editando. Generalmente, las ordenes usadas en este modo son solo de uno o dos caracteres de longitud. José Luis Elvira Valenzuela, ITESO-DESI 1999 78 Habitualmente insertará o editará texto desde el modo inserción. Usando vi, probablemente dedicara la mayor parte del tiempo en este modo. Inicia el modo de inserción al usar una orden como "i" (para "insertar") desde el modo de ordenes. Una vez en el modo de inserción, ira insertando texto en el documento desde la posición actual del cursor. Para salir del modo de inserción y volver al de ordenes, pulse <esc>. Modo última línea es un modo especial usado para proporcionar ciertas órdenes extendidas a vi. Al usar esos comandos, aparecen en la última línea de la pantalla (de ahí el nombre). Por ejemplo, cuando teclea ":" desde el modo de órdenes, entrará en el modo última línea, y podrá usar órdenes como "wq" (para escribir el archivo a disco y salir de vi), o "q!" (para salir de vi sin guardar los cambios). El modo de última línea es habitualmente usado por órdenes vi mayores de un carácter. En el modo de última línea, introduce una orden de una sola línea y pulsa <enter> para ejecutarla. 3.6.2.- Comandos de edición. Comenzando con vi La mejor forma de entender estos conceptos es arrancar vi y editar un archivo. En el ejemplo "screens" que veremos, vamos a mostrar solo unas pocas líneas de texto, como si la pantalla tuviese solo seis líneas de altura (en lugar de veinticuatro). La sintaxis de vi es vi nombre del archivo Arranque vi tecleando /home/larry# vi test José Luis Elvira Valenzuela, ITESO-DESI 1999 79 Usando el editor vi lo que editara el archivo test. Debería ver algo como ~ ~ ~ "test" [New file] La columna de caracteres "~" indica que esta al final del archivo. Insertando texto Esta ahora en modo órdenes; para poder insertar texto en el archivo, pulse <i>(lo que le hará entrar en modo inserción), y comience a escribir. Now is the time for all good men to come to the aid of the party._ ~ ~ ~ Mientras inserta texto, puede escribir tantas líneas como desee (pulsando <return> después de cada una, por supuesto), y puede corregir los errores con la tecla de borrado de carácter. Para salir del modo de inserción y volver al modo de ordenes, pulse <esc>. Mientras este en modo órdenes, puede usar las teclas del cursor para moverse por el archivo. En nuestro ejemplo, como solo tenemos una línea, el tratar de usar las teclas de línea arriba o abajo, probablemente hará que vi emita un pitido. Hay muchas formas de insertar texto a parte de la orden i. Por ejemplo, la orden a inserta texto comenzando detrás de la posición actual del cursor, en lugar de la posición actual del cursor. Por ejemplo, use la tecla de cursor a la izquierda para desplazar el cursor entre las palabras "good" y "men". José Luis Elvira Valenzuela, ITESO-DESI 1999 80 Now is the time for all good__men to come to the aid of the party | ~ ~ ~ ~ Pulse <a> para iniciar el modo inserción, teclee "wo" y pulse <esc> para volver al modo de órdenes. Now is the time for all good women to come to the aid of the party. ~ ~ ~ ~ Para comenzar a insertar texto en la línea de debajo de la actual, use la orden "o". Por ejemplo, pulse <o> y teclee otra línea o dos: Now is the time for all good women to come to the aid of the party Afterwards, we'll go out for pizza and beer._ ~ ~ ~ ~ Solo recuerde que en cualquier momento esta en modo de ordenes (donde ordenes como i, a ò o son validas, o en modo de inserción (cuando este insertando texto, pulse <esc> para volver al modo de órdenes), o en modo de última línea (donde puede introducir comandos extendidos, como veremos mas adelante). José Luis Elvira Valenzuela, ITESO-DESI 1999 81 Borrando texto Desde el modo de órdenes, la orden x borra el carácter debajo del cursor. Si pulsa <x> cinco veces, terminara con: Now is the time for all good women to come to the aid of the party. Afterwards, we'll go out for pizza and_ ~ ~ ~ ~ Ahora pulse <a>, inserte algún texto, seguido de <esc>: Now is the time for all good women to come to the aid of the party Afterwards, we'll go out for pizza and Diet Coke._ ~ ~ ~ ~ Puede borrar líneas enteras usando la orden dd (es decir, pulse <d> dos veces en una fila). Si el cursor esta en la segunda línea y teclea dd, Now is the time for all good women to come to the aid of the party. ~ ~ ~ José Luis Elvira Valenzuela, ITESO-DESI 1999 82 Para borrar la palabra sobre la que se encuentra el cursor, use la orden dw. Sitúe el cursor sobre la palabra "good" y pulse dw. Now is the time for all women to come to the aid of the party. ~ ~ ~ ~ Modificando texto Puede sustituir secciones de texto usando la orden R. Sitúe el cursor en la primera letra de "party" y pulse <R>, y escriba la palabra "hungry". Now is the time for all women to come to the aid of the hungry._ ~ ~ ~ ~ El uso de R para editar texto es bastante parecido al uso de las ordenes i y a, pero R sobreescribe texto en lugar de insertarlo. La orden r sustituye un único carácter situado debajo del cursor. Por ejemplo, sitúe el cursor al comienzo de la palabra “now" y escriba r seguido de C. Obtendrá: C_ow is the time for all women to come to the aid of the hungry. ~ ~ ~ ~ José Luis Elvira Valenzuela, ITESO-DESI 1999 83 La orden "~" cambia de mayúsculas a minúsculas o viceversa la letra sobre la que se encuentra el cursor. Por ejemplo, si sitúa el cursor sobre la "o" de "Cow", y repetidamente pulsa <~>, obtendrá: COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY ~ ~ ~ ~ Ordenes de movimiento Ya conoce como usar las teclas del cursor para moverse por el documento. Además, puede usar las ordenes h, j, k y l para mover el cursor a la izquierda, abajo, arriba y derecha respectivamente. Esto es muy cómodo cuando (por alguna razón) sus teclas de cursor no funcionen correctamente. La orden w mueve el cursor al comienzo de la siguiente palabra; b lo lleva al comienzo de la palabra anterior. La orden 0 (cero) mueve el cursor al comienzo de la línea actual, y la orden $ lo lleva al final de la línea. Al editar archivos grandes, querrá moverse hacia adelante y atrás a lo largo del archivo mostrando una pantalla cada vez. Pulsando <ctrl-F>avanza el cursor una pantalla hacia adelante y <ctrl-B> lo lleva una pantalla atrás. Para llevar el cursor al final del archivo, pulse G. Puede también desplazarse a una línea arbitraria; por ejemplo, pulsando la orden 10G llevara el cursor a la línea 10 del archivo. Para desplazarse al comienzo, use 1G. Puede asociar ordenes de desplazamiento con otras ordenes como es el borrado. Por ejemplo, La orden d$ borrara todo desde la posición del cursor al final de la línea; dG borrará todo desde la posición del cursor al final del archivo. Guardando archivos y saliendo de vi Para salir de vi sin modificar el archivo use la orden :q!. Al pulsar ":", el cursor se desplazara a la última línea de la pantalla; esta en modo última línea. José Luis Elvira Valenzuela, ITESO-DESI 1999 84 COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY ~ ~ ~ : En el modo de última línea hay disponibles una serie de ordenes extendidas. Una de ellas es q!, la cual permite salir de vi sin guardar los cambios. La orden :wq salva el archivo y sale de vi. La orden ZZ (desde el modo de ordenes, sin ":") es equivalente a :wq. Recuerde que debe pulsar <enter> después de introducir la orden para que esta se ejecute en el modo ultima línea. Para salvar el archivo sin salir de vi, simplemente use :w. Editando otro archivo. Para editar otro archivo use la orden :e. Por ejemplo, para dejar de editar el archivo test y en su lugar editar el archivo foo, use la orden COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY ~ ~ ~ :e foo Si usa :e sin salvar primero el archivo, obtendrá el mensaje de error No write since last change (":edit!" overrides) lo cual significa que vi no quiere editar otro archivo hasta que salve el primero. En este punto, puede usar :w para guardar el archivo original, y entonces usar :e, o puede usar la orden José Luis Elvira Valenzuela, ITESO-DESI 1999 85 COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY ~ ~ ~ :e! foo El signo "!" le dice a vi lo que realmente desea usted editar el nuevo archivo sin salvar los cambios del primero. Incluyendo otros archivos Si usas la orden :r Puede incluir el contenido de otro archivo en el archivo que está editando. Por ejemplo :r foo.txt insertaría el contenido del archivo foo.txt en el texto en la posición actual de cursor. Ejecutando comandos del intérprete Puede también ejecutar comandos del intérprete desde el interior de vi. La orden :r! funciona como :r, pero en lugar de leer un archivo, inserta la salida de un comando dado en el archivo en la posición actual del cursor. Por ejemplo, si usa la orden :r! ls -F obtendrá : COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY letters/ misc/ papers/ ~ ~ José Luis Elvira Valenzuela, ITESO-DESI 1999 86 También puede salir a un intérprete de comandos desde vi, es decir, ejecutar una orden desde dentro de vi y volver al editor una vez esta finalice. Por ejemplo, si usa la orden :! ls –F la orden ls -F será ejecutada, y los resultados mostrados en la pantalla, pero no insertados en el archivo en edición. Si usa la orden :shell vi iniciará una instancia del intérprete de comandos, permitiéndole temporalmente dejar a vi "parado" mientras ejecuta otras ordenes. Simplemente salga del intérprete de comandos (usando la orden exit) para regresar a vi José Luis Elvira Valenzuela, ITESO-DESI 1999 87 3.7.- Introducción al ambiente gráfico de Linux. 3.7.1.- Iniciando el ambiente gráfico de Linux. 3.7.2.- Configuración del ambiente gráfico de Linux. Poner a punto XFree86 no suele ser difícil. Sin embargo, si va a usar manejadores de "chipsets" aun en desarrollo o desea obtener el mejor rendimiento o resolución de una tarjeta aceleradora, en configurar a la perfección XFree86 puede tardar bastante. En esta sección vamos a describir como crear y editar el archivo XF86Config, que configura al servidor. En muchos casos lo mejor es comenzar con una configuración "básica", de baja resolución, como 640x480 puntos, que es soportada por todas las tarjetas y monitores. Una vez comprobado su funcionamiento a baja resolución, puede pasar a modificar la configuración para explotar toda la capacidad de su tarjeta de vídeo. Además de la información que nosotros le damos, debería leerse la siguiente documentación: La Documentacion propia de XFree86 en /usr/X11R6/lib/X11/doc (viene con el paquete XFree86-3.1-doc). Debe prestar especial atención al archivo README.Config, que es un tutorial sobre la configuración de XWindows. Diferentes "chipsets" de vídeo tendrán sus propios archivos README en el directorio anterior (por ejemplo, README.Cirrus). Léase el que le corresponda. Las páginas de manual para XFree86. Las páginas de manual para XF86Config. Las páginas de manual para el servidor concreto que utilice (como XF86_SVGA o XF86_S3). El archivo de configuración principal debe ser : /usr/X11R6/lib/X11/XF86Config José Luis Elvira Valenzuela, ITESO-DESI 1999 88 Este archivo contiene información acerca del ratón, parámetros de la tarjeta gráfica, etc. El archivo XF86Config.ed es un ejemplo que incluye la distribución. Copie este archivo como XF86Config y modifíquelo para su sistema. Las paginas de manual para XF86Config explican el formato del archivo con detalles. Lea ahora esas paginas si aun no lo ha hecho. Le vamos a presentar un ejemplo de XF86Config. No tiene por que coincidir con el ejemplo que incluye la distribucion, pero en todo caso tendrán estructura parecida. Observe que el formato del archivo puede cambiar algo entre versiones de XFree86. La información que le damos solo vale para la version 3.1. Además, no debe limitarse a copiar este archivo e intentar probarlo en su sistema. Si lo hace, y, por error, envía a su monitor una frecuencia demasiado alta para el puede producir una avería. No seria el primer caso. Esto ha ocurrido especialmente con monitores de frecuencia fija. En definitiva, asegúrese de que su archivo XF86Config se corresponde con su hardware antes de intentar utilizarlo. Cada sección del siguiente ejemplo de XF86Config se enmarca en un par de líneas Sección <section-name>. . . EndSection. La primera parte del archivo es la sección de Archivos, que tendrá el siguiente aspecto: Section "Files" RgbPath FontPath FontPath EndSection "/usr/X11R6/lib/X11/rgb" "/usr/X11R6/lib/X11/fonts/misc/" "/usr/X11R6/lib/X11/fonts/75dpi/" La linea RgbPath pone la ruta de acceso a la base de datos de colores RGB para X11R6, y cada linea FontPath pone rutas de acceso a directorios con fuentes X11. Por lo general no tendrá que modificar estas líneas. Tan solo debe comprobar que en los directorios correspondientes se encuentran los archivos implicados (fuentes, etc). La siguiente sección es ServerFlags, que especifica algunos "flags" generales para el servidor. José Luis Elvira Valenzuela, ITESO-DESI 1999 89 Por lo general la sección suele ir vacía. Section "ServerFlags" # Si quita el comentario siguiente, la llegada de una se~nal al # provocara el volcado de su memoria. Esto puede dejar la consola en # un estado inutilizable pero el volcado puede servirle en la depuración. # NoTrapSignals # Quitando este comentario se desactiva la secuencia <Crtl><Alt><BS> # DontZap EndSection La siguiente sección es Keyboard. Su significado es claro. Section "Keyboard" Protocol "Standard" AutoRepeat 500 5 ServerNumLock EndSection Existen otras opciones. Vea su archivo XF86Config si desea modificar las opciones de teclado. Las que trae por defecto suelen funcionar bien en casi todos los sistemas. La siguiente sección es Pointer, y especifica los parámetros para el ratón. Section "Pointer" Protocol "MouseSystems" Device "/dev/mouse" # Los dos parámetros siguientes solo son necesarios en algunos Logitech. # BaudRate 9600 # SampleRate 150 # La siguiente opcion es útil para ratones Microsoft de dos botones. # Emulate3Buttons # La siguiente opcion es útil para algunos ratones con tres botones Logitech. # ChordMiddle EndSection José Luis Elvira Valenzuela, ITESO-DESI 1999 90 Le pueden interesar las opciones Protocol y Device. Protocol especifica el protocolo que utiliza su ratón (no se trata de su marca o modelo). Bajo Linux los protocolos validos son: BusMouse Logitech Microsoft MMSeries Mouseman MouseSystems PS/2 MMHitTab BusMouse es el que se usa para ratón Logitech en bus. Observar que los ratones antiguos de Logitech usan Logitech pero los mas modernos usan Microsoft o Mouseman. Este es un caso en el que el protocolo no coincide con la marca. Device especifica el dispositivo donde esta el ratón. En muchos sistemas Linux se encuentra en /dev/mouse, que suele ser un enlace al dispositivo verdadero (puerto serie como /dev/cua0, etc). Por supuesto, debe asegurarse de que el dispositivo que corresponda este en /dev. La siguiente sección es Monitor, que especifica las características de su pantalla TRC. La sección Monitor de XF86Config puede no ser única, como sucede con otras secciones. Es útil si hay varios monitores conectados al sistema, o si se quiere usar el mismo XF86Config en diferentes configuraciones hardware. Por lo general, sin embargo, solo necesitará una sección Monitor. Section "Monitor" Identifier "CTX 5468 NI" # !! Estos valores son validos solo para un monitor "CTX 5468 NI" # No intente usarlo en su monitor si no es este mismo. Bandwidth HorizSync VertRefresh # Modos: Nombre 60 30-38,47-50 50-90 reloj ModeLine "640x480" 25 ModeLine "800x600" 36 ModeLine "1024x768" 65 José Luis Elvira Valenzuela, ITESO-DESI 1999 horiz vert 640 664 760 800 800 824 896 1024 1024 1088 1200 1328 480 491 493 525 600 601 603 625 768 783 789 818 91 EndSection La línea Identifier se usa para dar a la sección un nombre. Puede ser cualquier cadena de caracteres y se usara después para referirse a ese monitor. HorizSync es el valor de frecuencia de sincronía horizontal válida, en KHz. Si tiene un monitor "multisync", puede tratarse de un rango (o diversos rangos separados por comas). Si se trata de un monitor de frecuencia fija, será un conjunto discreto de valores como el siguiente: HorizSync 31.5, 35.2, 37.9, 35.5, 48.95 El manual de su monitor debería incluir estos datos en las especificaciones técnicas. Si no tiene esta información, contacte con el vendedor o fabricante para obtenerla. Por supuesto, hay otras fuentes de información. VertRefresh especifica las frecuencias de barrido vertical validas (o sincronismo vertical), en Hz. Como HorizSync puede ser uno o mas rangos o valores discretos. También deben indicarse en su manual. Los dos parámetros anteriores solo se utilizan para comprobar que los modos gráficos pedidos van a ser tolerados por su monitor. Esos modos se especifican en las entradas Modeline que tienen el formato siguiente: ModeLine <nombre> <reloj> <valores-horiz> <valores-vert> <nombre> es un nombre cualquiera que le damos al modo. <reloj> es la frecuencia de reloj o "dot clock" asociada al modo. Se suele especificar siempre en Mhz, y es la frecuencia de envío de pixels al monitor para esa resolución. <valores-horiz> y <valores-vert> son cuatro números que especifican cuando el haz de electrones del monitor debe dispararse y cuando se envían los pulsos de sincronismo. Se preguntará como determinar esos valores para su monitor. El archivo Videomodes.doc, incluido en la distribución de XFree86 describe en detalle como obtener los valores requeridos. En primer lugar, <reloj> debe corresponderse con un valor de los que pueda producir su tarjeta de vídeo. José Luis Elvira Valenzuela, ITESO-DESI 1999 92 Por lo tanto solo usara modos con valores de reloj soportados. En la distribucion se incluyen dos archivos que pueden darle los datos para Modeline de su monitor. Estos archivos son modeDB.txt y Monitors, ambos en /usr/X11R6/lib/X11/doc. Debería comenzar con valores para el estándar VESA, que la mayor parte de los monitores soportan. Estos valores están incluidos en modeDB.txt. En este archivo encontrara entradas como # 640x480@60Hz Non-Interlaced mode # Horizontal Sync = 31.5kHz # Timing: H=(0.95us, 3.81us, 1.59us), V=(0.35ms, 0.064ms, 1.02ms) # # name clock horizontal timing vertical timing "640x480" 25.175 640 664 760 800 480 491 493 flags 525 Esta es una temporización estándar VESA para modo 640x480. Utiliza un reloj de 25.175, que debe ser soportado por la tarjeta (esto lo veremos luego). Para incluir esta entrada en el archivo XF86Config usaría la linea ModeLine "640x480" 25.175 640 664 760 800 480 491 493 525 Observe que el argumento <nombre> (en este caso, "640x480") es una cadena de caracteres arbitraria, aunque se suele seguir la convención de indicar la resolución del modo. Para cada Modeline indicado, el servidor comprobará que sus valores caen dentro de los rangos permitidos de frecuencias (especificados antes), anulando el modo si no ocurre así. Principalmente, el valor de reloj no debe ser mayor que el indicado en Bandwidth. Sin embargo, usar valores ligeramente superiores no suele dar problemas. Si los tiempos estándares en VESA no le funcionan correctamente (lo sabrá cuando después los pruebe) mire los archivos modeDB.txt y Monitors, que incluyen valores específicos para muchos modelos de monitores. Puede crear entradas Modeline a partir de lo que vea en estos archivos. Asegúrese de que solo usa valores validos en su monitor. Vea que muchos monitores de 14 o 15 pulgadas no soportan modos de alta resolución como 1024x768 con señales de reloj lentas. Esto significa que si no encuentra modos de alta resolución para su monitor en esos archivos, no podrá usar dicha resolución. José Luis Elvira Valenzuela, ITESO-DESI 1999 93 Si se encuentra perdido, y no encuentra ningún modo que funcione en su monitor, puede seguir las instrucciones de VideoModes.doc, que le ayudaran a calcular las entradas ModeLine adecuadas a partir de las especificaciones que se digan en el manual de su monitor. El mismo archivo VideoModes.doc explica también otros aspectos del servidor de XFree86 como el formato de la directiva ModeLine. Por último, si obtiene valores para ModeLine que son aceptables pero no del todo correcto, puede modificarlos ligeramente para obtener el resultado deseado. Por ejemplo, si cuando ejecuta XFree86 la imagen se desplaza ligeramente, o parece girar, puede seguir las instrucciones de VideoModes.doc para intentar corregir esas deficiencias. Además, utilice también los propios controles del monitor. Muchas veces es necesario ajustarlos después de cambiar de modo gráfico. Tener esos controles en la parte frontal del monitor le hará la vida mas fácil. Nunca debe usar valores de tiempo o de Modeline pensados para monitores diferentes al suyo. Si lo intenta hacer, y envía al monitor una frecuencia para la que no fue diseñado, puede producirle una avería La siguiente sección del archivo XF86Config es Device, que especifica los parámetros de su tarjeta gráfica. Por ejemplo : Section "Device" Identifier "#9 GXE 64" # Todavía nada; añadiremos los valores después. EndSection Esta sección establece las propiedades de su tarjeta gráfica. Identifier es una cadena de caracteres usada para identificar su tarjeta, cadena que usará para referirse a las características que en esta sección se detallen. Inicialmente no necesita incluir nada mas a la sección Device que la identificación de la tarjeta. Esto es así pues usaremos el servidor X para probar las propiedades de su tarjeta, para incluirlas luego en esta sección. El servidor X es capaz de obtener el "chipset", "RAMDAC" y memoria RAM de su tarjeta. Antes de hacer esto, sin embargo, necesitamos terminar el archivo XF86Config. La siguiente sección es Screen, que especifica que combinación monitor/tarjeta usar para un servidor concreto. José Luis Elvira Valenzuela, ITESO-DESI 1999 94 Section "Screen" Driver "Accel" Device "#9 GXE 64" Monitor "CTX 5468 NI" Subsection "Display" Depth 16 Modes "1024x768" "800x600" "640x480" ViewPort 0 0 Virtual 1024 768 EndSubsection EndSection La linea Driver indica que servidor X utiliza. Los valores validos son: Accel: Para servidores XF86_S3, XF86_Mach32, XF86_Mach8, XF86_8514, XF86_P9000, XF86_AGX, y XF86_W32. SVGA: Para el servidor XF86_SVGA. VGA16: Para el servidor XF86_VGA16. VGA2: Para el servidor XF86_Mono. Mono: Para manejadores monocromáticos no VGA que se encuentran en los servidores XF86_Mono y XF86_VGA16. Debe asegurarse de que /usr/X11R6/bin/X es un enlace simbólico al servidor que va a usar. La línea Device especifica el valor Identifier de la sección Device que corresponda a la tarjeta de vídeo que se va a usar con este servidor. Antes, hemos creado una sección Device con la línea : Identifier "#9 GXE 64" Así pues, utilizaremos "#9 GXE 64" en la linea Device de aqui. De forma parecida, la linea Monitor especifica el nombre de la sección Monitor que se va a usar en este servidor. Aqui, "CTX 5468 NI" es el identificador Identifier utilizado en la sección Monitor vista antes. José Luis Elvira Valenzuela, ITESO-DESI 1999 95 Subsection "Display" define distintas características del XFree86 con su particular combinación de monitor y tarjeta gráfica. El archivo XF86Config describe todas las opciones en detalle. La mayoría no son necesarias para que el sistema funcione. Las opciones que debería conocer son: Depth : Define el numero de bits por pixel (o planos de color), que normalmente valdrá 8 (supone 256 colores). Para el servidor VGA16 se usara una profundidad de 4, y para el monocromo, una profundidad de 1. Si se utiliza una tarjeta acelerada con suficiente memoria, se puede subir la profundidad a 16, 24 o 32. Si le da problemas, vuelva a profundidad 8 e intente corregir el problema después. Modes : Es la lista de modos de vídeo que estarán entre los definidos con ModeLine para su monitor. Los nombres usados antes para identificarlos ( "1024x768", etc) se usaran ahora para expresar los modos de la siguiente manera: Modes "1024x768" "800x600" "640x480" De esta forma, XFree86 intentará arrancar en el primero de los modos. Una vez que ha arrancado, con las teclas <ctrl><alt><numeric> y <ctrl><alt><numeric> podrá cambiar a otro modo. La mejor forma de empezar, cuando se esta configurando XFree86, es usar modos de baja resolución (como 640x480) que suelen funcionar siempre. Una vez que se tenga una configuración básica que va bien, puede pasarse a modificar XF86Config para soportar resoluciones mayores. Virtual. Pone el tamaño del área de trabajo virtual. XFree86 es capaz de usar la memoria sobrante de su tarjeta gráfica para extender el tamaño de su área de trabajo. Cuando mueve el raton a extremos de la pantalla, vera como la pantalla se desplaza, accediendo así a todo el área virtual. Así pues, si usted trabaja con una resolución inferior, como 800x600 y pone un área de 1024x768 (propia para 1 Mbyte de DRAM y 8 bits por pixel) podrá usar un área de trabajo mas grande que la que cabe en pantalla. El mecanismo Virtual resulta interesante para aprovechar toda la memoria de la tarjeta gráfica, pero es limitado. Si quiere usar un área de trabajo virtual, se recomienda usar las facilidades que al respecto dan gestores de ventanas como fvwm. El mecanismo aqui se implementa a base de ocultar ventanas, etc. en lugar de ocupar toda la memoria de la tarjeta. José Luis Elvira Valenzuela, ITESO-DESI 1999 96 Para mas detalle, vea las paginas de manual de fvwm, gestor de ventanas que suelen traer los sistemas Linux por defecto. ViewPort. Si usted utiliza la opcion Virtual descrita antes, puede usar ViewPort para indicar en que coordenadas virtuales comenzar XFree86. Se suele usar ViewPort 0 0 que pone el área de trabajo en la esquina superior izquierda. Pero si no se indica se pondrá centrado, algo que quizás le interese mas. Hay muchas otras opciones en esta sección; vea las paginas de manual para XF86Config para más detalle. En la práctica no son necesarias esas otras opciones para que funcione el sistema. Introduccion de los datos de la tarjeta gráfica Su archivo XF86Config esta ya casi listo para usar, aunque aun falta la información de su tarjeta gráfica. Lo que vamos a hacer ahora es usar el servidor X para obtener la información que falta, e introducirla en XF86Config. A veces se puede encontrar esa información en los archivos modeDB.txt, AccelCards y Devices, que se encuentran en /usr/X11R6/lib/X11/doc. Además, existen numerosos archivos README para algunos "chipsets". Debe mirar esos archivos para buscar su tarjeta y usar los valores que aparezcan en ellos (de reloj, tipo de "chipset" y otros) en la sección correspondiente de XF86Config. Si falta alguna información puede intentar obtenerla con el procedimiento siguiente. En estos ejemplos vamos a ver como configuraríamos el sistema para una tarjeta #9 GXE 64, que usa el servidor XF86_S3. Lo primero que debe hacerse es determinar el "chipset" que lleva la tarjeta. Ejecutando /usr/X11R6/bin/SuperProbe lo averiguaremos, aunque también hay que conocer el nombre con el que el servidor X conoce a ese "chipset". Para conseguir esto ultimo, ejecutar: X -showconfig Esto le dará los nombres de "chipsets" que conoce el servidor X (esto también se encuentra en las páginas de manual). Por ejemplo, con el servidor XF86_S3 obtendremos: XFree86 Version 3.1 / X Window System (protocol Version 11, revision 0, vendor release 6000) José Luis Elvira Valenzuela, ITESO-DESI 1999 97 Operating System: Linux Configured drivers: S3: accelerated server for S3 graphics adaptors (Patchlevel 0) mmio_928, s3_generic Así pues los nombres de "chipsets" que este servidor tiene son mmio_928 y s3_generic. En la página de manual para XF86_S3 encontrará la descripción de estos "chipsets" junto a algunas tarjetas que los utilizan. Para la #9 GXE 64 el "chipset" es mmio_928. Si no conoce que "chipset" usar, el servidor X puede intentar averiguarlo. Para ello, ejecutar X -probeonly > /tmp/x.out 2>&1 si usa bash como shell. Si usa csh, intente: X -probeonly &> /tmp/x.out El comando anterior debe ejecutarse solo cuando no hay otras actividades en el sistema (otros usuarios, procesos, etc.) Este comando obtiene también los valores para los relojes y si el sistema esta cargado se calcularan incorrectamente. Por ejemplo, esto es lo que sale para la tarjeta del autor: XFree86 Version 3.1 / X Window System (protocol Version 11, revision 0, vendor release 6000) Operating System: Linux Configured drivers: S3: accelerated server for S3 graphics adaptors (Patchlevel 0) mmio_928, s3_generic algunas líneas borradas . . . (--) S3: card type: 386/486 localbus (--) S3: chipset: 864 rev. 0 (--) S3: chipset driver: mmio_928 Aqui vemos los dos "chipsets" válidos (mmio_928 y s3_generic) del servidor. Este probo ambos y determinó que la tarjeta usa el "chipset" mmio_928. En la sección Device del archivo XF86Config, añada una linea Chipset con el nombre obtenido antes. Por ejemplo : José Luis Elvira Valenzuela, ITESO-DESI 1999 98 Section "Device" # Este es el identificador que le pusimos... Identifier "#9 GXE 64" # Añadimos esta linea: Chipset "mmio_928" EndSection Ahora hay que determinar las frecuencias de reloj. Cada una de estas es simplemente la frecuencia con la que la tarjeta puede enviar pixeles al monitor. Como ya sabemos, estas frecuencias dependen de la resolución usada. En primer lugar debe echar un vistazo a los archivos mencionados antes (como modeDB.txt) y ver si los relojes de su tarjeta están listados. En su caso vera una lista de 8 o 16 valores, todos ellos dados en Mhz. Por ejemplo, en modeDB.txt encontramos lo siguiente para la tarjeta Cardinal ET4000: # chip ET4000 ram 1024 virtual 1024 768 clocks 25 28 38 36 40 45 32 0 default-mode "1024x768" flags Como vemos, los relojes son 25, 28, 38, 36, 40, 45, 32 y 0 MHz. En la sección Devices del archivo XF86Config debe añadir una linea Clocks como la siguiente (para nuestro ejemplo): Clocks 25 28 38 36 40 45 32 0 Esto estará en la sección Devices, después de Chipset. Observe la importancia del orden de los relojes. No los cambie. Si no encuentra las frecuencias de reloj para su tarjeta en los archivos, el servidor X también los puede intentar averiguar. Con el comando ya visto X -probeonly obtendrá una linea como la siguiente: (--) S3: clocks: 25.18 José Luis Elvira Valenzuela, ITESO-DESI 1999 28.32 38.02 36.15 40.33 45.32 32.00 00.00 99 Con esta linea podemos hacer la linea Clocks en XF86Config. Si hay muchos valores y no caben en una linea puede crear mas líneas Clock, pero respete el orden de todas formas. Asegúrese de que no hay ninguna linea Clocks en la sección Devices cuando use el comando X-probeonly puesto que en este caso no hará pruebas reales de los relojes, sino que probara solo los valores que haya en el archivo XF86Config. Observe que algunas tarjetas aceleradas tienen chip de reloj programable (vea las paginas de manual de XF86_Accel para mas detalle. Estas son aplicables a las tarjetas S3, AGX y XGA-2). Este chip viene a permitir que el servidor X diga a la tarjeta que relojes usar. Si este es el caso, no debe haber una lista de valores válidos de reloj en el archivo XF86Config. Si no, la lista de valores de reloj que devuelve Xprobeonly contendrá solo uno o dos valores discretos de reloj, dejando el resto copiados de los primeros o a cero. Para placas con reloj programable, deberá usar una linea ClockChip en lugar de Clocks. Esta línea da el nombre del chip correspondiente a la tarjeta. Esos nombres se encuentran en las paginas de manual. Por ejemplo, en el archivo README.S3, veremos que diversas tarjetas S3-864 utilizan un chip "ICD2061A", y deberá existir la linea ClockChip "icd2061a" en lugar de la linea Clocks en el archivo XF86Config. Como sucede con Clocks, la linea formara parte de la sección Devices e ira a continuación de Chipset. De manera similar, algunas tarjetas aceleradas requieren que se especifique el tipo de chip RAM-DAC del archivo XF86Config, con una linea Ramdac. Esta opción se describe en XF86_Accel. Normalmente, el servidor X ya se ocupa de tomar un valor correcto para el RAMDAC. Algunas tarjetas gráficas necesitan que se especifiquen diversas opciones en la sección Devices. Estas opciones se describen en archivos como README.cirrus o paginas de manual, y se integran en una linea Opción del archivo XF86Config. Por ejemplo, una tarjeta #9 GXE 64 necesita dos opciones: Option number_nine" Option "dac_8_bit" José Luis Elvira Valenzuela, ITESO-DESI 1999 100 Normalmente, el servidor X funcionara sin las opciones, pero conviene ponerlas para aumentar el rendimiento de la tarjeta. Hay muchas opciones y muchas particulares de cada tarjeta. Para utilizarlas, mire los archivos del directorio : /usr/X11R6/lib/X11/doc Así pues, cuando haya acabado, tendrá una sección Devices como la siguiente: Section "Device" # Solo valida para la tarjeta #9 GXE 64 ! Identifier "#9 GXE 64" Chipset "mmio_928" ClockChip "icd2061a" Option ñumber_nine" Option "dac_8_bit" EndSection Observe que en muchos casos se requiere una línea Clocks en lugar de Clockchip, etc. Lo anterior es solo un ejemplo. Hay otras opciones para la sección Devices. Los detalles los vera en las páginas de manual correspondientes. José Luis Elvira Valenzuela, ITESO-DESI 1999 101 4.- Administración del sistema. Este capítulo es una visión general de la administración de un sistema Linux, incluyendo un numero de posibilidades avanzadas que no son, necesariamente, solo para administradores de sistemas. Igual que cada perro tiene su día, cada sistema tiene su administrador, y poner en marcha el sistema es un trabajo muy importante y a veces consume mucho tiempo, incluso si se es el único usuario en el sistema. Hemos intentado cubrir aquí los elementos más importantes acerca de la administración de sistemas que se necesitan conocer cuando se use Linux, en suficiente detalle para empezar confortablemente. Para mantenerlo corto y agradable, solo hemos cubierto los niveles más básicos y nos hemos saltado muchos e importantes detalles. Se debe leer el Linux System Administrator's Guide si se quiere ejecutar Linux en serio. Le ayudara a comprender mejor como funcionan las cosas y como se ensamblan juntas. Al menos hojéelo para que pueda conocer que contiene y que tipo de ayuda puede esperar de el. Acerca de Raíces, Sombreros y la Sensación de Poder Como sabe, UNIX distingue entre diferentes usuarios para que lo que hagan a los demás y al sistema pueda ser regulado (uno no desearía que nadie pudiese leer nuestras cartas de amor, por ejemplo). Cada usuario recibe una cuenta que incluye un nombre de usuario, un directorio inicial, y otras cosas por el estilo. Además de las cuentas dadas a personas reales, existen cuentas especiales, definidas por el sistema, que tienen privilegios especiales. La más importante de estas es la cuenta raíz, con el nombre de usuario root. La cuenta root Los usuarios normales están restringidos normalmente para que no puedan dañar a nadie mas en el sistema, solo a ellos mismos. Los permisos de los archivos en el sistema están preparados para que los usuarios normales no tengan permitido borrar o modificar archivos en directorios compartidos por todos los usuarios (como son /bin y /usr/bin. Muchos usuarios también protegen sus propios archivos con los permisos adecuados para que otros usuarios no puedan acceder o modificar estos archivos. Estas restricciones desaparecen para root. El usuario root puede leer, modificar o borrar cualquier archivo en el sistema, cambiar permisos y pertenencias en cualquier archivo, y ejecutar programas especiales, como pueden ser los que particionan un disco o crean sistemas de archivos. La idea básica es que la persona o personas que José Luis Elvira Valenzuela, ITESO-DESI 1999 102 ejecutan y cuidan del sistema entren como root cuando sea necesario para realizar tareas que no pueden ser ejecutadas por un usuario normal. Puesto que root puede hacer todo, es fácil cometer errores que tengan consecuencias catastróficas cuando se trabaja utilizando esta cuenta. Por ejemplo, como un usuario normal, si inadvertidamente se intentase borrar todos los archivos en /etc, el sistema no lo permitiría. Sin embargo, como usuario root, el sistema no diría nada. Es muy simple el dañar el sistema utilizando root. La mejor forma de evitar accidentes es: Pensárselo dos veces antes de apretar <return> en un comando que pueda causar daño. Por ejemplo, si se va a borrar un directorio, antes de pulsar <return> releer el comando completo y asegurarse que es correcto. No acostumbrarse a utilizar root. Cuanto más confortable se encuentre uno trabajando con el usuario root, más seguro que se confundirán los privilegios con los de un usuario normal. Por ejemplo, puede uno pensar que se esta conectado como larry, cuando realmente se esta conectado como root. Utilice un marcador distinto para la cuenta root. Se debe cambiar el archivo .bashrc o el .login de root para poner el marcador del interprete a algo distinto del marcador de usuario normal. Por ejemplo, mucha gente utiliza el carácter "$" como marcador para los usuarios normales, y reserva el carácter "#" como marcador para el usuario root. Conectarse como root solo cuando sea absolutamente necesario. Y desconectarse tan pronto como se haya terminado el trabajo. Cuanto menos se use la cuenta root, menos posibilidades habrá de dañar el sistema. Por supuesto, existe una variante de hackers de UNIX que utilizan root para prácticamente todo. Pero cada uno de ellos ha cometido, en algún momento, algún error tonto como root y corrompido el sistema. La regla general es que hasta que se familiarice con la falta de restricciones de root, y este cómodo utilizando el sistema sin dichas restricciones, procure conectarse como root lo menos posible. Por supuesto, todo el mundo comete errores. El mismo Linus Torvalds borro accidentalmente una vez el árbol de directorios completo del núcleo de su sistema. Horas de trabajo se perdieron para siempre. Afortunadamente, sin embargo, gracias a su conocimiento del código del sistema de archivos, fue capaz de reiniciar el sistema y reconstruir el árbol de directorios del disco a mano. José Luis Elvira Valenzuela, ITESO-DESI 1999 103 Pongámoslo de otra forma, si se imagina la utilización de la cuenta root como la utilización de un sombrero mágico especial que le da montones de poderes, pudiendo, con un gesto de la mano, destruir ciudades enteras, es una buena idea de lo que es ser un poco cauto con lo que se hace con las manos. Puesto que es fácil mover la mano de manera destructiva por accidente, no es una buena idea el llevar el sombrero mágico cuando no es necesario, a pesar de la maravillosa sensación. Abusando del sistema Junto con el sentimiento de poder llega la tendencia a hacer daño. Este es uno de los puntos oscuros de la administración de sistemas UNIX, pero todo el mundo pasa por ello en algún momento. Muchos usuarios de sistemas UNIX nunca tienen la posibilidad de manejar este poder en los sistemas UNIX de universidad y de empresas, solo los altamente cualificados (y altamente pagados) administradores de sistemas llegan a conectarse como root. De hecho, en muchas de esas instituciones, la clave de root es un secreto celosamente guardado: es tratado como el Sagrado Grial de la institución. Se monta mucho jaleo con la conexión como root; esta visto como un sabio y a la vez espantoso poder, dado solo a un reducido grupo de elegidos. Este tipo de actitud hacia la cuenta root es, sencillamente, el tipo de actitud que alimenta la malicia y el desprecio. Ya que root es tan atractivo, cuando algunos usuarios tienen su primera oportunidad de conectarse como root (ya sea en un sistema Linux, o en cualquier otro sitio), la tendencia es a utilizar los privilegios de root de forma descuidada. Yo he conocido "administradores de sistemas" (por llamarlos de alguna forma) que leen el correo de otros usuarios, borran archivos de usuario sin avisar y que, de forma general, se comportan como niños cuando se les da un "juguete" poderoso. Puesto que root tiene tantos privilegios en el sistema, se necesita una cierta madurez y auto- control para utilizar la cuenta de la forma para la que esta diseñada para ejecutar el sistema. Existe un código de honor no hablado entre el administrador y los usuarios del sistema. >Como se sentiría si su administrador de sistemas leyese su correo electrónico o mirase sus archivos? Aun no hay ningún precedente legal firme acerca de la intimidad electrónica en sistemas de computadoras de tiempo compartido. En sistemas UNIX, el usuario root tiene la posibilidad de saltarse todos los mecanismos de seguridad y privacidad del sistema. Es importante que el administrador del sistema desarrolle una relación de confianza con los usuarios del sistema. Es algo en lo que nunca se puede insistir lo suficiente. José Luis Elvira Valenzuela, ITESO-DESI 1999 104 Como proceder con los usuarios La seguridad en UNIX es bastante laxa por diseño. La seguridad del sistema fue un pensamiento posterior el sistema se desarrolló originalmente en un entorno donde las intrusiones de un usuario en otro eran algo inaudito. Por esto, incluso con medidas de seguridad, aun existe la posibilidad de que usuarios normales hagan daño. Los administradores de sistemas pueden tomar dos posturas cuando traten con usuarios abusivos: ser paranoicos o confiados. El administrador de sistemas paranoico normalmente causa mas daño que el que previene. Una de mis citas favoritas es, “nunca atribuyas a la malicia nada que pueda ser atribuido a la estupidez." Dicho de otra forma, muchos usuarios no tienen la habilidad o el conocimiento para hacer daño real al sistema. El 90% del tiempo, cuando un usuario causa problemas en el sistema (por ejemplo, rellenando la partición de usuarios con grandes archivos, o ejecutando múltiples instancias de un gran programa), el usuario simplemente desconoce que lo que esta haciendo es un problema. He ido a ver a usuarios que estaban causando una gran cantidad de problemas, pero su actitud estaba causada por la ignorancia no por la malicia. Cuando se enfrente con usuarios que puedan causar problemas potenciales no sea acusativo. La antigua regla de "inocente hasta que se demuestre lo contrario" sigue siendo valida. Es mejor una simple charla con el usuario, preguntándole acerca del problema, en lugar de causar una confrontación. Lo ultimo que se desea es estar entre los malos desde el punto de vista del usuario. Esto levantaría un montón de sospechas acerca de si usted el “administrador de sistemas” tiene el sistema correctamente configurado. Si un usuario cree que usted le disgusta o no le tiene confianza, le puede acusar de borrar archivos o romper la privacidad del sistema. Esta no es, ciertamente, el tipo de situación en la que quisiera estar. Si encontrase que un usuario ha estado intentando "romper" el sistema, o ha estado haciendo daño al sistema de forma intencionada, no devuelva el comportamiento malicioso a su vez. En vez de ello, simplemente, dele un aviso, pero sea flexible. En muchos casos, se puede cazar a un usuario "con las manos en la masa" dañando al sistema avísele. Dígale que no lo vuelva a repetir. Sin embargo, si le vuelve a cazar haciendo daño, entonces puede estar absolutamente seguro de que es intencionado. Ni siquiera puedo empezar a describir la cantidad de veces que parecía que había un usuario causando problemas al sistema, cuando de hecho, era o un accidente o un fallo mío. José Luis Elvira Valenzuela, ITESO-DESI 1999 105 Fijando las reglas La mejor forma de administrar un sistema no es con un puño de hierro. Así puede ser como se haga lo militar, pero UNIX no fue diseñado para ese tipo de disciplina. Tiene sentido el escribir un conjunto sencillo y flexible de reglas para los usuarios, pero recuerde, cuantas menos reglas tenga, menos posibilidades habrá de romperlas. Incluso si sus reglas para utilizar el sistema son perfectamente razonables y claras, siempre habrá momentos en que los usuarios romperán dichas reglas sin pretenderlo. Esto es especialmente cierto en el caso de usuarios UNIX nuevos, que están aprendiendo los entresijos del sistema. No esta suficientemente claro, por ejemplo, que uno no debe bajarse un gigabyte de archivos y enviárselo por correo a todos los usuarios del sistema. Los usuarios necesitan comprender las reglas y por que están establecidas. Si especifica reglas de uso para su sistema, asegúrese de que el motivo detrás de cada regla particular este claro. Si no lo hace, los usuarios encontraran toda clase de formas creativas de saltársela y no saber que en realidad la están rompiendo. Lo que todo esto significa No podemos decirle como ejecutar su sistema al ultimo detalle. Mucha de la filosofía depende en como se use el sistema. Si se tienen muchos usuarios, las cosas son muy diferentes de si solo tiene unos pocos o si se es el único usuario del sistema. Sin embargo, siempre es una buena idea en cualquier situación comprender lo que ser administrador de sistema significa en realidad. Ser el administrador de un sistema no le hace a uno un mago del UNIX. Hay muchos administradores de sistemas que conocen muy poco acerca de UNIX. Igualmente, hay muchos usuarios “normales" que saben mas acerca de UNIX que lo que cualquier administrador de sistemas. También, ser el administrador de sistemas no le permite el utilizar la malicia contra sus usuarios. Aunque el sistema le de el privilegio de enredar en los archivos de los usuarios, no significa que se tenga ningún derecho a hacerlo. Por ultimo, ser el administrador del sistema no es realmente una gran cosa. No importa si sus sistema es un pequeño 386 o una super computadora Cray. La ejecución del sistema es la misma. El saber la clave de root no significa ganar dinero o fama. Tan solo le permitirá ejecutar el sistema y mantenerlo funcionando. Eso es todo. José Luis Elvira Valenzuela, ITESO-DESI 1999 106 4.1.- Cuentas para usuarios en el sistema. 4.1.1.- Cuentas de usuario. 4.1.2.- Procedimientos de acceso. 4.1.3.- Creando cuentas para usuario manualmente. Añadiendo usuarios Cuando se añade un usuario hay varios pasos a seguir. 1.- se le debe crear una entrada en /etc/passwd, con un nombre de usuario y UID únicos. Se debe especificar el GID, nombre completo y resto de información. 2.- Se debe crear el directorio inicial, y poner los permisos en el directorio para que el usuario sea el dueño. 3.- Se deben suministrar archivos de comandos de inicialización en el nuevo directorio y se debe hacer alguna otra configuración del sistema (por ejemplo, preparar un buzón para el correo electrónico entrante para el nuevo usuario). Aunque no es difícil el añadir usuarios a mano, cuando se esta ejecutando un sistema con muchos usuarios, es fácil el olvidarse de algo. La manera mas simple de añadir usuarios es utilizar un programa interactivo que vaya preguntando por la información necesaria y actualice todos los archivos del sistema automáticamente. El nombre de este programa es useradd o adduser dependiendo del software que esté instalado. Las páginas man para estos comandos deberían ser suficientemente autoexplicatorias. Borrando usuarios De forma parecida, borrar usuarios puede hacerse con los comandos userdel o deluser dependiendo de que software fuera instalado en el sistema. Si se desea "deshabitar" temporalmente un usuario para que no se conecte al sistema (sin borrar la cuenta del usuario), se puede prefijar con un asterisco ("*") el campo de la clave en /etc/passwd. Por ejemplo, cambiando la linea de /etc/passwd correspondiente a kiwi a kiwi:*Xv8Q981g71oKK:102:100:Laura Poole:/home/kiwi:/bin/bash José Luis Elvira Valenzuela, ITESO-DESI 1999 107 evitará que kiwi se conecte. Poniendo atributos de usuario Después de que haya creado un usuario, puede necesitar cambiar algún atributo de dicho usuario, como puede ser el directorio inicial o la clave. La forma mas simple de hacer esto es cambiar los valores directamente en /etc/passwd. Para poner clave a un usuario, utilice el comando passwd. Por ejemplo, # passwd larry cambiara la clave de larry. Solo root puede cambiar la clave de otro usuario de esta forma. Los usuarios pueden cambiar su propia clave con passwd también. En algunos sistemas, los comandos chfn y chsh están disponibles, permitiendo a los usuarios el cambiar sus atributos de nombre completo e interprete de conexión. Si no, deben pedir al administrador de sistemas que los cambie por ellos. Grupos Como hemos citado anteriormente, cada usuario pertenece a uno o mas grupos. La única importancia real de las relaciones de grupo es la perteneciente a los permisos de archivos, cada archivo tiene un "grupo propietario" y un conjunto de permisos de grupo que define de que forma pueden acceder al archivo los usuarios del grupo. Hay varios grupos definidos en el sistema, como pueden ser bin, Mail, y sys. Los usuarios no deben pertenecer a ninguno de estos grupos; se utilizan para permisos de archivos del sistema. En su lugar, los usuarios deben pertenecer a un grupo individual, como users. Si se quiere ser detallista, se pueden mantener varios grupos de usuarios como por ejemplo estudiantes, soporte y facultad. El archivo /etc/group contiene información acerca de los grupos. El formato de cada linea es nombre de grupo:clave:GID:otros miembros Algunos ejemplos de grupos pueden ser: José Luis Elvira Valenzuela, ITESO-DESI 1999 108 root:*:0: usuarios:*:100:mdw,larry invitados:*:200: otros:*:250:kiwi El primer grupo, root, es un grupo especial del sistema reservado para la cuenta root. El siguiente grupo, users, es para usuarios normales. Tiene un GID de 100. Los usuarios mdw y larry tienen acceso a este grupo. Recuérdese que en /etc/passwd cada usuario tiene un GID por defecto. Sin embargo, los usuarios pueden pertenecer a mas de un grupo, añadiendo sus nombres de usuario a otras líneas de grupo en /etc/group. El comando groups lista a que grupos se tiene acceso. El tercer grupo, invitados, es para usuarios invitados, y otros es para "otros" usuarios. El usuario kiwi tiene acceso a este grupo. Como se puede ver, el campo "clave" de /etc/group raramente se utiliza. A veces se utiliza para dar una clave para acceder a un grupo. Esto es raras veces necesario. Para evitar el que los usuarios cambien a grupos privilegiados (con el comando newgroup), se pone el campo de la clave a "*". Se pueden usar los comandos addgroup o groupadd para añadir grupos a su sistema. Normalmente es mas sencillo añadir líneas a /etc/group uno mismo, puesto que no se necesitan mas configuraciones para añadir un grupo. Para borrar un grupo, solo hay que borrar su entrada de /etc/group. José Luis Elvira Valenzuela, ITESO-DESI 1999 109 4.2.- Personalizando el entorno. 4.2.1.- El shell como un lenguaje de programación. Suponiendo que se tiene una gran cantidad de archivos que son programas en C y queremos compilar solo los que contengan la cadena include. $ > > > > > > for file in * do if grep -l include $file then more $file fi done Lo cual también se puede hacer en una sola línea con el comando : $ more `grep -l include *` o su sinónimo : $ more $(grep -l include *) Generando un script. # Este programa busca todos los archivos en el directorio actual que contengan # la cadena include y muestra en la salida estándard todos aquellos que # encuentre. for file in * do if grep -q include $file then more $file fi done exit 0 José Luis Elvira Valenzuela, ITESO-DESI 1999 110 Creando un directorio y copiando los scripts ejecutables al directorio. $ $ $ $ chmod +x prueba1.sh mkdir util mv prueba1.sh util PATH=$HOME/util:$PATH Variables de ambiente. Variable de ambiente. Descripción. $HOME El directorio home del usuario. $PATH La lista de directorios separada por dos puntos para la búsqueda de comandos. $PS1 El prompt. $PS2 Un prompt secundario, usado cuando se requiere una entrada adicional. $IFS Un campo separador de entradas. Una lista de caracteres que son usados para separar palabras cuando el shell está leyendo una entrada. $0 Si se está ejecutando un script, el nombre del script. $# El número de parámetros pasados a un script. $$ El identificador del proceso $ saludo=Hola $ echo $saludo Hola $ saludo="que tal" $ echo $saludo que tal $ saludo=6+3 $ echo $saludo 6+3 Comillas. Normalmente los parámetros están separados por espacios en blanco, si se quiere que un parámetro contenga uno o más espacios en blanco, se deben de usar comillas. José Luis Elvira Valenzuela, ITESO-DESI 1999 111 # prueba2.sh myvar="Hola a todos" echo $myvar echo "$myvar" echo '$myvar' echo \$myvar echo Dame un texto read myvar echo '$myvar' ahora es igual a $myvar exit 0 $ prueba2.sh Hola a todos Hola a todos $myvar $myvar Dame un texto Adios a todos $myvar ahora es igual a Adios a todos Variables parámetros Si el script es llamado con parámetros, algunas variables adicionales son creadas. Aunque no se pasen parámetros, la variable de ambiente $# se pasa con el valor de 0. Variable parámero. Descripción. $1, $2, ... Los parámetros que son pasados al script. $* Una lista de parámetros, un una sola variable, separada por el primer carácter en la variable de ambiente IFS. $G Una variación en $*, que no usan la variable IFS. José Luis Elvira Valenzuela, ITESO-DESI 1999 112 $ IFS='' $ set uno dos tres $ echo "$@" uno dos tres $ echo "$*" unodostres $ IFS=' ' $ echo "$*" uno dos tres # prueba3.sh saludo="Hola" echo $saludo echo "Estamos corriendo el programa $0" echo "El segundo parámetro es $2" echo "El primer parámetro es $1" echo "La lista de parámetros es $*" echo "El directorio del usuario es $HOME" echo "Teclea un nuevo saludo" read saludo echo $saludo echo "Aquí termina el script." exit 0 $ prueba3.sh uno dos tres Hola Estamos corriendo el programa /home/jluis/util/prueba3.sh El segundo parámetro es dos El primer parámetro es uno La lista de parámetros es uno dos tres El directorio del usuario es /home/jluis Teclea un nuevo saludo Buenos Días Buenos Días Aquí termina el script. José Luis Elvira Valenzuela, ITESO-DESI 1999 113 Condiciones. El comando test o []. Introduciremos el comando test usando una de las condiciones más simples: checando para ver si un archivo existe. if test –f hola.c then ... fi O se puede escribir if [ -f hola.c] then ... fi O bien podemos poner then en la misma línea. if [ -f hola.c]; then ... fi Comparación de cadenas de caracteres. Comparación de cadenas Cadena Cadena1=Cadena2 Cadena1!=Cadena2 -n Cadena -z Cadena José Luis Elvira Valenzuela, ITESO-DESI 1999 Resultado Verdadero si la cadena no está vacía. Verdadero si las cadenas son iguales. Verdadero si las cadenas no son iguales. Verdadero si la cadena no es nula. Verdadero si la cadena es nula (una cadena vacía). 114 Comparación aritmética. Comparación aritmética Expresión1 –eq Expresión2 Expresión1 –ne Expresión2 Expresión1 –gt Expresión2 Resultado Verdadero si las expresiones son iguales. Verdadero si las expresiones no son iguales. Verdadero si Expresión1 es mayor a Expresión2. Expresión1 –ge Expresión2 Verdadero si Expresión1 es mayor o igual a Expresión2. Expresión1 –lt Expresión2 Verdadero si Expresión1 es menor a Expresión2. Expresión1 –le Expresión2 Verdadero si Expresión1 es menor o igual a Expresión2. ! Expresión El operador ! niega la expresión y regresa verdadero si la expresión es falta y viceversa. Condiciones de archivos. Condiciones de archivos -d archivo -e archivo -f archivo -g archivo -r archivo -s archivo -u archivo -w archivo -x archivo Resultado Verdadero si el archivo es un directorio. Verdadero si el archivo existe. Verdadero si el archivo es un archivo. Verdadero si el identificador de grupo está establecido en el archivo. Verdadero si el archivo tiene permisos de lectura. Verdadero si el archivo tiene tamaño diferente de cero. Verdadero si el identificador de usuario está establecido en el archivo. Verdadero si el archivo tiene permisos de escritura. Verdadero si el archivo es ejecutable. José Luis Elvira Valenzuela, ITESO-DESI 1999 115 Estructuras de control. if condición then sentencias else sentencias fi for variable in valores do sentencias done while condición do sentencias done until condición do sentencias done 4.2.2.- Los scripts de inicialización. A parte de los scripts que puede crear, hay un número de estos que usa el intérprete de comandos para ciertos propósitos. Los más importantes son sus scripts de inicialización, scripts automáticamente ejecutados por el intérprete al abrir una sesión. Los scripts de inicialización son eso, simples scripts como los descritos arriba. De cualquier modo, son muy útiles para la inicialización de su entorno al ejecutarse automáticamente. Por ejemplo, si siempre usa la orden Mail para comprobar si tiene correo al iniciar una sesión, incluya en su script de inicialización dicha orden y será ejecutada automáticamente. Tanto Bash como Tcsh distinguen entre un intérprete de presentación y otras invocaciones del intérprete. Un intérprete de presentación es el que se ejecuta en el José Luis Elvira Valenzuela, ITESO-DESI 1999 116 momento de la presentación al sistema (login). Es el único que usara. De cualquier modo, si ejecuta una opción de salir a un intérprete desde algún programa, como vi, inicializa otra instancia del intérprete de comandos, el cual no es su interprete de presentación. Además, en cualquier momento que ejecuta un script, automáticamente esta arrancando otro intérprete que va a ser el encargado de ejecutar el script. Los archivos de inicialización usados por Bash son: /etc/profile (configurado por el administrador del sistema, y ejecutado por todos los usuarios de Bash en el momento de la presentación al sistema), $HOME/.bash_profile (ejecutado por una sesión de presentación Bash) y $HOME/.bashrc (ejecutadas por todas las sesiones Bash que no son de presentación). Si .bash_profile no esta presente, se usa en su lugar .profile. Tcsh usa los siguientes scripts de inicialización: /etc/csh.login (ejecutado por todos los usuarios de Tcsh en el momento de la presentación al sistema), $HOME/.tcshrc (ejecutado en la presentación al sistema por todas las instancias nuevas de Tcsh) y $HOME/.login (ejecutado en la presentación al sistema, seguido .tcshrc). Si .tcshrc no esta presente, .cshrc se usa en su lugar. Para entender completamente la función de estos archivos, necesitará aprender mas acerca del intérprete de comandos. La programación de scripts es una materia complicada. Lea las páginas de manual de bash y/o tcsh para aprender más sobre la configuración de su entorno. José Luis Elvira Valenzuela, ITESO-DESI 1999 117 4.3.- Control de procesos. 4.3.1.- Procesos en el sistema. Tareas y procesos Control de Tareas es una utilidad incluida en muchos shells (incluidas Bash y Tcsh), que permite el control de multitud de comandos o tareas al momento. Antes de seguir, deberemos hablar un poco sobre los procesos. Cada vez que usted ejecuta un programa, usted lanza lo que se conoce como proceso, que es simplemente el nombre que se le da a un programa cuando se esta ejecutando. El comando ps visualiza la lista de procesos que se están ejecutando actualmente, por ejemplo: /home/larry# ps PID TT STAT 24 3 S 161 3 R TIME COMMAND 0:03 (bash) 0:00 ps /home/larry# La columna PID representa el identificador de proceso. La ultima columna COMMAND, es el nombre del proceso que se esta ejecutando. Ahora solo estamos viendo los procesos que esta ejecutando Larry. Vemos que hay dos procesos, bash (Que es el shell o interprete de comandos que usa Larry), y el propio comando ps. Como puede observar, bash se ejecuta concurrentemente con el comando ps. El bash ejecutó ps cuando Larry tecleo el comando. Cuando ps termina de ejecutarse (después de mostrar la tabla de procesos), el control retorna al proceso bash, que muestra el prompt, indicando que esta listo para recibir otro comando. Un proceso que esta corriendo se denomina tarea para el shell. Los términos proceso y tarea, son intercambiables. Sin embargo, se suele denominar "tarea" a un proceso, cuando es usado en conjunción con control de tareas, que es un rasgo del shell que permite cambiar entre distintas tareas. En muchos casos, los usuarios solo ejecutan un trabajo cada vez, que es el último comando que ellos teclearon desde el shell. Sin embargo, usando el control de José Luis Elvira Valenzuela, ITESO-DESI 1999 118 tareas, usted podrá ejecutar diferentes tareas al mismo tiempo, cambiando entre cada uno de ellos conforme lo necesite. >Cuan beneficioso puede llegar a ser esto?. Supongamos que esta usted con su procesador de textos, y de repente necesita parar y realizar otra tarea, con el control de tareas, usted podrá suspender temporalmente el editor, y volver al shell para realizar cualquier otra tarea, y luego regresar al editor como si no lo hubiese dejado nunca. Lo siguiente solo es un ejemplo, hay montones de usos prácticos del control de tareas. Primer plano y Segundo plano Un proceso puede estar en Primer plano o en Segundo plano. Solo puede haber un proceso en primer plano al mismo tiempo, el proceso que esta en primer plano, es el que interactúa con usted recibe entradas de teclado, y envía las salidas al monitor. (Salvo, por supuesto, que haya re-dirigido la entrada o la salida). El proceso en segundo plano, no recibe ninguna señal desde el teclado por lo general, se ejecutan en silencio sin necesidad de interacción. Algunos programas necesitan mucho tiempo para terminar, y no hacen nada interesante mientras tanto. Compilar programas es una de estas tareas, así como comprimir un archivo grande. No tiene sentido que se siente y se aburra mientras estos procesos terminan. En estos casos es mejor lanzarlos en segundo plano, para dejar la computadora en condiciones de ejecutar otro programa. Los procesos pueden ser suspendidos. Un proceso suspendido es aquel que no se está ejecutando actualmente, sino que está temporalmente parado. Después de suspender una tarea, puede indicar a la misma que continúe, en primer plano o en segundo, según necesite. Retomar una tarea suspendida no cambia en nada el estado de la misma la tarea continuara ejecutándose justo donde se dejo. Tenga en cuenta que suspender un trabajo no es lo mismo que interrumpirlo. Cuando usted interrumpe un proceso (generalmente con la pulsación de <ctrl-C>, el proceso muere, y deja de estar en memoria y utilizar recursos del computadora. Una vez eliminado, el proceso no puede continuar ejecutándose, y deberá ser lanzado otra vez para volver a realizar sus tareas. También se puede dar el caso de que algunos programas capturan la interrupción, de modo que pulsando <ctrl-C> no se para inmediatamente. Esto se hace para permitir al programa realizar operaciones necesarias de limpieza antes de terminar7. De hecho, algunos programas simplemente no se dejan matar por ninguna interrupción. José Luis Elvira Valenzuela, ITESO-DESI 1999 119 Envío a segundo plano y eliminación de procesos Empecemos con un ejemplo sencillo. El comando yes es un comando aparentemente inútil que envía una serie interminable de y-es a la salida estándar. (Realmente es muy útil. Si se utiliza una tubería (o "pipe") para unir la salida de yes con otro comando que haga preguntas del tipo si/no, la serie de y-es confirmará todas las preguntas.) Pruebe con esto. /home/larry# yes y y y y y La serie de y-es continuará hasta el infinito, a no ser que usted la elimine, pulsando la tecla de interrupción, generalmente <ctrl-C>. También puede deshacerse de está serie de y-es redigiriendo la salida estándar de yes hacia /dev/null, que como recordará es una especie de "agujero negro" o papelera para los datos. Todo lo que usted envíe alli, desaparecerá. /home/larry# yes > /dev/null Ahora va mucho mejor, el terminal no se ensucia, pero el prompt del shell no retorna. Esto es porque yes sigue ejecutándose y enviando esos inútiles y-es a /dev/null. Para recuperarlo, pulse la tecla de interrupción. Supongamos ahora que queremos dejar que el comando yes siga ejecutándose, y volver al mismo tiempo al shell para trabajar en otras cosas. Para ello nos enviaremos a yes a segundo plano, lo que nos permitirá ejecutarlo, pero sin necesidad de interacción. Una forma de mandar procesos a segundo plano es añadiendo un carácter "&" al final de cada comando. /home/larry# yes > /dev/null & [1] 164 /home/larry# Como podrá ver, ha regresado al shell. José Luis Elvira Valenzuela, ITESO-DESI 1999 120 >Pero que es eso de "[1] 164"?, >se esta ejecutando realmente el comando yes? "[1]" representa el número de tarea del proceso yes. El shell asigna un numero a cada tarea que se esté ejecutando. Como yes es el único comando que se está ejecutando, se le asigna el numero de tarea 1. El numero "164" es el número de identificación del proceso, o PID, que es el numero que el sistema le asigna al proceso. Ambos números pueden usarse para referirse a la tarea como veremos después. Ahora usted tiene el proceso yes corriendo en segundo plano, y enviando constantemente la señal y hacia el dispositivo /dev/null. Para chequear el estado del proceso, utilice el comando interno de la shell jobs: /home/larry# jobs [1]+ Running /home/larry# yes >/dev/null & ¡Ahí esta!. También puede usar el comando ps, como mostramos antes, para comprobar el estado de la tarea. Para eliminar una tarea, utilice el comando kill. Este comando toma como argumento un número de tarea o un numero de ID de un proceso. Esta era la tarea 1, así que usando el comando /home/larry# kill %1 matara la tarea. Cuando se identifica la tarea con el numero de tarea, se debe preceder el numero con el carácter de porcentaje (“%"). Ahora que ya hemos matado la tarea, podemos usar el comando jobs de nuevo para comprobarlo: /home/larry# jobs [1]+ Terminated yes >/dev/null /home/larry# José Luis Elvira Valenzuela, ITESO-DESI 1999 121 La tarea está, en efecto, muerta, y si usa el comando jobs de nuevo, no mostrará nada. También podrá matar la tarea usando el numero de ID de proceso (PID), el cual se muestra conjuntamente con el ID de tarea cuando arranca la misma. En nuestro ejemplo el ID de proceso es 164, así que el comando /home/larry# kill 164 es equivalente a /home/larry# kill %1 No es necesario usar el "%" cuando nos referimos a una tarea a traves de su ID de proceso. Parada y relanzamiento de tareas Hay otra manera de poner una tarea en segundo plano. Usted puede lanzarlo como un proceso normal (en primer plano), pararlo, y después relanzarlo en segundo plano. Primero, lance el proceso yes en primer plano como lo haría normalmente: /home/larry# yes > /dev/null De nuevo, dado que yes corre en primer plano, no debe retornar el prompt de la shell. Ahora, en vez de interrumpir la tarea con <ctrl-C>, suspenderemos la tarea. El suspender una tarea no la mata: solamente la detiene temporalmente hasta que Ud. la retoma. Para hacer esto usted debe pulsar la tecla de suspender, que suele ser <ctrl-Z>. /home/larry# yes > /dev/null <ctrl-Z> [1]+ Stopped /home/larry# yes >/dev/null Mientras el proceso está suspendido, simplemente no se esta ejecutando. No gasta tiempo de CPU en la tarea. Sin embargo, usted puede retomar el proceso de nuevo como si nada hubiera pasado. Continuara ejecutándose donde se dejo. José Luis Elvira Valenzuela, ITESO-DESI 1999 122 Para relanzar la tarea en primer plano, use el comando fg (del ingles "foreground"). /home/larry# fg yes >/dev/null El shell muestra el nombre del comando de nuevo, de forma que tenga conocimiento de que tarea es la que ha puesto en primer plano. Pare la tarea de nuevo, con <ctrlZ>. Esta vez utilice el comando bg para poner la tarea en segundo plano. Esto hará que el comando siga ejecutándose igual que si lo hubiese hecho desde el principio con "&" como en la sección anterior. /home/larry# bg [1]+ yes >/dev/null & /home/larry# Y tenemos de nuevo el prompt. El comando jobs debería decirnos que yes se está ejecutando, y podemos matar la tarea con kill tal y como lo hicimos antes. >Como podemos parar la tarea de nuevo? Si pulsa <ctrl-Z> no funcionará, ya que el proceso está en segundo plano. La respuesta es poner el proceso en primer plano de nuevo, con el comando fg, y entonces pararlo. Como puede observar podrá usar fg tanto con tareas detenidas, como con las que estén segundo plano. Hay una gran diferencia entre una tarea que se encuentra en segundo plano, y una que se encuentra detenida. Una tarea detenida es una tarea que no se esta ejecutando, es decir, que no usa tiempo de CPU, y que no esta haciendo ningún trabajo (la tarea aun ocupa un lugar en memoria, aunque puede ser volcada a disco). Una tarea en segundo plano, se esta ejecutando, y usando memoria, a la vez que completando alguna acción mientras usted hace otro trabajo. Sin embargo, una tarea en segundo plano puede intentar mostrar texto en su terminal, lo que puede resultar molesto si esta intentando hacer otra cosa. Por ejemplo, si usted uso el comando /home/larry# yes & sin redirigir stdout a /dev/null, una cadena de y-es se mostraran en su monitor, sin modo alguno de interrumpirlo (no puede hacer uso de <ctrl-C> para interrumpir tareas en segundo plano). Para poder parar esas interminables y-es, tendría que usar el comando fg para pasar la tarea a primer plano, y entonces usar |_ctrl-C_ |para matarla. José Luis Elvira Valenzuela, ITESO-DESI 1999 123 Otra observación. Normalmente, los comandos "fg" y "bg" actúan sobre el último proceso parado (indicado por un "+" junto al número de tarea cuando usa el comando jobs). Si usted tiene varios procesos corriendo a la vez, podrá mandar a primer o segundo plano una tarea especifica indicando el ID de tarea como argumento de fg o bg, como en /home/larry# fg %2 (para la tarea de primer plano numero 2), o /home/larry# bg %3 (para la tarea de segundo plano numero 3). No se pueden usar los ID de proceso con fg o bg. Además de esto, si usa el numero de tarea por si solo, como : /home/larry# %2 es equivalente a : /home/larry# fg %2 Solo recordarle que el uso de control de tareas es una utilidad de la shell. Los comandos fg, bg y jobs son internos del shell. Si por algún motivo usted utiliza un shell que no soporta control de tareas, no espere disponer de estos comandos. Y además, hay algunos aspectos del control de tareas que difieren entre Bash y Tcsh. De hecho, algunos shells no proporcionan ningún control de tareas sin embargo, la mayoría de las shells disponibles para Linux soportan control de tareas. 4.3.2.- Corriendo comandos en tiempos especificados. El comando at Formatos del comando : Para planificar una tarea para la hora (hh) y el minuto (mm) indicados, utilizando un reloj de 24 horas. at hh:mm José Luis Elvira Valenzuela, ITESO-DESI 1999 124 Para planificar un trabajo para la hora (hh), minuto (mm), mes, día y año indicados. at hh:mm mes día año Para listar los trabajos indicados; es un alias de la orden atq. at –l Planifica un trabajo para el momento actual más el valor numérico en unidades de tiempo. at now +count time-units Cancela el trabajo que contenga un número de trabajo igual a job_id; es un alias de la orden atrm. at –d job_id Para planificar una o más órdenes para un momento determinado, utilice la orden at. Con ella puede determinar la hora y la fecha o ambas a la vez. El siguiente ejemplo ejecuta su tarea a la 1:23 AM. Si está trabajando antes de la hora especificada, el trabajo se ejecuta el mismo día, de lo contrario se ejecutará hasta el día siguiente. # at 1:23 >lp /usr/sales/reports/* >echo “Archivos impresos” | mail –s “trabajo realizado” boss <ctrl-D> job 756603300.a at Tues Jan 21 01:23:00 1997 El número de tarea, 756603300.a sirve para identificarla. Si se decide cancelar la tarea hay que hacerlo de la siguiente forma : $ at –d 756603300.a También se puede indicar una fecha para un trabajo. Por ejemplo, para planificar un trabajo a las 5:00 PM del 24 de enero, solo hay que escribir lo siguiente : José Luis Elvira Valenzuela, ITESO-DESI 1999 125 # at 17:00 Jan 24 >lp /usr/sales/reports/* >echo “Archivos impresos” | mail –s “trabajo realizado” boss ><ctrl-D> Si se quiere planificar varias órdenes con at, lo mejor es almacenarlas en un archivo. Si el nombre del archivo es getdone, por ejemplo, y se quieren planificar órdenes para las 10:00 AM, hay que escribir : $ at 10:00 <getdone o también : $ at 10:00 –f getdone Ejecución de tareas largas con batch El comando batch deja que sea el sistema operativo quien decida el momento adecuado para ejecutar el proceso. Cuando planifica un trabajo con batch, linux comienza y trabaja en el proceso siempre que la carga del sistema no sea demasiado alta. Las tareas que se ejecutan con batch lo hacen en segundo plano al igual que at. De hecho batch es un alias del comando at –b en la distribución de Red-Hat Linux. El formato de batch está compuesto por la lista de órdenes que siguen al comando batch; la lista termina con la secuencia <ctrl-D>. Ejemplo : # batch >sort /usr/sales/reports/* | lp >echo “Archivos impresos” | mail –s “Trabajo realizado” boss ><ctrl-D> job 7789001234.b at Fri Feb 21 11:43:09 1997 Planificación de órdenes con cron y crontab Para planificar órdenes o procesos de forma regular, utilice el programa cron. Debe de indicar las fechas y las horas en las que se desea que se ejecute una orden José Luis Elvira Valenzuela, ITESO-DESI 1999 126 dentro de archivos crontab. Los tiempos se pueden indicar en minutos, horas, días del mes, meses del año o días de la semana. El demonio cron No es un comando ; es un "demonio" , ó proceso que se arranca al encender la máquina y está permanentemente activo. Su misión es inspeccionar cada minuto los archivos crontab de los usuarios y ejecutar los comandos que allí se digan a los intervalos horarios que hayamos marcado. Como se acaba se señalar , los crontab son dependientes de cada usuario. Se deben seguir los siguientes pasos para modificar , añadir ó borrar un archivo crontab : 1 - Sacarlo a archivo usando el comando "crontab -l >/tmp/mio" , por ejemplo. 2 - Modificarlo con un editor de acuerdo a las instrucciones de formato que se explican a continuación. 3 - Registrar el nuevo archivo mediante el comando "crontab /tmp/mio" , por ejemplo. mira cada minuto el directorio /var/spool/crontabs y ejecuta los comandos El archivo crontab El formato del archivo es el siguiente : #minutos horas dia mes mes dia-semana comando ( # = comentario ) minutos : de 0 a 59. horas : de 0 a 23. dia del mes : de 0 a 31. mes : de 0 a 12. día semana : de 0 a 6 ( 0 = domingo , 1 = lunes ...) Aparte de la especificación normal , pueden utilizarse listas , es decir , rangos de valores de acuerdo con las siguientes reglas : José Luis Elvira Valenzuela, ITESO-DESI 1999 127 8-11 : Rango desde las 8 hasta las 11 ambas inclusive. 8,9,10,11 : Igual que antes ; desde las 8 hasta las 11. Si queremos incrementar en saltos diferentes de la unidad , podemos escribir la barra "/" : 0-8/2 : Desde las 12 hasta las 8 cada 2 horas. Equivale a 0,2,4,6,8 . El asterisco significa "todas" ó "todo". Por tanto : */2 : Cada dos horas. Ejemplos más evidentes : # ejecutar una salvita todos los dias 5 minutos despues de las 12 de la noche : 5 0 * * * /home/salvas/diaria.sh 1>>/home/salvas/log 2>&1 # ejecutar a las 2:15pm el primer dia de cada mes: 15 14 1 * * /home/salvas/mensual.sh 1>/dev/null 2>&1 # ejecutar de lunes a viernes a las diez de la noche - apagar la maquina que es muy tarde 0 22 * * 1-5 shutdown -h now 1>/dev/null 2>&1 # ejecutar algo cada minuto * * * * * /home/cosas/espia.sh José Luis Elvira Valenzuela, ITESO-DESI 1999 128 4.3.3.- Planificación de la prioridad de los procesos. José Luis Elvira Valenzuela, ITESO-DESI 1999 129 4.4.- Utilerías. 4.4.1.- Encontrando archivos y texto. Por último , veremos un comando de utilidad simililar a "ls" pero con mas opciones ; el comando "find" muestra en pantalla directorios y/o archivos atendiendo a opciones determinadas . Si bien la sintaxis es demasiado extensa para estudiarla en su totalidad , conviene ver algunos ejemplos : El comando toma como argumentos declaraciones en el formato find <directorio base> <opciones> [-print] Por tanto , para sacar en pantalla todos los archivos y directorios del disco , valdría con : # find / -print - Si se desean sólo archivos ó sólo directorios : # find / -type f -print ó # find / -type d -print respectivamente. Buscar todos los archivos y directorios que tengan más de 30 días de antigüedad : # find / -atime +30 -print El resto de las opciones sirve para buscar archivos con determinados permisos , mayores ó menores que un determinado tamaño. 4.4.2.- Respaldando archivos. Utilizando tar José Luis Elvira Valenzuela, ITESO-DESI 1999 130 El comando tar es utilizado normalmente para archivar archivos .El formato del comando tar es : tar opciones archivo1 archivo2 ...archivoN donde opciones es la lista de comandos y opciones para tar, y archivo1 hasta archivoN es la lista de archivos a añadir o extraer del archivo. Por ejemplo, el comando : # tar cvf backup.tar /etc empaquetará todos los archivos de /etc en el archivo tar backup.tar. El primer argumento de tar "cvf" es el "comando" tar. "c" le dice a tar que cree un nuevo archivo de archivo. La opcion "v" fuerza a tar en el modo detallado imprimiendo los nombres de los archivos según se archivan. La opcion "f" le dice a tar que el siguiente argumento backup.tar es el nombre del archivo a crear. El resto de los argumentos de tar son los nombres de archivos y directorios a añadir al archivo. El comando # tar xvf backup.tar extraerá el archivo tar backup.tar en el directorio actual. Esto puede ser peligroso a veces cuando se extraen archivos de un archivo tar, los archivos antiguos se sobreescriben. Por otra parte, antes de extraer archivos tar es importante conocer donde se deben desempaquetar los archivos. Por ejemplo, digamos que se archivaron los siguientes archivos: /etc/hosts,/etc/group, y /etc/passwd. Si se uso el comando : # tar cvf backup.tar /etc/hosts /etc/group /etc/passwd José Luis Elvira Valenzuela, ITESO-DESI 1999 131 el nombre de directorio /etc se añadió al principio de cada nombre de archivo. Para poder extraer los archivos en la localización correcta, se necesitara utilizar los siguientes comandos: # cd / # tar xvf backup.tar Puesto que los archivos se extraen con el nombre de camino almacenado en el archivo de archivo. Sin embargo, si se archivaron los archivos con los comandos # cd /etc # tar cvf hosts group passwd Los nombres de directorio no se salvaron en el archivo de archivo. Por esto se necesitara hacer "cd /etc" antes de extraer los archivos. Como se puede ver, el como haya sido creado un archivo tar marca una gran diferencia en como se extrae. Se puede usar el comando : # tar tvf backup.tar para mostrar un "índice" del archivo tar antes de desempaquetarlo. De esta forma se puede ver que directorio se utilizó como origen de los nombres de los archivos, y se puede extraer el archivo desde la localización correcta. Los comandos gzip y compress A diferencia de los programas de archivo para MS-DOS, tar no comprime automáticamente los archivos según los archiva. Por ello, si se están archivando dos archivos de un megabytes, el archivo tar resultante tendrá dos megabytes. El comando gzip puede utilizarse para comprimir un archivo (el archivo a comprimir no necesita ser un archivo tar). El comando : # gzip -9 backup.tar comprimirá backup.tar y le dejara con backup.tar.gz, que es la versión comprimida del archivo. José Luis Elvira Valenzuela, ITESO-DESI 1999 132 La opcion -9 le dice a gzip que utilice el mayor factor de compresión. El comando gunzip puede ser utilizado para descomprimir un archivo comprimido con gzip. Equivalentemente, se puede utilizar "gzip -d". gzip es una herramienta relativamente nueva en la comunidad UNIX. Durante muchos años, se utilizó en su lugar el comando compress. Sin embargo, debido a varios factores, compress se esta volviendo desfasado. Los archivos comprimidos con compress terminan en la extensión .Z. Por ejemplo, backup.tar.Z es la versión comprimida con compress de backup.tar, mientras que backup.tar.gz es la versión comprimida con gzip. El comando uncompress se utiliza para expandir un archivo comprimido con compress; gunzip sabe también como tratar los archivos comprimidos con compress. Juntándolo todo Por lo tanto, para archivar un grupo de archivos y comprimir el resultado, se pueden utilizar los comandos: # tar cvf backup.tar /etc # gzip -9 backup.tar El resultado será backup.tar.gz. Para desempaquetar este archivo, se usan los comandos contrarios: # gunzip backup.tar.gz # tar xvf backup.tar Por supuesto, asegúrese siempre de que esta en el directorio correcto antes de desempaquetar un archivo tar. Se pueden utilizar algunas mañas de UNIX para hacer todo esto en una sola línea de comando, como por ejemplo: # tar cvf - /etc | gzip -9c > backup.tar.gz Aqui estamos enviando el archivo tar a "-", que representa la salida estándar de tar. Esto es encolado hacia gzip, que comprime el archivo tar de entrada, y el resultado José Luis Elvira Valenzuela, ITESO-DESI 1999 133 se salva en backup.tar.gz. La opcion -c de gzip le dice que envíe su salida hacia la salida estándar, que es redirigida a backup.tar.gz. Un comando único para desempaquetar este archivo seria: # gunzip -c backup.tar.gz | tar xvf - De nuevo, gunzip descomprime el contenido de backup.tar.gz y envía el archivo tar resultante hacia la salida estándar. Esta es redirigida hacia tar, que lee de "-", refiriéndose esta vez a la entrada estándar de tar. Felizmente, el comando tar también incluye la opcion z para comprimir / descomprimir automáticamente los archivos al vuelo, utilizando el algoritmo de compresión de gzip. Por ejemplo, el comando # tar cvfz backup.tar.gz /etc es equivalente a : # tar cvf backup.tar /etc # gzip backup.tar Igual que el comando # tar xvfz backup.tar.Z se puede utilizar en vez de : # uncompress backup.tar.Z # tar xvf backup.tar Usando Diskettes y Haciendo Copias de Seguridad Los diskettes son utilizados normalmente como medio para copias de seguridad. Si no se tiene una unidad de cinta conectada al sistema, se pueden utilizar diskettes (a pesar de que sean mas lentos y ligeramente menos seguros). José Luis Elvira Valenzuela, ITESO-DESI 1999 134 También puede utilizar diskettes para contener sistemas de archivos individuales de esta forma, se puede montar mount el diskette para acceder a los datos contenidos en el. Utilizando diskettes para copias de seguridad La forma mas simple de hacer una copia de seguridad es con tar. El comando : # tar cvfzM /dev/fd0 / hará una copia de seguridad completa de su sistema utilizando el diskette /dev/fd0. La opcion "M" de tar permite que la copia de seguridad sea una copia multi-volumen; esto es, cuando un diskette está lleno, tar pedirá el siguiente. El comando : # tar xvfzM /dev/fd0 puede ser utilizado para recuperar la copia de seguridad completa. Este método puede ser utilizado también si se tiene una unidad de cinta (/dev/rmt0) conectada al sistema. Existen otros programas para hacer copias de seguridad multi-volumen; el programa backflops disponible en tsx-11.mit.edu puede ser útil. Hacer una copia de seguridad completa del sistema puede ser costoso en tiempo y recursos. Muchos administradores de sistemas utilizan una política de copias de seguridad increméntales, en la que cada mes se hace una copia de seguridad completa, y cada semana solo se copian aquellos archivos que hayan sido modificados en esa semana. En este caso, si el sistema se viene abajo a mitad de mes, solo tiene que restaurar la ultima copia de seguridad mensual completa y, después, las ultimas copias semanales según el caso. El comando find puede ser útil para localizar archivos que hayan cambiado desde una cierta fecha. Se pueden encontrar varios archivos de comandos para manejar copias de seguridad increméntales en sunsite.unc.edu. José Luis Elvira Valenzuela, ITESO-DESI 1999 135 Utilizando diskettes como sistemas de archivos Puede crearse un sistema de archivos en un diskette igual que lo haría en una partición de un disco duro. Por ejemplo : # mke2fs /dev/fd0 1440 crea un sistema de archivos en el diskette en /dev/fd0 . El tamaño del sistema de archivos debe corresponder al tamaño del diskette. Los diskettes de alta densidad de 3.5" tienen un tamaño de 1.44 megabytes, o 1440 bloques. Los diskettes de alta densidad de 5.25" tienen 1200 bloques. Para poder acceder a un diskette, se debe montar el sistema de archivos que contiene. Esto se puede hacer con el comando mount de la siguiente forma : # mount -t ext2 /dev/fd0 /mnt montará el diskette /dev/fd0 en el directorio /mnt. Ahora todos los archivos del diskette aparecerán bajo /mnt en su unidad. "-t ext2" especifica el tipo de sistema de archivos como ext2fs. Si crea otro tipo de sistema de archivos en el diskette, necesitara especificárselo al comando mount. El "punto de montaje" (el directorio donde esta montando el sistema de archivos) debe existir en el momento de utilizar el comando mount. Si no existiese, deba crearlo con el comando mkdir. Tenga en cuenta que cualquier entrada/salida al diskette se gestiona con buffers igual que si fuese de disco duro. Si cambia datos en el diskette, puede que no vea encenderse la luz de la unidad hasta que el nucleo decida vaciar sus buffers. Es importante que no quite un diskette antes de haberlo desmontado; esto puede hacerse con el comando : # umount /dev/fd0 No cambie los diskettes como se hace en un sistema MS-DOS; siempre que cambie diskettes, desmonte el primero y monte el siguiente. José Luis Elvira Valenzuela, ITESO-DESI 1999 136 4.5.- Software de administración de paquetes. 4.5.1.- Instalación de paquetes. Manejo de paquetes con RPM Red Hat Package Manager (RPM), es un sistema abierto de empaquetamiento disponible para cualquiera que quiera usarlo, que funciona tanto en Linux Red Hat como en otros sistemas Linux y UNIX. Red Hat Software invita a los demás distribuidores a que analicen RPM y lo usen en sus propios productos. RPM se distribuye bajo los términos de la GPL (General Public License). RPM proporciona al usuario final gran cantidad de características que hacen el mantenimiento del sistema algo mucho mas fácil de lo que nunca había sido. Instalar, desinstalar, y actualizar paquetes RPM son todo órdenes de una sola línea, y todos los sucios detalles son eliminados de su presencia. RPM mantiene una base de datos de los paquetes instalados y de sus archivos, lo que permite realizar potentes consultas y verificaciones del sistema. Durante las actualizaciones, RPM maneja los archivos de configuración de manera especial, para que nunca pierda sus ajustes -una cualidad que sería imposible con el uso de los archivos .tar.gz. RPM permite al desarrollador tomar el código fuente del programa y empaquetarlo dentro de los paquetes de archivos binarios y de fuentes para el usuario final. Este proceso es bastante sencillo y es gestionado mediante un único archivo, y opcionalmente mediante las actualizaciones que se desarrollen. Esta clara definición de fuentes “prístinas'', de sus actualizaciones y de las instrucciones de construcción, facilita el mantenimiento de los paquetes así como de las nuevas versiones del software conforme van siendo publicadas. Objetivos al diseñar RPM Antes de intentar comprender el uso de RPM, es bueno tener una idea de cuales son los objetivos en su diseño. Capacidad de actualización : Con RPM puede actualizar componentes individuales de su sistema sin necesidad de una reinstalación completa del mismo. Cuando obtenga una nueva versión de un sistema operativo basado en RPM (como Linux Red Hat), no tiene la necesidad de reinstalar su ordenador (como tiene que hacer con otros sistemas operativos basados en otros sistemas de empaquetamiento). RPM permite actualizaciones inteligentes y completamente automatizadas de su sistema. Los archivos de configuración de los paquetes son protegidos a lo largo de las actualizaciones, por lo que usted no perderá sus configuraciones. José Luis Elvira Valenzuela, ITESO-DESI 1999 137 Consultas potentes : RPM también está diseñado para tener potentes opciones de consulta. Usted puede hacer búsquedas de paquetes o de ciertos archivos a través de la base de datos en su totalidad. Usted puede también investigar a qué paquete pertenece un archivo y de dónde proviene éste. Los archivos contenidos en un paquete RPM se encuentran en formato comprimido, habitualmente con una cabecera del archivo binario que contiene información útil acerca del paquete y su contenido, permitiéndole buscar paquetes individuales rápida y fácilmente. Verificaciones del sistema : Otra característica importante es la capacidad de verificar paquetes. Si usted está preocupado porque ha borrado un archivo importante de algún paquete, simplemente verifique el paquete. Usted será notificado de las anomalías. Ahora, usted puede reinstalar el paquete si es necesario. Cualquier archivo de configuración que usted hubiera modificado se mantendrá durante la reinstalación. Fuentes prístinas : Un objetivo crucial a la hora del diseño fue el permitir el uso de la fuentes de codigo “prístinas'', tal y como son distribuidas por los autores originales del software. Con RPM, usted tiene las fuentes prístinas así como cualquier actualización que fuera usada, mas instrucciones completas de construcción. Esto es una gran ventaja por muchas razones. Por ejemplo, si aparece una nueva versión de un programa, no se tiene necesariamente que empezar desde el principio para compilarlo. Se pueden mirar las actualizaciones para ver qué debe hacer. Todas las opciones internas de compilación, y todos los cambios que fueron hechos para hacer que el software se creara adecuadamente son fácilmente visibles de esta manera. Este objetivo puede parecer únicamente importante para los desarrolladores pero también redunda en una mayor calidad de software para el usuario final. Nos gustaría dar las gracias a la gente de la distribución BOGUS por el concepto original de las fuentes prístinas. Usando RPM RPM tiene cinco modos básicos de operación (sin contar la construcción del paquete): instalación, desinstalación, actualización, consulta y verificación. Esta sección contiene un vistazo de cada modo. Para opciones y detalles completos pruebe rpm --help, vea la página “man'' de rpm. Instalación Los paquetes RPM tienen típicamente nombres de archivo como foo-1.0-1.i386.rpm, que incluye el nombre José Luis Elvira Valenzuela, ITESO-DESI 1999 138 del paquete (foo), versión (1.0), desarrollo (1), y arquitectura (i386). Instalar un paquete es tan sencillo como: $ rpm -ivh foo-1.0-1.i386.rpm foo #################################### Como puede ver, RPM imprime en pantalla el nombre del paquete (el cual no es necesariamente el mismo que el archivo, el cual puede ser 1.rpm), e imprime una sucesión de símbolos de rejilla a medida que el paquete es instalado, como un medidor del progreso de la instalación. La instalación de paquetes está diseñada para ser sencilla, pero puede obtener algunos errores: Paquete ya instalado Si el paquete está ya instalado, se verá: $ rpm -ivh foo-1.0-1.i386.rpm foo package foo-1.0-1 is already installed error: foo-1.0-1.i386.rpm cannot be installed Si se quiere instalar el paquete de todas maneras, se puede usar --replacepkgs en la línea de comandos, lo que le dice a RPM que ignore el error. Conflicto de archivos Si intenta instalar un paquete que contiene un archivo que ha sido ya instalado por algún otro paquete, se verá: # rpm -ivh foo-1.0-1.i386.rpm foo /usr/bin/foo conflicts with file from bar-1.0-1 error: foo-1.0-1.i386.rpm cannot be installed Para hacer que RPM ignore el error, use --replacefiles en la línea de comandos. Dependencias no resueltas José Luis Elvira Valenzuela, ITESO-DESI 1999 139 Los paquetes RPM pueden “depender'' de otros paquetes, lo cual significa que requieren que otros paquetes sean instalados para funcionar correctamente. Si intenta instalar un paquete para el cual existe una dependencia no satisfecha, usted verá: $ rpm -ivh bar-1.0-1.i386.rpm failed dependencies: foo is needed by bar-1.0-1 Para arreglar este error se deberán instalar los paquetes requeridos. Si se desea forzar la instalación de todas maneras (una mala idea ya que el paquete probablemente no funcionará correctamente), use –nodeps en la línea de comandos. Desinstalación Desinstalar un paquete es tan sencillo como instalarlo: $ rpm -e foo Notese que hemos usado el nombre “foo'' para el paquete, no el nombre del paquete original “foo-1.0-1.i386.rpm''. Se puede encontrar un error de dependencias cuando intente desinstalar el paquete si algún otro paquete instalado depende del que está intentando borrar. Por ejemplo: $ rpm -e foo removing these packages would break dependencies: foo is needed by bar-1.0-1 Para hacer que RPM ignore el error y desinstale el paquete de todas maneras (lo cual es una mala idea porque el paquete que depende de éste probablemente falle y no funcione correctamente), use --nodeps en la línea de comandos. Actualizando Actualizar un paquete es casi como instalar un paquete. $ rpm -Uvh foo-2.0-1.i386.rpm foo #################################### José Luis Elvira Valenzuela, ITESO-DESI 1999 140 Lo que no ve arriba es el hecho de que RPM desinstala automáticamente cualquier versión antigua del paquete foo. De hecho usted quizá quiera siempre usar -U para instalar paquetes, ya que funciona bien incluso cuando no hay ninguna versión anterior del paquete instalada. Dado que RPM realiza actualizaciones inteligentes de los paquetes con archivos de configuración, quizá se vea un mensaje como: saving /etc/foo.conf as /etc/foo.conf.rpmsave Esto significa que sus cambios al archivo de configuracion puedan no ser “reversiblemente compatibles'' con el nuevo archivo de configuración en el paquete, por lo que RPM salva su archivo original, e instala uno nuevo. Se debería investigar y resolver las diferencias entre los dos archivos tan pronto como sea posible para asegurarse de que su sistema continúa funcionando adecuadamente. Dado que actualizar es realmente una combinación de desinstalación e instalación, usted puede encontar los errores de los dos modos, y uno más: Si RPM piensa que está intentando actulizar un paquete con una versión antigua, usted verá: $ rpm -Uvh foo-1.0-1.i386.rpm foo package foo-2.0-1 (which is newer) is already installed error: foo-1.0-1.i386.rpm cannot be installed Para obligar a RPM a “actualizar'' de todas maneras, use --oldpackage en la línea de comandos. Consulta Consultar la base de datos de paquetes instalados se realiza mediante la opción : rpm -q. Un uso simple es rpm -q foo lo que imprimirá el nombre, versión y número de desarrollo del paquete instalado foo: $ rpm -q foo rpm-2.0-1 En lugar de especificar el nombre del paquete, se pueden usar las siguientes opciones con -q para especificar de qué paquete(s) quiere hacer una consulta. Éstas son llamadas Opciones de Especificacion de Paquetes (Package Specification Options). José Luis Elvira Valenzuela, ITESO-DESI 1999 141 -a consulta todos los paquetes instalados. -f <file> consultará el paquete al que pernenece <file>. -F es la misma que -f excepto que toma los nombres de archivo de la entrada estándar (p.e. find /usr/bin | rpm -qF). -p <packagefile> consulta el paquete <packagefile>. -P es como -p excepto que toma el nombre de archivo del paquete desde la entrada estándar (p.e. find /mnt/cdrom/RedHat/RPMS | rpm -qP). Hay varias formas de especificar qué informacion mostrar sobre los paquetes consultados. Las siguientes opciones son usadas para seleccionar la información en la que usted está interesado. Son las llamadas “Opciones de Selección de Información”. -i presenta información del paquete como nombre, descripción, desarrollo, tamaño, fecha de construcción, fecha de instalación, vendedor, y otra información miscelánea. -l presenta la lista de archivos que el paquete posee. -s presenta el estado de todos los archivos del paquete. Hay sólo dos posibles estados: normal y perdido. -d presenta un lista de archivos marcados como documentación (paginas “man”, paginas “info”, README's, etcétera). -c presenta una lista de archivos marcados como archivos de configuración. Estos son los archivos que usted cambia tras la instalación para adaptar el paquete a su sistema (sendmail.cf, passwd, inittab, etcétera). Para aquellas opciones que presenten listas de archivos, uste puede añadir -v a la línea de comandos para obtener la lista en el conocido formato ls -l. Verificación Verificar un paquete es comparar la información sobre los archivos instalados desde un paquete con la misma información del paquete original. Entre otras cosas, verificar compara el tamaño, chequeo MD5, permisos, tipo, usuario y grupo de cada archivo. José Luis Elvira Valenzuela, ITESO-DESI 1999 142 rpm -V verifica un paquete. Usted puede usar cualquiera de las Opciones de Selección de Paquetes (Package Selection Options) listadas para consultar, para especificar los paquetes que desea verificar. Un uso simple es rpm -V foo lo que verifica que todas los archivos el paquete foo estén como cuando fueron originalmente instaladas. Por ejemplo: Para verificar que un paquete contiene un archivo en particular: # rpm -Vf /bin/vi Para verificar TODOS los paquetes instalados: # rpm -Va Para verificar un paquete instalado con su correspondiente paquete RPM: # rpm -Vp foo-1.0-1.i386.rpm Esto puede ser útil si sospecha que su base de datos de paquetes RPM esta corrupta. Si todo es verificado adecuadamente no habrá ninguna salida en pantalla. Si hay alguna discrepancia sí habrá información presentada. El formato de la salida es una cadena de 8 caracteres, un posible “c” denotando un archivo de configuración, y despues el nombre del archivo. Cada uno de los 8 caracteres denota el resultado de la comparación de un atributo del archivo con el valor de ese atributo en la base de datos RPM. Un solo “.” (punto) significa que el test ha sido pasado. Los siguientes caracteres denotan fallo de ciertos tests: 5 S L T D U G M Chequeo MD5 Tamaño del archivo Enlace simbólico Modificación de la fecha del archivo Dispositivo Usuario Grupo Modo (incluye permisos y tipos de archivo) Si se ve alguna salida en pantalla, use su mejor juicio para determinar si usted deberá borrar o reinstalar el paquete, o alguna manera de resolver el problema. José Luis Elvira Valenzuela, ITESO-DESI 1999 143 Utilidades del RPM RPM es una herramienta muy útil tanto para manejar el sistema como para diagnosticar y solucionar problemas. La mejor manera de darnos cuenta de todas sus posibilidades es mirando algunos ejemplos. Supongamos que se borraron algunos archivos accidentalmente, pero no está seguro cuales. Si se quisiera verificar todo el sistema y ver qué es lo que puede haberse perdido, usted escribiría: # rpm -Va Si algunos archivos hubieran desaparecido, o parecieran estar *corruptos* , se debería o bien reinstalar el paquete, o bien desinstalarlo, y luego reinstalarlo de nuevo. Digamos que se topa con un archivo que no reconoce. Para averiguar a qué paquete pertenece, podríamos escribir : # rpm -qf /usr/X11R6/bin/xjewel El resultado sería: # xjewel-1.6-1 Podemos combinar los dos ejemplos anteriores con el siguiente ejemplo. Digamos que se está teniendo problemas con /usr/bin/paste. A usted le gustaría verificar el paquete que contiene ese programa pero no sabe qué paquete es. Simplemente introduzca: # rpm -Vf /usr/bin/paste y el paquete apropiado será verificado. Si usted está usando un programa y quiere averiguar más información sobre él, usted puede escribir lo siguiente para averiguar qué documentación viene con el paquete que “posee'' ese programa (en este caso ispell): # rpm -qdf /usr/bin/ispell El resultado sería: José Luis Elvira Valenzuela, ITESO-DESI 1999 144 /usr/man/man4/ispell.4 /usr/man/man4/english.4 /usr/man/man1/unsq.1 /usr/man/man1/tryaffix.1 /usr/man/man1/sq.1 /usr/man/man1/munchlist.1 /usr/man/man1/ispell.1 /usr/man/man1/findaffix.1 /usr/man/man1/buildhash.1 /usr/info/ispell.info.gz /usr/doc/ispell-3.1.18-1/README Usted encuentra un nuevo RPM llamado koules, pero usted no sabe qué es. Para averiguar algo de información sobre él, escriba: # rpm -qip koules-1.2-2.i386.rpm El resultado sería: Name : koules Distribution: Red Hat Linux Colgate Version : 1.2 Vendor: Red Hat Software Release : 2 Build Date: Mon Sep 02 11:59:12 1996 Install date: (none) Build Host: porky.redhat.com Group : Games Source RPM: koules-1.2-2.src.rpm Size : 614939 Summary : SVGAlib action game; multiplayer, network Description : This arcade-style game is novel in conception and excellent in execution. No shooting, no blood, no guts, no gore. The play is simple, but you still must develop skill to play. This version uses SVGAlib to run on a graphics console. Ahora se quiere saber qué archivos instala el RPM koules. Usted escribiría: # rpm -qlp koules-1.2-2.i386.rpm El resultado es: /usr/man/man6/koules.6 /usr/lib/games/kouleslib/start.raw /usr/lib/games/kouleslib/end.raw /usr/lib/games/kouleslib/destroy2.raw /usr/lib/games/kouleslib/destroy1.raw /usr/lib/games/kouleslib/creator2.raw José Luis Elvira Valenzuela, ITESO-DESI 1999 145 /usr/lib/games/kouleslib/creator1.raw /usr/lib/games/kouleslib/colize.raw /usr/lib/games/kouleslib /usr/games/koules Estos son sólo algunos ejemplos. Conforme usted utilice el sistema encontrará muchos más usos para rpm. José Luis Elvira Valenzuela, ITESO-DESI 1999 146 5.- Linux avanzado. 5.1- El proceso de arranque. 5.1.1.- El proceso de arranque, Init. Archivos de arranque del sistema Cuando el sistema arranca, se ejecutan automáticamente una serie de archivos de comandos (scripts) en el sistema, antes de que ningún usuario entre. Aqui tenemos una descripción de lo que ocurre: En tiempo de arranque, el nucleo arranca el proceso /etc/init. init es un programa que lee su archivo de configuración, /etc/inittab, y arranca otros procesos basados en el contenido de este archivo. Uno de los procesos mas importantes arrancado desde inittab es el proceso /etc/getty, arrancado en cada consola virtual. El proceso getty dispone la consola virtual para ser utilizada y arranca un proceso login en ella. Esto le permite conectarse a cada consola virtual; si /etc/inittab no contiene un proceso getty para una consola virtual determinada, no se podrá conectar nadie a ella. Otro proceso ejecutado desde /etc/inittab es /etc/rc, el archivo de inicialización principal del sistema. Este archivo es simplemente un archivo de comandos que ejecuta cualquier comando de inicialización necesario en tiempo de arranque, como es montar los sistemas de archivos e inicializar el espacio de intercambio (memoria virtual). Su sistema puede ejecutar otros archivos de comandos de inicialización también, como puede ser /etc/rc.local. El archivo /etc/rc.local contiene normalmente comandos de inicialización específicos de su sistema, como puede ser el establecimiento del nombre de la computadora. rc.local puede ser arrancado desde /etc/rc o directamente desde /etc/inittab 5.1.2.-Corriendo programas durante el proceso de arranque. El archivo /etc/rc.d/rc.local es ejecutado durante el proceso de arranque, después de que se halla completado cualquier otra inicialización, y cuando se cambien niveles de arranque. Aquí se pueden agregar comandos adicionales a la inicialización. Quizá se quiera arrancar algunos demonios adicionales, o inicializar una impresora. Además, si se requiere configurar un puerto serial, se puede editar el José Luis Elvira Valenzuela, ITESO-DESI 1999 147 archivo /etc/rc.d/rc.serial y será ejecutado automáticamente durante el proceso de arranque. Por default /etc/rc.d/rc.local simplemente crea un mensaje de entrada con la versión del kernel y el tipo de máquina. 5.1.3.- Dando de baja el sistema. Para apagar Red Hat Linux,hay que utilizar el comando shutdown., los usos más comunes son : shutdown -h now shutdown -r now Cualquiera de los dos dará de baja el sistema limpiamente, el primero apagará la computadora, el segundo reiniciará. 5.2.- Cambiando niveles de arranque. 5.2.1.- Introducción a los niveles de arranque. Niveles de ejecución del proceso init Generalmente, Linux Red Hat se ejecuta en el nivel 3 (modo multiusuario completo). En Linux Red Hat se usan los siguientes niveles de ejecución: 0 1 2 3 4 5 6 Halt. Modo de monousuario. Modo Multiusuario sin NFS. Modo multiusuario completo. No usado Modo multiusuario con interface X Rearranque. Si su máquina entra en un estado en el qué es imposible arrancar, como consecuencia de un archivo /etc/inittab defectuoso, o no le permite registrarse por tener corrupto el archivo /etc/passwd o simplemente por haber olvidado su contraseña, deberá arrancar con un Modo de usuario simple, tecleando en el prompt de arranque de LILO, linux 1. Aparecerá un sistema muy simple, con un intérprete de comandos desde el que podrá arreglar las cosas. José Luis Elvira Valenzuela, ITESO-DESI 1999 148 5.2.2.- Cambiando los niveles de arranque. El nivel de arranque por default es decidido en el archivo /etc/inittab. Se debe de tener una linea cerca del inicio del archivo como esta : id:3:initdefault: De esto, hay que fijarnos en la segunda columna y ver que el nivel de arranque por default es 3, y debe de ser el caso de muchos sistemas. Si se quiere cambiar, se puede editar /etc/inittab a mano y cambiar el 3 por otro. Hay que ser muy cuidadosos de no dañar el archivo inittab. Si se daña, se puede arreglar reiniciando de la siguiente forma : LILO boot: linux single Esto nos debe de permitir arrancar en el modo de un solo usuario tal que se puede arreglar el archivo inittab. 5.3.- El sistema de archivos de Linux 5.3.1.- Introducción al sistema de archivos. 5.3.2.- La estructura de archivos de Linux. José Luis Elvira Valenzuela, ITESO-DESI 1999 149 5.4.- Montando sistemas de archivos. 5.4.1.- Montando sistemas de archivos. Para empezar, algunos conceptos acerca de sistemas de archivos. Antes de que un sistema de archivos sea accesible al sistema, debe ser montado en algún directorio. Por ejemplo, si se tiene un sistema de archivos en un diskette, se debe montar bajo algún directorio, digamos /mnt, para poder acceder a los archivos que contiene. Tras montar el sistema de archivos, todos los archivos en dicho sistema aparecen en ese directorio. Tras desmontar el sistema de archivos, el directorio (en este caso, /mnt) estará vacío. Lo mismo es válido para los sistemas de archivos del disco duro. El sistema monta automáticamente los sistemas de archivos del disco duro en tiempo de arranque. El así llamado "sistema de archivos raíz" es montado en el directorio /. Si se tiene un sistema de archivos separado para /usr, por ejemplo, se monta en /usr. Si solo se tiene un sistema de archivos raíz, todos los archivos (incluyendo los de /usr) existen en ese sistema de archivos. El comando mount se utiliza para montar un sistema de archivos. El comando : mount –av se ejecuta desde el archivo /etc/rc (que es el archivo de inicialización del sistema, ejecutado en tiempo de arranque. El comando mount -av obtiene información de los sistemas de archivos y puntos de montaje del archivo /etc/fstab. Este es un ejemplo de archivo /etc/fstab: # dispositivo directorio tipo opciones /dev/hda2 /dev/hda3 /dev/hda4 /proc / /usr none /proc ext2 ext2 swap proc defaults defaults sw none El primer campo es el dispositivo el nombre de la partición a montar. El segundo campo es el punto de montaje. El tercero es el tipo de sistema de archivos como puede ser ext2 (para ext2fs) o Minix (para sistemas de archivos Minix). José Luis Elvira Valenzuela, ITESO-DESI 1999 150 La siguiente tabla lista los distintos tipos de sistemas de archivos disponibles en Linux. Puede que no todos estos tipos de sistemas de archivos estén disponibles en su sistema; el núcleo debe tener soporte para ellos compilado en el. Sistema de archivos Second Extended Filesystem Extended Filesystem Minix Filesystem Xia Filesystem UMSDOS Filesystem Nombre de Comentarios tipo ext2 Sistema de archivos mas común en Linux Ext Minix Xia Umsdos Reemplazado por ext2. Sistema de archivos Minix original; no utilizado. Como ext2, pero raras veces utilizado. Utilizado para instalar Linux en una partición MS-DOS. MS-DOS Filesystem Msdos Utilizado para acceder a archivos MS-DOS. /proc Filesystem Proc Suministra información de proceso para ps, etc. ISO 9660 Filesystem iso9660 Formato utilizado por muchos CD-ROMs. Xenix Filesystem Xenix Sistema de archivos de Xenix. System V Filesystem Sysv Variantes del System V para el x86 Coherent Filesystem Coherent Acceso a archivos de Coherent. HPFS Filesystem Hpfs Acceso en lectura a particiones HPFS (DoubleSpace). Tipos de Sistemas de Archivos en Linux El último campo del archivo fstab contiene las opciones del comando mount normalmente, esta puesto a "defaults" (defecto). Como se puede ver, las particiones de intercambio están incluidas en /etc/fstab también. Tienen un punto de montaje de none y tipo swap. El comando swapon a, que se ejecuta también desde /etc/rc, se utiliza para activar el intercambio en todos los dispositivos de intercambio listados en /etc/fstab El archivo /etc/fstab contiene una entrada especial para el sistema de archivos /proc. El sistema de archivos /proc se utiliza para almacenar información acerca de los procesos del sistema, memoria disponible, y otros datos del mismo tipo. Si /proc no esta montado, no funcionaran comandos como ps. El comando mount solo puede ser utilizado por root. Esto es así para garantizar la seguridad del sistema; no es deseable que usuarios normales estén montando y desmontando sistemas de archivos a su antojo. Existen varios paquetes disponibles que permiten a los usuarios normales montar y desmontar sistemas de archivos (diskettes en particular) sin comprometer la seguridad del sistema. José Luis Elvira Valenzuela, ITESO-DESI 1999 151 El comando mount -av realmente monta todos los sistemas de archivos excepto el sistema de archivos raíz (en la tabla anterior, /dev/hda2). El sistema de archivos raíz es montado automáticamente en tiempo de arranque por el nucleo. En vez de utilizar el comando mount a mano. El comando : -av, se puede montar un sistema de archivos # mount -t ext2 /dev/hda3 /usr es equivalente a montar el sistema de archivos con la entrada /dev/hda3 del ejemplo de archivo /etc/fstab anterior. En general, nunca se debe montar o desmontar sistemas de archivos a mano. El comando mount -av en /etc/rc se encarga de montar los sistemas de archivos en tiempo de arranque. Los sistemas de archivos son desmontados por los comandos shutdown o halt antes de cerrar el sistema. 5.4.2.- Sistemas de archivos remotos. Configuración NFS NFS significa “Network File System”, y es un modo de compartir archivos entre máquinas como si estuvieran en el mismo disco duro. Linux puede ser cualquiera de los dos, un server NFS y un cliente NFS client, lo que significa que puede exportar sistemas de archivos a otros sistemas, y montar sistemas de archivos exportados de otras máquinas. Mounting NFS Filesystems Use el comando mount para montar un sistema de archivo NFS de otra máquina: # mkdir /mnt/local # mount bigdog:/mnt/export /mnt/local En este comando, “bigdog” es el nombre del host del servidor de archivos NFS, /mnt/export es el sistema de archivos que “bigdog” está exportando, y /mnt/local es un directorio en la máquina local donde queremos montar el sistema de archivos. Después de que el comando mount corre (y si tenemos los permisos necesarios de “bigdog”) podemos teclear # ls /mnt/local José Luis Elvira Valenzuela, ITESO-DESI 1999 152 y obtener un listado de los archivos en /mnt/export en “bigdog”. Exportando sistemas de archivos NFS El archivo que controla que sistemas de archivos queremos exportar es /etc/exports. Su formato es : directorio nombre del host (opciones) las (opciones) son opcionales. Por ejemplo : /mnt/export speedy.redhat.com Permitirá a speedy.redhat.com montar /mnt/export. /mnt/export speedy.redhat.com(ro) Permitirá a speedy montar /mnt/export como solo lectura Cada vez que se modifica el archivo /etc/exports, se necesita indicarle a los demonios NFS que lo examine para la nueva información. Una simple forma de hacer esto es detener y reiniciar los demonios : # /etc/rc.d/init.d/nfs stop # /etc/rc.d/init.d/nfs start También funcionará lo siguiente : # killall -HUP rpc.nfsd rpc.mountd 5.5.- Mantenimiento de sistemas de archivos. 5.5.1.- Utilerías. Normalmente es una buena idea el comprobar de vez en cuando los sistemas de archivos en busca de archivos dañados o corrompidos. Algunos sistemas comprueban automáticamente sus sistemas de archivos en tiempo de arranque (con los comandos apropiados en /etc/rc). El comando utilizado para comprobar un sistema de archivos depende del tipo de sistema de archivos en cuestion. Para José Luis Elvira Valenzuela, ITESO-DESI 1999 153 sistemas de archivos ext2fs (el tipo mas utilizado normalmente), el comando es e2fsck. Por ejemplo, el comando # e2fsck -av /dev/hda2 comprobará el sistema de archivos ext2fs de /dev/hda2 y corregirá automáticamente cualquier error. Normalmente es una buena idea el desmontar un sistema de archivos antes de comprobarlo. Por ejemplo, el comando : # umount /dev/hda2 desmontara el sistema de archivos en /dev/hda2, tras lo cual podrá ser comprobado. La única excepción es que no se puede desmontar el sistema de archivos raíz. Para poder comprobar el sistema de archivos raíz cuando esta desmontado, se debe utilizar un disquete de arranque/raíz. Tampoco se puede desmontar un sistema de archivos si alguno de sus archivos esta "ocupado" esto es, siendo utilizado por un proceso en ejecución. Por ejemplo, no se puede desmontar un sistema de archivos si el directorio de trabajo de algún usuario esta en ese sistema de archivos. Se recibirá un error "Device busy" (dispositivo ocupado) si se intenta desmontar un sistema de archivos que este en uso. Otros tipos de sistemas de archivos utilizan formas diferentes del comando e2fsck, como pueda ser efsck y xfsck. En algunos sistemas, se puede utilizar el comando fsck, que determina el tipo de sistema de archivos y ejecuta el comando apropiado. *Es importante que se reinicialice el sistema inmediatamente después de comprobar un sistema de archivos montado, si es que se hizo alguna corrección al sistema de archivos. (Sin embargo, en general, no se deben comprobar sistemas de archivos que estén montados.) Por ejemplo, si e2fsck informa que ha corregido algún error en el sistema de archivos, se debe apagar el sistema con shutdown -r para rearrancarlo. Esto permite al sistema resincronizar su información acerca del sistema de archivos cuando e2fsck lo modifica. El sistema de archivos /proc no necesita nunca ser comprobado de esta forma. /proc es un sistema de archivos en memoria, gestionado directamente por el nucleo. José Luis Elvira Valenzuela, ITESO-DESI 1999 154