El Cómo de los Fundamentos de Unix e Internet Eric Raymond autor [email protected] Yoana Regidor Lorenzo traductora [email protected] Andrea Beille traductora [email protected] Mónica Fumero traductora [email protected] 1 El Cómo de los Fundamentos de Unix e Internet Gisela Bernal Figeroa traductora [email protected] Auxiliadora Delgado Suárez traductora [email protected] Este documento describe la forma de trabajar de los computadores PC, los sistemas operativos del estilo de Unix e Internet en un lenguaje sencillo. 1. Introducción 1.1. Objetivo de este documento El objetivo de este documento es ayudar a aquellos usuarios de Linux e Internet a quienes les gusta aprender mientras trabajan. Si bien ésta es una excelente manera de adquirir determinadas habilidades, algunas veces este método deja lagunas en nuestros conocimientos básicos, lagunas que pueden dificultar la creatividad a la hora de razonar o, incluso, reducir la eficacia con la que se resuelven los problemas, debido a que no se cuenta con un modelo mental adecuado acerca de lo que ocurre en realidad. Se intentará describir con claridad, y en un lenguaje sencillo, cómo funciona todo. La presentación irá dirigida a aquéllos que trabajan con Unix o Linux en un hardware para 2 El Cómo de los Fundamentos de Unix e Internet computadores personales. No obstante, sólo se hará referencia a Unix, ya que la mayor parte de la explicación podrá aplicarse a las distintas plataformas y variantes de Unix. Se partirá de la base de que usted trabaja con un computador personal Intel. Los detalles apenas difieren entre un computador Alfa o Power o algún otro paquete de Unix; de cualquier forma, los conceptos básicos son los mismos. Deberá prestar atención porque no se repitirán las cosas dos veces: de esta forma, aprenderá de cada palabra que lea. Es aconsejable hacer una primera lectura por encima, y, una vez asimilado lo que ha aprendido, retroceder y volver a leerlo unas cuantas veces más. Este documento se encuentra en continua modificación. Se intentará seguir añadiendo nuevas secciones según las sugerencias del usuario, por lo que sería aconsejable que lo consultara periódicamente. 1.2. Fuentes relacionadas Si el objetivo de su lectura es aprender a indagar y trabajar en el interior de un programa, sería conveniente que leyese la PF Cómo llegar a ser un experto (http://www.tuxedo.org/~esr/faqs/hacker-howto.html). Allí encontrará enlaces que le llevarán a otras fuentes útiles. 1.3. Nuevas versiones de este documento Se depositarán periódicamente nuevas versiones del Cómo sobre Fundamentos de Unix e Internet en comp.os.linux.help (news:comp.os.linux.help), en news:comp.os.linux.announce y en news.answers (news:news.answers). Asimismo, se descargarán en varias páginas web de Linux y sitios FTP, incluida la página principal del LDP. La última versión de este documento puede verse en la dirección http://metalab.unc.edu/LDP/HOWTO/Unix-Internet-Fundamentals-HOWTO.html. 1.4. Sugerencias y correcciones Si desea hacer alguna pregunta o comentario sobre este documento, por favor, no dude en ponerse en contacto con Eric S. Raymond, en la dirección de correo [email protected] (mailto:[email protected]). Cualquier crítica o sugerencia serán 3 El Cómo de los Fundamentos de Unix e Internet bienvenidas y, especialmente, aquellos hiperenlaces que lleven a una información más detallada de algún término. Si encuentra algún error en este documento, por favor, comuníquelo para proceder a su corrección. Gracias. 2. Anatomía básica de su computador Su computador posee en su interior un chip procesador que es el que realmente le hace actuar como tal. También cuenta con una memoria interna ( a lo que DOS/Windows llama "RAM" y Unix, por su parte, "core"; el término de Unix describe una memoria tradicional de cuando la RAM estaba formada por toros de férrita o núcleos magnéticos). El procesador y la memoria están situados en la tarjeta madre: el corazón de su computador. Su computador cuenta con una pantalla y un teclado, así como con un disco duro y discos flexibles. Tanto la pantalla como los discos poseen tarjetas controladoras que se enchufan al panel posterior y ayudan al computador a utilizar los dispositivos externos. (Su teclado es demasiado sencillo como para necesitar una tarjeta independiente, por lo que la tarjeta va incluida dentro del mismo teclado). Más adelante se expondrán algunos detalles sobre cómo actúan estos dispositivos. Por el momento, se detallarán algunos conceptos básicos que han de tenerse en cuenta acerca de cómo trabajan en conjunto: Todas las partes internas de su computador están conectadas por un bus. Físicamente, el bus es el lugar en el que se enchufan las tarjetas controladoras (tarjetas de vídeo, controlador del disco, tarjeta de sonido, en caso de disponer de ella). El bus es la "autopista de información" entre el procesador, la pantalla, el disco y el resto del sistema. El procesador, que es lo que hace que todo funcione, no tiene acceso directo a ninguno de los demás componentes de su computador: se comunica con ellos a través del bus. El único sistema al que realmente tiene un acceso rápido e inmediato es la memoria ("core"). Por tanto, para ejecutar un programa, éste ha de estar situado en elcore (la memoria). Cuando su computador lee un programa, o una información del disco, lo que realmente ocurre es que el procesador utiliza el bus para ordenar al controlador del disco que lo lea. Poco tiempo después, el controlador del disco, mediante el bus, informa al procesador de que ha leído la información y de que la ha depositado en un lugar determinado de la memoria. En ese momento, el procesador ya puede acceder a la información a través del bus. 4 El Cómo de los Fundamentos de Unix e Internet Tanto el teclado como la pantalla se comunican también con el procesador mediante el bus, aunque de una manera más sencilla, pero este punto se tratará más tarde, por ahora ya sabe lo suficiente como para entender qué sucede cuando enciende su computador. 3. ¿Qué sucede cuando enciende el computador? Un computador sin un programa en ejecución es solo un montón de chips inservibles. Lo primero que se debe hacer cuando se conecta es iniciar un programa llamadosistema operativo, cuya función es ayudar al resto de los programas del computador para que funcionen, manejando los detalles del control del hardware del computador. El proceso de llamar al sistema operativo recibe el nombre de arranque(en un principio fuesecuencia inicial de instrucciones, refiriéndose a su dificultad). Su computador sabe cómo arrancar porque las instrucciones para ello están incorporadas en uno de sus chips, concretamente en el chip BIOS (Sistema Básico de Entrada y Salida). El chip BIOS le dice al computador que busque en un lugar fijo, que ocupa un mínimo de espacio en el disco duro ( disco de inicio), un programa especial llamadocargador de arranque (en Linux el cargador de arranque se llama LILO) cuya función es iniciar el auténtico sistema operativo; dicho programa se copia en la memoria y se inicia. El cargador hace todo esto buscando un núcleo, copiándolo en la memoria y ejecutándolo. Cuando se descarga Linux y se ve "LILO" en la pantalla, seguido de una serie de puntos, significa que se está cargando el núcleo (cada punto significa que se ha cargado otro disco de bloque del código del núcleo). (Se preguntará por qué el BIOS no carga el núcleo directamente; ¿por qué realizar los dos pasos con el cargador de arranque? Bien, BIOS no es muy inteligente, de hecho es bastante torpe y Linux no vuelve a usarlo tras el momento del arranque. En un principio se creó para los PC de 8 bits con discos de poca capacidad, lo que significa que no tienen espacio suficiente para acceder al disco y cargar el núcleo directamente. El paso con el cargador también le permite poner en marcha uno de los muchos sistemas operativos que se encuentren en distintos lugares dentro de su disco, en el caso poco probable de que Linux no sea compatible con su equipo). Una vez que el núcleo se pone en marcha, tiene que buscar a su alrededor, verificar el resto delhardware y prepararse para ejecutar los programas. Esto no lo hace urgando en las ubicaciones típicas de memoria, sino en los puertos de E/S, direcciones de buses especiales que probablemente contengan tarjetas de control a la espera de órdenes. El núcleo no hace esto por casualidad; tiene mucha información interna acerca de lo que 5 El Cómo de los Fundamentos de Unix e Internet es más probable encontrar, dónde y cómo responderían los controladores si estuvieran presentes. Este proceso recibe el nombre de autoverificación. La mayoría de los mensajes que se ven durante el tiempo de arranque proceden del núcleo al verificar su hardware a través de los puertos de E/S, configurar el equipo y adaptarse a él. El núcleo de Linux es muy bueno en este tipo de tareas, mejor incluso que otros Unix ymucho mejor que DOS y Windows. De hecho, muchos expertos en Linux creen que las pruebas en la eficacia de éste durante el tiempo de arranque (lo que hace que sea relativamente fácil de instalar) eran una de las mayores razones por las que el pack gratuito de Unix arrasó a la hora de atraer un gran número de usuarios . Sin embargo, el proceso de arranque no acaba cuando se carga el núcleo completamente y se ejecuta, este es solo el primer paso (también llamado nivel de ejecución 1). Después de esta primera fase, el núcleo cede el control a un proceso especial llamado ‘init’ que inicia varios procesos de preparación inicial. La primera tarea del proceso init es asegurarse de que sus discos estén en buen estado; los sistemas de ficheros en disco son muy frágiles y, si han sufrido daños por por un fallo del hardware, o por un corte de electricidad repentino, existen razones suficientes para realizar pasos de recuperación antes de que su Unix continue . Retomaremos este asunto más tarde, cuando hablemos de los fallos de los sitemas de ficheros. El próximo paso de init es iniciar variosdemonios. Un demonio es un programa parecido a un integrador de impresión, una lista de correo o un servidor de Internet, que se pone a merodear por los alrededores esperando a tener algo que hacer. A menudo, estos programas especiales tienen que coordinar una serie de tareas que podrían entrar en conflicto. Para este propósito se utilizan los demonio porque, normalmente, es más fácil escribir un programa que está en ejecución constantemente y que conoce todas las tareas, que lo que implicaría asegurarse de que multitud de copias (cada una de ellas prcesando una tarea y todas en ejecución al mismo tiempo) no se pisen. El número de demonios que su sistema pone en marcha puede variar, pero casi siempre incluirá un integrador de impresión (un demonio guardian para su impresora). El próximo paso es prepararse para los usuarios. Init inicia una copia de un programa llamado getty para ver su consola (y quizás mas copias para ver los puertos seriales de entrada). Este programa es el que emite el mensaje de login a su consola. Una vez qe se han iniciado todos los demonios y procesos getty para cada terminal, llegamos al nivel de ejecución 2. En este nivel usted puede ingresar en el sistema y ejecutar programas. Pero aún no hemos terminado. El próximo paso consiste en iniciar una serie de demonios que soporten la red y otros servicios. Una vez hecho esto llegamos al nivel de ejecución 3y ya el sistema está completamente listo para su uso. 6 El Cómo de los Fundamentos de Unix e Internet 4. ¿Qué sucede cuando ingresa en el sistema? Cuando usted ingresa en el sistema ( getty) usted se identifica al computador, éste entonces ejecuta un programa llamado login, que se encarga de verificar su contraseña para ver si está o no autorizado a utilizar el equipo. Si no lo está, su petición de conexión se rechazará, pero si lo está, login relizará algunos procesos iniciales y entonces iniciará un intéprete de órdenes, shell. (Es cierto que, getty y login podrían ser un único programa, pero por razones históricas que no merecen la pena mencionar están separados). Aquí tiene un más información acerca de lo que hace el sistema, antes de proporcionarle un shell (más tarde necesitará esta información, cuando hablemos de las restricciones de ficheros). Usted se identifica con un identificativo de usuario y una contraseña. Su identificativo de usuario se busca en un fichero llamado /etc/passwd, que es una secuencia de líneas, cada una describiendo una cuenta de usuario. Uno de estos campos es una versión cifrada de la contraseña de la cuenta (a veces los campos cifrados se mantienen en un segundo plano, en un segundo fichero /etc/shadow, con fuertes restricciones que harán más difícil el desciframiento de la contraseña). Lo que usted introduce como fichero de la contraseña se cifra excatamente de la misma forma y login la compara para ver si se corresponden. La seguridad de este método reside en el hecho de que, mientras que resulta fácil ir desde su contraseña pública hasta la versión cifrada, hacer lo contrario es muy difícil. De hecho, incluso si alguien consigue ver la versión cifrada de su contraseña, no podrá usar su cuenta (lo que también significa que, si olvida su contraseña no hay forma de recuperarla, tan sólo podrá cambiarla por otra). Una vez que ha entrado en el sistema con éxito, consigue todos los privilegios asociados a la cuenta individual que está usando. También podrá ser considerado como parte de un grupo, que es un conjunto identificativo de usuarios, creado por el administrador del sistema. Los grupos pueden obtener privilegios independientemente de los privilegios de sus miembros. Un usuario puede ser miembro de múltiples grupos (si desea obtener más información acerca de cómo funcionan los privilegios en Unix, consulte la sección que está más adelante: restricciones). (observe que, aunque usted se dirigirá a los usuarios y a los grupos normalmente por su nombre, estos nombres quedan almacenados internamente como identificadores numéricoss. El fichero de contraseñas password hace corresponder su nombre de cuenta de usuario con un identificador numérico de usuario; el fichero /etc/group hace corresponder los nombres de los grupos con los identificadores numéricos de éstos. Las órdenes que se encargan de los ficheros y los grupos hacen la traducción automaticamente). 7 El Cómo de los Fundamentos de Unix e Internet Su entrada del fichero de usuario contiene además su directorio principal, que es la localización donde se ubicarán sus ficheros personales, dentro del sistema de ficheros de Unix. Por último, también establece su shell, el intérprete de órdenes quelogin iniciará para aceptar sus órdenes. 5. ¿Qué sucede cuando ejecuta programas desde el intérprete de órdenes? La shell (en español, "concha") es el intérprete de órdenes de Unix; se llama así porque envuelve y oculta el núcleo del sistema operativo. Una característica importante de Unix es que la shell y el kernel son programas separados que se comunican mediante un conjunto reducido de llamadas al sistema. Después de ingresar en el sistema, la shell normal le muestra el indicador de órdenes ’$’ (a menos que lo haya configurado de otra manera). No hablaremos sobre la sintaxis de shell, ni de lo que verá en la pantalla; al contrario, echaremos un vistazo a lo que ocurre desde el punto de vista del computador. Imagínese que después del tiempo de arranque y antes de ejecutar un programa, su computador es algo así como un zoológico, lleno de procesos esperando para hacer algo. En realidad, están esperando sucesos: un suceso puede ser pulsar una tecla, o un movimiento del ratón, o incluso la entrada de un paquete de datos en el caso de que su equipo esté conectado a una red. El núcleo es uno de esos procesos especiales, porque controla cuándo los otros procesos de usuario pueden ejecutarse y, normalmente, es el único proceso con acceso directo al hardware del equipo. De hecho, los procesos de usuario tienen que realizar sus peticiones al núcleo cuando quieren ingresar datos a través del teclado, escribir en la pantalla, leer o escribir en un disco, o hacer algo más que llenar la memoria de bits. Estas peticiones se conocen comollamadas al sistema. Normalmente, todas las E/S (entradas y salidas) pasan a través del núcleo para que éste pueda programar las operaciones y evitar que los procesos se pisen. Sólo unos pocos procesos de usuario especiales están autorizados a deslizarse hasta el núcleo, casi siempre concediéndoles acceso directo a los puertos de E/S. El ejemplo más común son los servidores X (programas que manejan las peticiones de otros programas para hacer gráficos de pantalla en la mayoría de las máquinas Unix). Pero nosotros no hemos accedido a un servidor X todavía, de momento, estamos buscando un mensaje de petición de shell en la consola de caracteres. 8 El Cómo de los Fundamentos de Unix e Internet El shell es sólo un procesador de usuarios, y no uno de los especiales; escucha (a través del núcleo) al teclado y espera sus pulsaciones. Cuando el núcleo las ve, las transmite a su pantalla y de ahí pasan al shell. Cuando el núcleo ve ‘Enter’ lleva su línea de texto hasta el shell, que intenta traducir esas pulsaciones en órdenes. Por ejemplo, si usted teclea ‘ls’ para llamar a la lista de directorio de Unix, el shell aplica sus reglas internas para averiguar que usted quiere ejecutar dicha orden en el fichero ‘/bin/ls’, entonces, llama al sistema pidiéndole que inicie /bin/ls como un nuevo proceso hijo y le dé acceso al teclado y a la pantalla a través del núcleo. Mientras que ls acaba, el shell se va a dormir. Cuando/bin/ls ha acabado, avisa al al núcleo por medio de una llamada del de salida del sistema; entonces, el núcleo despierta al shell y le dice que continue con la ejecución. El shell emite otro mensaje de petición y espera por otra línea de entrada. Mientras se ejecuta ‘ls’, pueden realizarse otras tareas, en el caso de que se esté listando un directorio extenso. Podrá encender otra consola virtual, conectarse ahí e iniciar un videojuego o, suponiendo que esté conectado a la Internet, su equipo puede estar enviando o recibiendo correo mientras se ejecuta /bin/ls . 6. ¿Cómo funcionan los dispositivos de entrada y las interrupciones? Su teclado en un dispositivo de entrada muy simple; simple porque genera pequeñas cantidades de datos y muy despacio (según el criterio de computador). Cuando pulsa o libera una tecla, ese suceso se transmite al cable del teclado para que produzca una interrupción del hardware. El sistema operativo se encarga de vigilar estas interrupciones. Para cada tipo de interrupción habrá un manejador de interrupción, parte del sistema operativo que acumula cualquier dato asociado con ellas (por ejemplo el valor de pulsar o liberar una tecla) hasta que puedan ser procesadas. En realidad, lo que hace el manejador de interrupción con su teclado es situar el valor de la tecla dentro de un área del sistema cerca del centro de la memoria. Desde allí le será posible reconocerlo cuando el sistema operativo pase el control a cualquier programa que se supone que el teclado está leyendo en ese momento. Otros dispositivos de entrada más complejos, como por ejemplo las tarjetas de disco o de red, funcionan de la misma forma. Anteriormente, comentamos que el controlador de disco utiliza el bus para señalar que la petición del disco se ha completado; lo que 9 El Cómo de los Fundamentos de Unix e Internet ocurre en realidad es que el disco produce una interrupción, entonces el manejador de interrupción del disco copia los datos recuperados en la memoria, para que luego el programa que ha hecho la petición los utilice. Cada tipo de interrupción lleva asociada un nivel de prioridad. Las interrupciones de menor prioridad (como los sucesos en el teclado) tienen que esperar a las interrupciones de mayor prioridad (como los impulsos del reloj y los sucesos del disco). Unix está diseñado para asignar mayor prioridad a aquellos sucesos que necesitan procesarse con rapidez para que el equipo responda sin sobresaltos. En los mensajes de su sistema operativo durante el tiempo de arranque podrá ver referencias a los númerosIRQ. Debe darse cuenta de que una de las vías más rápidas para desconfigurar el hardware es tener dos dispositivos distintos intentando usar el mismo número IRQ sin saber extactamente por qué. Aquí tiene la respuesta. IRQ es la abreviatura de "Petición de Interrupción"; el sistema operativo necesita conocer en el momento del inicio qué número de interrupción utilizará cada dispositivo, para poder asignar el manejador apropiado a cada uno. Si dos dispositivos distintos intentan usar el mismo IRQ, a se enviará la interrupción al menejador equivocado, lo que normalmente produce un bloqueo del dispositivo, y confundiendo de tal manera al sistema operativo que podría llegar a bloquearse. 7. ¿Cómo puede el computador hacer varias cosas a la vez? En realidad no puede. Los computadores sólo pueden realizar una tarea (o proceso) al mismo tiempo. Sin embargo, un computador puede cambiar de tarea de manera muy rápida, lo que hace creer a los seres humanos que hace varias cosas a la vez. Este fenómeno recibe el nombre de tiempo compartido. Una de las funciones del núcleo es la de administrar el tiempo compartido. Posee una parte, denominada planificador, que guarda toda la información que posee acerca de todos los demás procesos (que no son del núcleo) de su equipo. Cada décima de segundo, un contador de tiempo se apaga en el núcleo y genera una interrupción de reloj. El planificador detiene cualquier proceso que se esté ejecutando en ese momento, lo suspende y toma el control de otro proceso. Una décima de segundo puede no parecer mucho tiempo, pero es suficiente para que los microprocesadores modernos ejecuten decenas de miles de instrucciones de máquina. Esto supone la realización de una gran cantidad de trabajo; por tanto, aunque 10 El Cómo de los Fundamentos de Unix e Internet se tengan muchos procesos, cada uno de ellos se puede llevar a cabo alternativamente en cada uno de estos intervalos de tiempo. En la práctica, puede que un programa no complete su intervalo de tiempo. Si se produce una interrupción a través de un dispositivo E/S, el núcleo detiene eficazmente la tarea en curso, ejecuta el manipulador de interrupción y luego vuelve a dicha tarea. El procesamiento normal puede verse desplazado por una gran cantidad de interrupciones de alta prioridad; este mal comportamiento se denominathrashing y, afortunadamente, es muy difícil que suceda en los Unix modernos. De hecho, la velocidad de los programas sólo se ve limitada, muy rara vez, por la cantidad de tiempo de máquina que pueden obtener (hay unas pocas excepciones a esta regla, tales como la generación de sonidos y gráficos en 3-D). Con mucha más frecuencia, los retrasos se producen cuando el programa tiene que esperar datos de una unidad de disco o de la conexión a la red. Al sistema operativo que puede realizar de forma rutinaria muchos procesos a la vez se le denomina "multitarea". La familia de sistemas operativos Unix fue diseñada desde el principio para la multitarea y es muy buena en ello, mucho más efectiva que Windows o Mac, que han añadido la multitarea en el último momento y no demasiado bien. Una multitarea eficiente y fiable es, en gran medida, lo que hace a Linux mucho mejor para trabajos en la red, comunicaciones y servicio web. 8. ¿Qué hace el computador para evitar que los procesos se solapen? El planificador del núcleo se encarga de asignar el mismo tiempo a cada proceso. El sistema operativo también tiene que asignarles espacio suficioente para que éstos no se invadan la memoria de trabajo unos a otros. Incluso suponiendo que todos los programas funcionen bien, es necesario prevenir que un fallo en uno de ellos pueda afectar negativamente a los otros. Lo que hace el sistema operativo para solucionar este problema se denomina gestión de memoria. Cada proceso que se lleva a cabo en el equipo necesita su propia área de memoria, que será el lugar desde donde se ejecutará su código y donde se guardarán las variables y resultados. Este conjunto consta de un segmento de código de sólo lectura (que contiene las instrucciones del proceso) y un segmento de datos sobre el que se puede escribir ( y que contiene el almacenamiento de todas las variables del proceso). El segmento de datos es totalmente único para cada proceso, pero, si dos procesos están ejecutando el mismo código, automáticamente, Unix se encarga de que ambos 11 El Cómo de los Fundamentos de Unix e Internet compartan un mismo segmento de código como medida de ahorro. 8.1. Memoria virtual : version simplificada El ahorro es importante, porque la memoria es cara. A veces no se dispone de suficiente memoria para guardar íntegramente todos los programas que la máquina está ejecutando, sobre todo si se está usando un programa de gran tamaño como puede ser un servidor X . Para solventarlo, Unix utiliza una técnica llamada memoria virtual. No intenta almacenar todo el código y los datos de un proceso en la memoria, sino que guarda sólo un conjunto de trabajorelativamente pequeño; el resto del estado del proceso se deja en un área especial de espacio de intercambio en el disco duro. Obsérvese que, lo que en el párrafo anterior es "a veces", antiguamente era "casi siempre". Antes el tamaño de la memoria era pequeño en comparación con el tamaño de los programas ejecutados, por lo que el intercambio era frecuente. Hoy en día, la memoria es mucho más barata e incluso las máquinas con bajas prestaciones poseen bastante; en los computadores personales modernos con 256 MB de memoria, o más, es posible ejecutar X y una mezcla típica de tareas sin llevar a cabo el intercambio después de haberlas cargado primero en la memoria. 8.2. Memoria virtual: version detallada En realidad, la sección anterior simplifica un poco las cosas. Sí, los programas ven la mayor parte de la memoria como un gran banco plano de direcciones, mayor que la memoria física; el intercambio de disco se utiliza para mantener esa ilusión. Sin embargo, el hardware tiene, en realidad, no menos de 5 tipos de memoria diferentes y las diferencias entre éstas pueden llegar a ser muy importantes cuando hay que optimizar los programas para que alcancen su velocidad máxima. Para entender realmente lo que sucede en la máquina, es necesario aprender cómo funcionan todas ellas. Los 5 tipos de memoria son los siguientes: registros del procesador, caché interno (o en el chip), caché externo (o fuera del chip), memoria principal y disco. Y la razón de que haya tantos tipos es sencilla: la velocidad cuesta dinero. Estos tipos de memoria se han ordenado de forma decreciente en lo que respecta al tiempo de acceso y coste; la memoria de registro es la más rápida y la más cara, y puede realizar alrededor de mil millones de accesos por segundo, mientras que la memoria de disco es la más lenta, la más barata y puede realizar unos 100 accesos directos por segundo. 12 El Cómo de los Fundamentos de Unix e Internet He aquí una lista completa que refleja casi 2.000 velocidades y precios de una máquina de escritorio típica. Mientras que la velocidad y la capacidad aumentarán y los precios caerán, cabe esperar que estas proporciones se mantengan constantes. Y son esas proporciones las que determinan la jerarquía de la memoria. Disco Tamaño: 13000 MB Accesos: 100/seg Memoria principal Tamaño: 256 MB Accesos: 100 M/seg Caché externo Tamaño: 512 KB Accesos: 250M/seg Caché interno Tamaño: 32 KB Accesos: 500M/seg Procesador Tamaño: 28 bytes Accesos: 1000 M/seg No se puede hacer todo con las memorias más rápidas, porque resultaría muy caro y , aunque no fuera así, la memoria rápida es volátil; esto es, pierde la información cuando hay un corte de electricidad. Por lo tanto, los computadores deben tener discos duros u otra forma de almacenamiento no volátil que retenga la información cuando haya un corte de electricidad. Además, entre la velocidad de los procesadores y la velocidad de los discos hay una gran diferencia. Los niveles intermedios de la jerarquía de la memoria ( caché interno, caché externo, y memoria principal existen básicamente para salvar esta diferencia. Linux y otros Unix poseen una característica denominada memoria virtual. Lo que esto quiere decir es que el sistema operativo actúa como si tuviera mucha más memoria principal de la que en realidad tiene. La memoria principal física propiamente dicha se comporta como un conjunto de ventanas o cachés situados en un área de memoria "virtual" mucho mayor. La mayor parte de ésta, en realidad, se almacena, en un tiempo dado cualquiera, en una zona especial del disco denominada área de intercambio. Fuera de la vista de los programas del usuario, el SO mueve datos (llamados páginas) de la memoria al disco para mantener esta ilusión. El resultado final es que su memoria virtual es mucho mayor y no mucho más lenta que la memoria real. La medida en que la memoria virtual sea más lenta que la física depende de lo bien que los algoritmos de intercambio del sistema operativo se ajusten a la forma en que sus 13 El Cómo de los Fundamentos de Unix e Internet programas usan la memoria virtual. Afortunadamente, las lecturas y escrituras de la memoria que se producen en tiempos muy próximos, también tienden a agruparse en el espacio de memoria. Esta tendencia se llama localidad o, más concretamente, localidad de referenciay es algo bueno. Si las referencias de la memoria se moviesen al azar por el espacio virtual, habría que hacer, por lo general, una lectura y escritura del disco para cada nueva referencia y la memoria virtual sería tan lenta como un disco. Pero como, en realidad, los programas demuestran tener una localidad fuerte, su sistema operativo puede realizar un número relativamente pequeño de intercambios por cada referencia. Se ha descubierto experimentalmente que el método más eficaz para el uso de memoria con gran número de patrones es muy simple y se llama LRU, o algoritmo Menos Utilizado Recientemente. El sistema de memoria virtual lleva bloques de disco al conjunto de trabajo a medida que los va necesitando. Cuando éste se queda sin memoria física para el conjunto de trabajo, descarga el bloque menos utilizado recientemente. Todos los Unix, y muchos otros sistemas operativos que poseen memoria virtual, usan variaciones menores del LRU. La memoria virtual es el primer vínculo de unión entre la velocidad del disco y la del procesador. El SO es el que se encarga explícitamente de su gestión. Pero aún queda un gran hueco entre la velocidad de la memoria principal física y la velocidad a la que un procesador puede acceder a la memoria de registro. Los cachés interno y externo tratan este asunto utilizando una técnica similar a la memoria virtual descrita anteriormente. Al igual que la memoria principal física se comporta como un conjunto de ventanas o cachés en el área de intercambio del disco, el caché externo actúa como ventanas en la memoria principal. El caché externo es más rápido (250 M en vez de 100 M de accesos por segundo) y más pequeño. El hardware (más concretamente, el controlador de la memoria del computador) realiza el proceso de LRU en el caché externo en forma de bloques de datos traídos de la memoria principal. Por razones históricas, la unidad de intercambio del caché se llama "línea" en vez de página. Pero aquí no acaba todo, porque es el caché interno el que hace posible el último aumento en la velocidad, cogiendo porciones del caché externo. Es más rápido y más pequeño aún, de hecho, se encuentra precisamente en el chip del procesador. Si se quiere aumentar verdaderamente la velocidad de los programas, los siguientes detalles le serán de gran utilidad: los programas van más rápido cuando poseen una localidad más fuerte, pues eso mejora el funcionamiento del caché. Por lo tanto, la manera más fácil de hacer que los programas sean más rápidos es hacerlos más pequeños. Si un programa no se ve ralentizado por un gran número de E/S de discos o esperas en la red, irá a la velocidad del caché de mayor tamaño que pueda poseer. Si no se puede empequeñecer todo el programa, el poner a punto las porciones críticas de velocidad para que tengan una localidad más fuerte puede dar resultados. Pero los 14 El Cómo de los Fundamentos de Unix e Internet detalles sobre las técnicas para hacer esta puesta a punto no se encuentran en este manual, puesto que para cuando usted pueda necesitarlos, ya estará lo suficientemente familiarizado con los compiladores como para entender muchos de esos detalles usted mismo. 8.3. La unidad de gestión de memoria Aunque se tenga suficiente memoria física para evitar el intercambio, la parte del sistema operativo denominada el gestor de memoria aún debe realizar una tarea importante. Tiene que asegurarse de que los programas sólo pueden alterar su propio segmento de datos, esto es, evitar que un código erróneo de un programa afecte negativamente a los datos de otro. Para ello, guarda una tabla de segmento de datos y de códigos, que se actualiza cada vez que un proceso solicita más memoria, o bien cada vez que la libera (esto último sucede si existe dicha memoria). Esta tabla se usa para pasar las órdenes a una parte especializada del hardware subyacente, denominada MMU oUnidad de Gestión de Memoria. Los chips de los procesadores modernos poseen MMUs incorporados. La MMU se encarga de vallar las áreas de la memoria, de esta manera, se rechazará cualquier referencia externa y se dará lugar a una interrupción. Si alguna vez se encuentra con un mensaje de Unix que dice "fallo de segmentación", "core dump" (volcado de memoria) o algo parecido, eso es exactamente lo que ha ocurrido; un intento del programa en curso de acceder a la memoria (core) fuera de su segmento ha generado una interrupción grave. Esto indica que se ha producido un fallo en el código del programa, el core dump (volcado de memoria) que deja es información diagnóstica para ayudar a un programador a localizarlo. Hay otro aspecto en la protección de los procesos, además de proporcionarles la memoria a la que acceden. También es útil poder controlar los accesos para evitar que un programa defectuoso pueda dañar piezas importantes del sistema. Por eso, Unix posee permisos de fichero, de los que hablaremos más adelante. 9. ¿Cómo almacena el computador datos en la memoria? Probablemente sabrá que todo lo que se almacena en un computador está compuesto por cadenas de bits (son dígitos binarios; imagínelos como un gran número de 15 El Cómo de los Fundamentos de Unix e Internet pequeños interruptores de encendido/apagado). A continuación le explicaremos cómo se utilizan esos bits para representar las letras y números que su ordenador procesa. Antes de que nos sumerjamos de lleno en esta cuestión, deberá saber cuál es la longitud de palabra de su computador. La longitud de palabra es la longitud escogida por el computador para mover unidades de información; técnicamente, es la anchura de los registros del procesador, que son las zonas de retención de datos que su computador utiliza para realizar operaciones aritméticas y lógicas. Es a esto a lo que nos referimos cuando decimos que los computadores poseen tamaños "bits" (como pueden ser los de "32 bits" ó "64 bits", por ejemplo). Muchos equipos (incluidos los 386, 486 y los PC de Pentium) poseen una longitud de palabra de 32 bits, las antiguas máquinas 286 tenían una longitud de palabra de 16 bits y los viejos macro-computadores a menudo eran de 36 bits. Pocos procesadores (como el Alpha, que antes se denominaba DEC, y que ahora es Compaq) son de 64 bits. La longitud de 64 bits será más frecuente durante los próximos cinco años, de hecho, Intel está planeando sustituir las series Pentium por otras llamadas "Itanium", que llevan incorporado un chip de 64 bits. El computador visualiza su memoria como una secuencia de palabras que van desde el cero hasta un número determinado, el cual dependerá del tamaño de su memoria. Ese valor está limitado por su longitud de palabra, lo que explica por qué las máquinas antiguas, como las 286, tienen que pasar por dolorosas ampliaciones para poder trabajar con un gran volumen de memoria; no vamos a tratarlas aquí, pero todavía siguen siendo una auténtica pesadilla para algunos programadores. 9.1. Cifras Las cifras se representan, ya sea como palabras o como parejas de palabras, dependiendo de la longitud de palabra de su computador; lo más común es que el equipo sea de 32 bits. Los números enteros aritméticos se aproximan, pero no son realmente matemáticos de base dos. El bit más bajo es el 1, a continuación el 2, luego el 4 y así sucesivamente, como si fuesen binarios puros. Sin embargo, los símbolos numéricos se representan en complementos a dos. El bit más alto es un bit de signo que convierte a la cantidad en negativa; así, cada número negativo puede obtenerse a partir del correspodiente valor positivo que resulta de invertir todos los bits. Todo esto explica por qué, en una máquina de 32 bits, los enteros poseen el rango -2^31 + 1 al 2^31 - 1 (donde ^ es la operación de elevar a la potencia 2^3 = 8). El bit número 32 se utiliza como bit de signo . Algunos lenguajes informáticos le proporcionan acceso a la aritmética sin signos , que 16 El Cómo de los Fundamentos de Unix e Internet son de base dos y distinguen sólo entre cero y números positivos. Muchos procesadores, y algunos lenguajes, pueden trabajar con números de coma flotante (esta capacidad está insertada en todos los chips recientes). Los números de coma flotante le proporcionan un rango de valores mucho más amplio que los enteros y, además, le permiten expresar fracciones. Existen muchos modos de llevar a cabo este proceso, pero son demasiado complicados como para analizarlos con detalle; sin embargo, la idea general se asemeja mucho a la llamada "notación científica", donde se puede escribir, por ejemplo, 1.234 * 10^23; la codificación del número se descompone en una mantisa (1.234) y el exponente (23) de un múltiplo de potencia de 10. 9.2. Caracteres Los caracteres suelen estar representados por cadenas de siete bits en una codificación denominada ASCII (Código Estándar Americano para el Intercambio de Información). En los computadores modernos, cada uno de los 128 caracteres ASCII se corresponde con los siete bits bajos de un octeto de 8 bits; los octetos están agrupados en palabras de memoria, de manera que, por ejemplo, una cadena de seis caracteres ocupa dos palabras de memoria. Si desea obtener una tabla de códigos ASCII, teclee ‘man 7 ascii’ en su indicador de Unix. El párrafo anterior resulta un tanto engañoso en dos aspectos. El menos significativo es el hecho de que el término ’octeto’ es correcto, pero casi no se utiliza; mucha gente lo denomina byte e implica que un byte esté siempre formado por ocho bits. En un sentido esctricto, el término byte es el más utilizado; sin embargo, antes existían, por ejemplo, computadores de 36 bits con bytes de 9 bits (aunque ya no se construyen). El engaño más importante es que los códigos ASCII no se utilizan en todo el mundo. De hecho, en muchas partes no se pueden utilizar; el ASCII, a pesar de ser idóneo para el inglés americano, no incluye muchos caracteres especiales que se necesitan en otras lenguas. Incluso el inglés británico encuentra problemas, ya que no dispone del símbolo de la moneda británica. Se han realizado varios intentos por subsanar este problema. Todos utilizan un bit más alto que ASCII, convirtiéndolo en un código bajo de 256 caracteres. El más utilizado es el llamado código de carateres Latin-1 (más formalmente conocido como ISO 8859-1). Este es el tipo de carácter estándar para Linux, HTML y X. Windows, de Microsoft, utiliza una versión modificada de Latin-1, que añade más caracteres, tales como las comillas dobles, izquierdas y derechas, que el propio Latin-1 no incluía por motivos históricos. (Si desea obtener un informe detallado sobre los problemas que causaba tal exclusión, acuda a la página "demoroniser") 17 El Cómo de los Fundamentos de Unix e Internet (http://www.fourmilab.ch/webtools/demoroniser/) Latin-1 maneja las lenguas europeas más importantes, incluidas el inglés, francés, alemán, español, italiano, holandés, noruego, sueco y danés. Sin embargo, esto tampoco es suficiente, y, como resultado, existe toda una serie Latin-2, que son conjuntos de caracteres que incluyen lenguas como el griego, árabe, hebreo, esperanto y serbo-croata. Si desea obtener más detalles, consulte la página alfabetos ISO. (http://czyborra.com/charsets/iso8859.html) La solución más reciente es un enorme conjunto de caracteres llamado Unicode (y su equivalente ISO/IEC 10646-1:1993). Unicode es igual al Latin-1 en sus 256 ranuras más bajas. Por encima de éstas, y en un espacio de 16 bits, incluye el alfabeto griego, cirílico, armenio, hebreo, árabe, devanagari, bengalí, gurmuki, gujaratí, oriya, tamil, telugu, kannada, malayo, tailandés, laonés, georgiano, tibetano, kana japonés, el conjunto completo del kangul del coreano moderno y un conjunto unificado de caracteres del chino/japonés/coreano (CJK). Si quiere obtener más detalles, acuda a la Página Principal de Unicode (http://www.unicode.org/). 10. ¿Cómo almacena el computador datos en el disco? Cuando comprueba el disco duro desde Unix, podrá ver un árbol de directorios y ficheros identificados. Normalmente, no sería necesario profundizar mucho más, pero es conveniente que usted sepa qué es lo que ocurre más abajo si en algún momento se produce una caída del disco y necesita recuperar ficheros. Desafortunadamente, no existe un método adecuado para describir la organización del disco a partir del nivel de ficheros hacia abajo, por lo que tendremos que describirlo a partir del hardware. 10.1. El disco de bajo nivel y la estructura de ficheros del sistema La superficie del disco, que es donde se almacenan los datos, está dividida como si fuese una especie de diana: pistas circulares que, a su vez, están divididas en porciones que se denominan sectores. Debido a que las pistas de la parte exterior poseen más superficie que las que están más cerca del eje central del disco, poseen más sectores que las pistas interiores. Cada sector, (o bloque de disco) tiene el mismo tamaño que, 18 El Cómo de los Fundamentos de Unix e Internet en Unix moderno suele ser de 1 K binario (1.024 palabras de 8 bits). Cada bloque de disco posee una dirección única, o un número de bloque de disco. Unix divide el disco en particiones de disco. Cada partición es un espacio continuo de bloques que se utilizan separados de cualquier otra partición, ya sea como un sistema de ficheros o como un espacio de intercambio. Los motivos originales que dieron lugar a las particiones tienen que ver con la recuperación de caídas de discos mucho más lentas y más propensas a mostrar errores; las barreras que separan esas particiones reducen el riesgo de que su disco pueda ser bloqueado o alterado por una zona dañada en dicho disco. En la actualidad, es muy importante que las particiones sean de sólo lectura (así se evita que se puedan modificar los ficheros esenciales del sistema), o bien sean compartidas en una red a través de varios métodos que no vamos a tratar aquí. La partición con el número más bajo suele considerarse lapartición de arranque , que es donde se puede alojar el núcleo para ejecutarlo desde ahí. Cada partición es, o bien un espacio de intercambio (que se utiliza para implementar memoria virtual, o bien un sistema de ficheros, empleado para guardar ficheros. Las particiones del espacio de intercambio se tratan como una secuencia lineal de bloques. Los sistemas de ficheros, por su parte, requieren una forma de proyectar nombres de ficheros en secuencias de bloques de discos. Puesto que los ficheros crecen, se reducen y se modifican a lo largo del tiempo, los bloques de datos de un fichero no serán una secuencia lineal, sino que pueden estar dispersados por toda la partición correspondiente (siempre que el sistema operativo pueda encontrar un bloque libre cuando lo necesite). 10.2. Nombres de ficheros y directorios Dentro de cada sistema de ficheros, la correspondencia entre los nombres y los bloques se realiza mediante una estructura llamada nodos índice o nodo i. Existe un gran número de estos elementos en los bloques de menor número de cada sistema de ficheros (los más bajos se utilizan para ordenar y etiquetar, pero no se tratarán aquí). Cada nodo i describe a un fichero. Los bloques de datos de fichero se alojan encima de los nodos i (es decir, en los bloques de mayor número). Cada nodo i contiene una lista con los números de los bloques de disco en el fichero al que describe. (Realmente, esto no es del todo cierto; tan sólo se aplica a los ficheros pequeños, pero el resto de detalles no son tan importantes). Hay que tener en cuenta que el nodo i no contiene el nombre del fichero. Los nombres de los ficheros se disponen enestructuras de directorio. Una estructura de directorio proyecta los nombres a los números de nodos i. Esto explica por qué, en 19 El Cómo de los Fundamentos de Unix e Internet Unix, un fichero puede tener varios nombres (o enlaces simbólicos); simplemente, se trata de diversas entradas de directorio que apuntan a un mismo nodo i. 11. Puntos de montaje En el caso más sencillo, todo el sistema de ficheros de Unix reside en una sola partición de disco. Esta disposición no suele ser la más usual, a pesar de que usted pueda verla en algunos sistemas personales Unix. Lo más común es que esté distribuida a lo largo de varias particiones, posiblemente incluso en diferentes discos físicos. Así, por ejemplo, su sistema puede tener una partición pequeña, que es donde reside el núcleo, otra un poco mayor, para las utilidades del SO y otra bastante más extensa, donde se guardan los directorios raiz del usuario. La única partición a la que usted tendrá acceso, inmediatamente después del arranque del sistema, es la partición raiz, que, casi siempre, es de donde el sistema ha arrancado. Contiene el directorio raiz del sistema de ficheros, que viene a ser el nodo principal de donde se "descuelga" el resto. El resto de particiones del sistema deben estar adjuntas a esta raiz, para así poder hacer accesible todo el sistema de ficheros de partición múltiple. A medio camino del proceso de arranque, Unix hará accesibles estas particiones no-raiz; montará cada una en un directorio de la partición raiz. Por ejemplo, si usted posee un directorio de Unix llamado ‘/usr’, seguramente se tratará de un punto de montaje a una partición que contiene varios programas instalados con Unix, pero que no se necesitan durante el arranque inicial. 12. Cómo buscar un fichero Ahora podemos ver el sistema de ficheros de arriba a abajo. Al abrir un fichero, como por ejemplo,/home/esr/WWW/ldp/fundamentals.sgml, ocurrirá lo siguiente: Su núcleo acude, en primer lugar, a la raíz de su sistema de ficheros Unix ( en la partición raíz). Una vez dentro, busca un directorio llamado “inicio”. Normalmente, “inicio” es un punto montado a una partición ancha de usuarios, que se encuentra en otro lugar, por eso empieza allí. En el directorio del nivel más alto de esta partición de usuarios, busca una entrada llamada “esr” y extrae un número de nodo i. Acude a este nodo i, que es una estructura de directorios, y busca “W WW”. Al extraerestenodo-i, va 20 El Cómo de los Fundamentos de Unix e Internet al subdirectorio correspondiente y busca “ldp”. Lo traslada a otro nodo i de directorio. Al abrirlo, va a encontrar un nombre nodo i para “fundamentals.smgl”; este nodo i no es un directorio, pero despliega la lista de los bloques de discos asociados con el fichero. 12.1. Propiedad de un fichero, permisos y seguridad Unix posee características de permisos, que protegen a los programas de modificaciones accidentales y dañinas en sus datos. En un principio, dichas características fueron concebidas para admitir el tiempo compartido, protegiendo entre sí a múltiples usuarios que trabajaban con el mismo computador. Esto ocurría en el pasado, cuando Unix se ejecutaba en mini-computadores compartidos caros. Para comprender qué son los permisos de fichero, deberá recordar de nuestra descripción de grupos y usuarios en el apartado ¿Qué sucede cuando ingresa en el sistema?. Cada fichero pertenece a un usuario y a un grupo, que, al principio, suele ser el creador del fichero; pueden cambiarse con los programas chown(1) y chgrp(1). Los permisos básicos que pueden estar relacionados con un fichero son: “leer” ( permiso de lectura), “escribir” ( permiso de escritura) y “ejecutar” ( permiso para ejecutarlo como programa). Cada fichero posee tres tipos de permisos: uno para su usuario, otro para cualquier usuario del mismo grupo, y finalmente uno para cualquier otra persona. Los privilegios que obtiene al entrar en el sistema son sólo la capacidad de leer, escribir y ejecutar estos ficheros para los cuales los bits de permiso comprueban su identificador de usuario o alguno del grupo al cual pertenece. Para comprobar cómo se relacionan dichos permisos y cómo los presenta Unix, veamos unos listados de ficheros en un sistema Unix hipotético. Por ejemplo: snark:~$ ls -l notes -rw-r--r-1 esr users 2993 Jun 17 11:00 notes Este es un fichero de datos corriente. El listado nos dice que pertenece al usuario ‘esr’ y que fue creado con el grupo ‘users’ al cual pertenece. Probablemente, el computador que estamos utilizando incluye, como norma, a cualquier usuario dentro de este grupo; otros nombres de grupos que pueden aparecer en máquinas de tiempo compartido son ‘staff’ ‘admin’, o‘wheel’( por razones evidentes, los grupos no son demasiado importantes en las estaciones de trabajo utilizadas por una sola persona o en los PCs). Es posible que Unix utilice un grupo diferente, quizás uno con el mismo nombre que su identificador de usuario. La cadena ‘-rw-r--r-;‘ representa los bits de permiso para el fichero. La primera raya equivale a la posición del bit de directorio; si el fichero fuera un directorio, mostraría 21 El Cómo de los Fundamentos de Unix e Internet ‘d’. A continuación, las tres primeras letras son los permisos del usuario, las tres siguientes los permisos del grupo, y las tres ultimas los permisos de los demás (a menudo llamados permisos "globales"). En este fichero, el propietario ‘esr’ puede leer o escribir el fichero, el resto de miembros del grupo ’users’, así como loa demás, pueden leerlo. Esta es una típica forma de atribución de permisos para un fichero de datos ordinario. Ahora veamos un fichero con permisos muy distintos. Este fichero es GCC, el compilador C de GNU. snark:~$ ls -l /usr/bin/gcc -rwxr-xr-x 3 root bin 64796 Mar 21 16:41 /usr/bin/gcc Este fichero pertenece al usuario ‘root’ y al grupo ‘bin’; tan sólo "root" puede escribir o modificarlo, pero todos pueden leerlo y ejecutarlo. Se trata de una propiedad típica y un conjunto de permisos para un sistema de órdenes preinstalado. El grupo ‘bin’ aparece en algunos Unix para agrupar a las órdenes del sistema (el nombre es la abreviación de la palabra ‘binario’). Unix también puede utilizar un grupo ‘root’, que no tiene por qué ser lo mismo que el usuario ‘root’. El usuario ‘root’ es el nombre convencional para el identificador numérico de usuario 0, que es una cuenta especial y privilegiada que puede restringir todos los privilegios restantes. El acceso como root es útil, pero peligroso; un error de tecleo mientras se está dentro del sistema como root puede dañar sistemas de ficheros esenciales que, de haberlos ejecutado como usuario ordinario, no hubiesen sufrido modificación alguna. Debido a que la cuenta de root es tan potente, su acceso tiene que estar muy restringido. Su contraseña de root es la información más importante en lo que concierne a la seguridad de su sistema, y es lo que desearán obtener los piratas informáticos e intrusos que le visiten. A propósito de las contraseñas: no las anote, y no elija una contraseña que se pueda adivinar fácilmente, como puede ser el nombre de su novio/novia/esposa. Es una práctica muy arriesgada y común que anima a los piratas a seguir adelante. En general , no elija una palabra cualquiera del diccionario; existen programas llamados ‘reventadores de diccionario’, que buscan las contraseñas más probables repasando una lista de palabras como elecciones más comunes. Una buena técnica podría ser elegir una combinación que consista en una palabra, una cifra, y otra palabra, como por ejemplo, ‘pez6sidra’ o ‘sal3diver’; esto dificultará enormemente el reventado de la clave mediante técnicas de diccionario. No utilice estos ejemplos, puesto que los piratas ya los habrán introducido en sus diccionarios. Ahora, veamos un tercer caso: 22 El Cómo de los Fundamentos de Unix e Internet snark:~$ ls -ld ~ drwxr-xr-x 89 esr snark:~$ users 9216 Jun 27 11:29 /home2/esr Este fichero es un directorio (nótese ‘d’ al comienzo de la línea del permiso). Se puede observar que tan sólo ’esr’ puede escribirlo, pero que cualquier persona puede leerlo y ejecutarlo. Usted podrá listar el contenido del directorio gracias al permiso de lectura, es decir, que puede ver los nombres de los ficheros y de los directorios que contiene. Con el permiso de escritura, podrá crear y borrar los ficheros en el directorio. Si tiene en cuenta que el directorio incluye a su vez un listado con los nombres de ficheros y subdirectorios que contiene, estas reglas tendrán sentido. El permiso de ejecución de un directorio significa que puede entrar en el directorio para abrir sus ficheros y directorios; en efecto, podrá acceder a los nodos i del directorio. De hecho, un directorio sin permiso de ejecución sería un directorio totalmente inútil. Ocasionalmente verá un directorio que todos pueden ejecutar pero no leer; eso significa que un usuario aleatorio puede acceder a los ficheros y directorios, pero sólo si conoce los nombres exactos, puesto que no podrá obtener un listado del directorio. Es importante recordar que los permisos de lectura, escritura y de ejecución de un directorio son independientes de los permisos sobre los ficheros y directorios que dependan de él. En particular, el acceso a la escritura en un directorio significa que se pueden crear nuevos ficheros o borrar ficheros ya existentes. Finalmente, veamos los permisos del propio programa de conexión: snark:~$ ls -l /bin/login -rwsr-xr-x 1 root bin 20164 Apr 17 12:57 /bin/login Contiene los permisos que suelen aparecer en las órdenes del sistema, excepto por la ‘s’, que ocupa el lugar en que debería aparecer el bit de ejecución del usuario. Se trara de una manifestación clara de un permiso especial llamado "bit para el establecimiento de identificación del usuario (set-user-id)" o setuid bit . El setuid bit está normalmente unido a aquellos programas que necesitan proporcionar al usuario ordinario los privilegios de un usuario raíz, pero de forma controlada. Cuando se utiliza en un programa ejecutable, usted obtiene los privilegios del propietario de este fichero de programa, mientras el programa se ejecuta bajo su nombre, se correspondan o no con los suyos. Al igual que la propia cuenta root, los programas setuid son útiles, pero peligrosos. Cualquiera que pueda modificar un programa setuid perteneciente a ‘root’, podrá crear 23 El Cómo de los Fundamentos de Unix e Internet una shell o intérprete de órdenes con los privilegios de ‘root’. Por tal motivo, al abrir un fichero para escribir automáticamente, el bit setuid se desactiva en la mayoría de los Unix. Muchos ataques contra la seguridad de Unix intentan aprovechar los fallos en los programas setuid para modificarlos. Por tal motivo muchos administradores se resisten a instalar nuevos programas setuid, a la vez que se muestran cautos ante este tipo de programas. Hay un par de detalles importantes que hemos pasado por alto al hablar sobre los permisos, tales como la forma en que se asigna el grupo propietario y sus correspondientes permisos, a la hora de crear un fichero o un directorio. El grupo constituye un problema, puesto que los usuarios pueden formar parte de varios grupos, pero uno de ellos (especificado en la entrada de usuario /etc/passwd ) esel grupo predeterminado del usuario, y será a éste a quien pertenezcan los ficheros que se creen. El apartado de los bits de permiso inicial es un poco más complicado; un programa que crea un fichero especificará, normalmente, los permisos con los cuales tiene que crearse. Pero esto se modificará con una variable en el entorno de usuario llamada umask. Mediante umask se especifican los bits de permiso que deben desactivarse al crear un fichero; el valor más común, y el predeterminado en la mayoría de los sistemas, es -------w- o 002, que desactiva el bit que proporciona el permiso de escritura para el resto del mundo. Si desea obtener más información, acuda a la documentación sobre la orden umask en la página de manual correspondiente. El grupo inicial del directorio es también un poco complicado. En algunos Unix un directorio nuevo se incorpora al grupo predeterminado del usuario que lo ha creado, esto ocurre por convención en el System V; en otros, pasa a formar parte del grupo del directorio padre en el que está creado, tal y como sucede en la convención de los BSD (Distribución de Software Berkeley). En algunos Unix modernos, Linux incluido, se puede seleccionar este último comportamiento, configurando la identificación del grupo en el directorio ( chmod g+s). Existe una disertación muy útil acerca de los permisos en el artículo de Eric Goebelbecker Take Command (http://www2.linuxjournal.com/lj-issues/issue21/1190.html). 12.2. ¿Cómo pueden ir mal las cosas? Ya hemos insinuado anteriormente que los sistemas de ficheros pueden ser elementos muy frágiles. Ahora sabemos que, para obtener un fichero, tiene que intentar adivinar lo que puede ser una posible gran cadena de directorios y referencias a nodos-i. Ahora, supongamos que en su disco duro se forma una "mancha". 24 El Cómo de los Fundamentos de Unix e Internet Si es afortunado, sólo destruirá algunos ficheros. Si no, podría corromper toda una estructura de directorio o un número de nodo-i dejar a todo un sub-árbol de su sistema descolgado, o, peor, puede dar lugar a toda una estructura contaminada que señala varias rutas para el mismo bloque de discos o nodo-i. Tal problema puede extenderse a operaciones de fichero normales, eliminando datos que no no estaban afectados en un principio. Afortunadamente, este tipo de contingencias ya no son tan comunes, puesto que el hardware de los discos es ahora más fiable. Aún así, Unix querrá verificar la integridad del sistema de ficheros periódicamente para asegurarse de que todo está en orden. Los Unix modernos realizan una verificación rápida de integridad en cada partición al iniciar el sistema, justo antes de montarlo. Después de varias reinicializaciones, Unix hará una revisión más exhaustiva, que tardará unos minutos más. Si todo esto le hace pensar que Unix es muy complicado y proclive a tener fallos, puede que le reconforte saber que estas verificaciones de inicialización detectan y corrigen problemas rutinarios antesde que se agraven. Otros sistemas operativos no poseen estas cualidades, por lo que su tiempo de arranque disminuye ligeramente, pero puede provocarle contratiempos más serios cuando intente recuperar ficheros de forma manual (suponiendo, ante todo, que posee una copia de Norton Utilities o similar...). Una tendencia en diseño Unix actual son los sistemas de ficheros journalling , que toman nota en un diario de todo el tráfico del disco, para garantizar que se encuentra en un estado consistente que pueda regenerarse cuando el sistema vuelva a levantarse. Ello reducirá grandemente la comprobación de integridad del disco cuando el sistema arranque. 13. ¿Cómo funcionan los lenguajes de programación? Ya hemos hablado de qué sucede cuando ejecuta programas desde el intérprete de órdenes. Básicamente, cada programa debe ejecutarse como una cadena de bytes, que son instrucciones escritas en lenguaje de máquina, y saber hacerlo se ha convertido en toda una proeza, incluso entre los más expertos. Casi todo el código fuente Unix, excepto una pequeña cantidad de soportes de controladores que interactúan directamente con el hardware dentro del propio núcleo, está en la actualidad escrito en un lenguaje de alto nivel. (el término "alto nivel" se utiliza para distinguirlo de los lenguajes ensambladores, de "bajo nivel", que no son 25 El Cómo de los Fundamentos de Unix e Internet otra cosa que tenues envolturas del código de máquina) Existen diferentes tipos de lenguajes de alto nivel. Al hablar de ellos hay que tener en cuenta que el código fuente de un programa (que es la versión editable, creada por el hombre) tiene que traducirse al código de máquina, para que ésta pueda ejecutarlo. 13.1. Lenguajes compilados Ellenguaje compiladoes el más convencional. Los lenguajes compilados se traducen en ficheros ejecutables de códigos de máquina binarios mediante un programa llamado, claro está, compilador. Una vez que se ha creado el binario, usted podrá ejecutarlo directamente, sin tener que volver al código fuente. (La mayoría de los softwares se entregan en forma de binarios compilados, procedentes de códigos que usted no ve). Los lenguajes compilados suelen tener excelentes prestaciones y poseen el acceso al SO más completo, aunque también son los más difíciles de programar. C, el lenguaje en el que está escrito Unix, es el más importante (con su variante C++). FORTRAN es otro lenguaje compilado, que aún utilizan ingenieros y científicos, pero mucho más antiguo y primitivo. En el mundo Unix no se utiliza ningún otro lenguaje; fuera de él, COBOL se utiliza mucho para crear software comercial y empresarial. Existen otros muchos lenguajes compilados pero la mayoría de ellos ya se han extinguido, no se utilizan, o se usan solamente como herramientas de investigación. Si usted está trabajando con un lenguaje de programación en Unix, seguramente lo hará con C o C++. 13.2. Lenguajes interpretados Un lenguaje interpretado depende de un programa intérprete que lea el código fuente y, a la vez, lo traduzca en órdenes y llamadas al sistema. La fuente debe ser re-traducida (y el intérprete debe aparecer) cada vez que se ejecuta un código. Los lenguajes interpretados suelen ser más lentos que los compilados y, a menudo, poseen un acceso limitado al sistema operativo subyacente y al hardware. Por otro lado, suelen ser más sencillos de programar y más flexibles ante errores de código que los lenguajes compilados. Muchas utilidades de Unix, incluidos el shell, bc (1), sed(1) y awk (1) son, de hecho, pequeños lenguajes interpretados. Los lenguajes BASIC suelen ser intérpretes, al igual que los tcl. Históricamente, el lenguaje intérprete más importante ha sido LISP (el mayor adelanto sobre mucho de sus predecesores). Hoy en día, los lenguajes 26 El Cómo de los Fundamentos de Unix e Internet interpretados puros más importantes son los intérpretes de órdenes Unix y el lenguaje lisp que reside en el interior del editor de texto Emacs. 13.3. Lenguajes de pseudo-código Desde 1990, un lenguaje híbrido que utiliza, tanto la compilación como la interpretación, se ha hecho más importante. Los lenguajes de pseudocódigo se parecen a los lenguajes compilados en que la fuente se traduce a un binario compacto, que es lo que realmente se ejecuta; sin embargo, esa forma no es código de máquina. Se trata de un pseudocódigo (o p-código), que suele ser mucho más simple y más potente que un lenguaje de máquina real. Cuando usted ejecuta el programa, está traduciendo el p-código. El p-código se puede ejecutar tan rápido como un binario compilado (los intérpretes de p-código pueden ser más sencillos, más pequeños y más potentes). Sin embargo, los lenguajes de p-código pueden conservar la flexibilidad y potencia de un buen intérprete. Algunos lenguajes de p-código importantes son Python, Perl y Java. 14. ¿Cómo funciona Internet? Para ayudarle a comprender cómo funciona Internet, veamos qué ocurre cuando usted realiza una operación típica de Internet: seleccionar un navegador en la página principal de este documento como su página de inicio en el sitio web del Proyecto de Documentación de Linux. Este documento es: http://www.linuxdoc.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.htm Lo que significa que se encuentra en el fichero LDP/COMO/Fundamentos.html, bajo el directorio exportado a la vista de la red global (WWW) del servidor metalb.unc.edu 14.1. Nombres y direcciones Lo primero que debe hacer su navegador es establecer una conexión en red al equipo en el que reside el documento. Para ello debrá encontrar la dirección en la red del anfitrión www.linuxdoc.org ("servidor" es el término corto para "equipo servidor" o "servidor de red"; www.linuxdoc.org es un nombre típicopara un servidor). La 27 El Cómo de los Fundamentos de Unix e Internet dirección correspondiente es, en realidad, un número denominado dirección IP (más tarde explicaremos lo que es IP). Para realizar esta operación, su navegador pregunta a un programa llamado servidor de nombres. Este servidor de nombres puede residir en su equipo, pero es más probable que se ejecute en un computador servidor con el que se comunica. Cuando usted se da de alta en un proveedor de servicios de Internet, parte de su procedimiento de configuración podrá implicar, casi con certeza, el que tenga que decirle a su software de Internet la dirección IP de un servidor de la red ISP. Los servidores nombre de los diferentes equipos se comunican entre sí, intercambiando y actualizando toda la información necesaria para resolver nombres de servidores (dirigiéndolos a direcciones IP). Su servidor de nombre podrá solicitar 3 ó 4 sitios diferentes a través de la red durante el proceso de resolución de www.linuxdoc.org pero esto suele ocurrir de forma muy rápida (en menos de un segundo). El servidor de nombres le dirá a su navegador que la dirección IP de www.linuxdoc.org es 152.19.254.81; con este dato, su equipo será capaz de intercambiar bits directamente con Metalab. 14.2. Paquetes y encaminadores Lo que el navegador quiere hacer es enviar una orden al servidor web en Metalab, lo cual se parece a: GET HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.htm HTTP/1.0 Y esto es lo que ocurre: la orden se ha convertido en un paquete, un conjunto de bits, parecidos a un telegrama, que está envuelto por tres elementos importantes: ladirección fuente (la dirección IP de su equipo), ladirección de destino (152.19.254.81), y un número de servidor o número de puerto (80, en este caso) que indica que es una petición a la red global (World Wide Web). Entonces, su equipo enviará el paquete por cable (conexión vía módem con su ISP o red local) hasta que llegue a una máquina especial denominadaencaminador. Este encaminador posee un mapa de Internet en su memoria, no del todo completo, pero que describe totalmente su entorno de red y conoce cómo llegar a los otros encaminadores para otros entornos de Internet. Su paquete podrá atravesar bastantes encaminadores hasta llegar a su destino. Los encaminadores son inteligentes; observan cuánto tiempo tardan otros encaminadores en confirmar que han recibido un paquete, utilizan esta información para dirigir el tráfico 28 El Cómo de los Fundamentos de Unix e Internet sobre conexiones rápidas, para anunciar cuándo otros encaminadores (o cables) se han descolgado de la red y compensarlo, si es posible, encontrando otra ruta. Existe una leyenda urbana que dice que Internet fue diseñada para sobrevivir a la guerra nuclear. Esto no es cierto, pero el diseño de Internet es extremadamente bueno en conseguir actuaciones fidedignas de hardware extraño en un mundo incierto. Todo ello se debe directamente al hecho de que su inteligencia se distribuye a través de miles de encaminadores, más que mediante unos pocos interruptores masivos (como ocurre con la red telefónica), lo que significa que los fallos tienden a estar bien localizados y la red puede esquivarlos. Una vez que su paquete consigue llegar a su equipo destino, ese equipo utiliza el número de servicio para pasar el paquete al servidor web. El servidor puede confirmar a dónde contestar, buscando en la dirección IP fuente del paquete de órdenes. Cuando el servidor web entrega este documento, éste se dividirá en cierto número de paquetes. El tamaño de los paquetes podrá variar de acuerdo con el medio de transmisión de la red y el tipo de servicio. 14.3. TCP e IP Para entender cómo se manejan las transmisiones de paquetes múltiples, necesita saber que Internet utiliza realmente dos protocolos, apilados el uno sobre el otro. En el nivel inferior, IP (Protocolo de Internet), sabe cómo conseguir paquetes individuales de una dirección fuente a una dirección de destino (este es el motivo por el qué se les llame direcciones IP). Sin embargo, IP no es fiable; los equipos fuente y destino no podrán sabrán nunca si un paquete se ha entregado o se ha perdido. En la jerga de Internet, IP es un protocolo sin conexión: el emisor tan sólo lanza un paquete al receptor, sin esperar confirmación alguna. Sin embargo, IP es rápido y barato. Que sea rápido, barato y poco fiable está bien, algunas veces. Cuando utiliza algún video juego en red, cada pequeña imagen se representa mediante un paquete. Si se pierden algunas imágenes, no importa. El nivel superior, TCP (Protocolo de Control de Transferencia) le proporciona fiabilidad. Cuando dos equipos negocian una conexión TCP, lo cual se hace utilizando IP, el receptor sabe enviar reconocimientos de los paquetes que recibe al emisor. Si el emisor no ve ningún reconocimiento de un paquete durante un cierto período de tiempo, reenvía el paquete. Además, el emisor asigna a cada paquete TCP un número de secuencia, que el receptor puede utilizar para volver a ensamblar paquetes en caso de que se muestren fuera de servicio. (Esto puede ocurrir si los enlaces de la red suben o bajan durante una conexión). 29 El Cómo de los Fundamentos de Unix e Internet Los paquetes TCP/IP también contienen una suma de verificación para permitir la detección de datos alterados por malos enlaces. De este modo, desde el punto de vista de alguien que utiliza TCP/IP o servidores de nombres, parece ser un modo fiable de enviar cadenas de bytes entre parejas de anfitriones y números de servicio. Quienes escriben protocolos de red casi nunca tienen que pensar en el empaquetado, reensamblaje de paquetes, verificación de errores, sumas de verificación y retransmisiones que se producen bajo ese nivel. 14.4. HTTP, un protocolo de aplicación Ahora, volvamos a nuestro ejemplo. Los navegadores y servidores web se comunican entre sí mediante protocolo de aplicación que se ejecuta sobre TCP/IP, usándolo simplemente como una manera de transportar cadenas de bytes de delante hacia atrás. A este protocolo se le denomina HTTP (Protocolo de Transporte de Hipertextos) y ya casi hemos visto una orden de él; el GET que mostrábamos anteriormente. Cuando la orden GET va al servidor www.linuxdoc.org con el número de servicio 80, será enviada a un servidor demonio que espera en el puerto 80. La mayor parte de los servicios de Internet se implementan con servidores demonios que lo único que hacen es esperar en los puertos, comprobando y ejecutando órdenes entrantes. Si el diseño de Internet tiene una regla general es la de que todas las partes deberían ser tan simples y accesibles al ser humano como fuera posible. HTTP y sus parientes, como el Protocolo Simple de Transferencia de Correo, SMTP, que se utiliza para enviar correo electrónico entre servidores, tienden a utilizar órdenes simples en estilo de texto sin formato, terminadas en un retorno de carro/avance de línea. No obstante, todo este proceso es algo ineficaz; en algunas circunstancias usted podría conseguir mayor rapidez utilizando un protocolo binario rigurosamente codificado. Pero la experiencia ha demostrado que los beneficios de tener órdenes fáciles de entender y escribir perfectamente para los humanos supera con creces cualquier mínima ganancia en rendimiento que se pudiese conseguir a expensas de hacer las cosas difíciles y opacas. Por tanto, lo que el servidor demonio le envía a través de TCP/IP es también un texto. El inicio de la respuesta será algo parecido a lo siguiente (algunas cabeceras se han suprimido): HTTP/1.1 200 OK Date: Sat, 10 Oct 1998 18:43:35 GMT Server: Apache/1.2.6 Red Hat Last-Modified: Thu, 27 Aug 1998 17:55:15 GMT 30 El Cómo de los Fundamentos de Unix e Internet Content-Length: 2982 Content-Type: text/html Estas cabeceras irán seguidas de una línea en blanco y, a continuación, el texto de la página web, después del cual la conexión se cae. Su explorador visualizará esa página y las cabeceras le indicarán cómo lo ha hecho.( En particular, la cabecera "Content-Type:" le comunicará dirá que los datos expuestos son realmente HTML). 15. Anexo: El INSFLUG El INSFLUG forma parte del grupo internacional Linux Documentation Project, encargándose de las traducciones al castellano de los Howtos (Cómos), así como la producción de documentos originales en aquellos casos en los que no existe análogo en inglés. El INSFLUG se orienta preferentemente a la traducción de documentos breves, como los COMOs y PUFs (Preguntas de Uso Frecuente o FAQ), etc. Diríjase a la sede del INSFLUG para más información al respecto. En la sede del INSFLUG encontrará siempre las últimas versiones de las traducciones: http://www.insflug.org. Asegúrese de comprobar cuál es la última versión disponible en el Insflug antes de bajar un documento de un servidor réplica. Se proporciona también una lista de los servidores réplica (mirror) del Insflug más cercanos a Vd., e información relativa a otros recursos en castellano. El equipo coordinador de Insflug, [email protected] (mailto:[email protected]) 31
© Copyright 2024