El Cómo de los Fundamentos de Unix e Internet

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