\documentclass[12pt,a4paper]{article}
\usepackage[latin1] {inputenc}
\usepackage[spanish]{babel}

\title{Configuración y administración de un sistema GNU/Linux}
\author{Margarita Manterola y Maximiliano Curia}
\date{Actualizado Mayo 2003}

\begin{document}

%\hyphenrules{nohyphenation}

\maketitle

\tableofcontents

\section{Introducción}

\section{Configuración del Sistema}

En esta sección vamos a ver, sin adentrarnos mucho en detalles ni conceptos,
como configurar nuestro equipo, para distintas situaciones típicas. Si bien
normalmente las configuraciones que ofrecemos son independientes de la
distribución de GNU/Linux que usemos, cuando tengamos que dar detalles los
daremos para Debian GNU/Linux.

\subsection{Obtener información}

Siempre que queramos configurar un dispositivo será importante tener
información sobre sus características.  Para esto, puede resultar de
utilidad, consultar los manuales, la caja o mirar la plaqueta del dispositivo.
GNU/Linux tiene, además, ciertas herramientas para ayudarnos a configurar
nuestro equipo.

\begin{description}
\item[lspci] nos muestra información sobre las placas PCI que
tengamos instaladas en nuestro sistema. Es, en realidad, un resumen de la
información mas útil que se encuentra en /proc/pci.

\item[pnpdump] nos muestra información (mucha) sobre las placas isapnp
que tengamos (muchas veces, ninguna). Además, la salida de este
comando nos sirve para tener un archivo de configuración para
\verb!isapnp!.

\item[discover] puede darnos información acerca del hardware que
tenemos, según el tipo de hardware que estemos buscando.

Ejemplo \verb!discover sound! nos dice qué placa de sonido tenemos y
si ejecutamos \verb!discover --module sound! nos dice qué módulo de
kernel deberemos utilizar para configurar esa placa.

También podemos preguntarle sobre:
bridge, cdrom, ide, scsi,  usb,  ethernet, modem, y video.

\item[mdetect] nos permite detectar que tipo de mouse tenemos.

\item[read-edid], para configurar el video.
\item[kudzu], para todo tipo de hardware.
\end{description}

\subsection{Configuración de mouse en consola}

El mouse es un dispositivo de entrada muy útil, que nos puede ayudar
tanto en entornos gráficos como en consola de texto.
Para utilizar el mouse dentro de la consola de texto utilizamos un
servicio llamado {\bf gpm} (General Purpose Mouse Interface).

Además de dejar disponible el uso del mouse para muchos programas también
nos da algunas ventajas extras como la de seleccionar una fragmento de
texto y pegarla con el botón del medio. El programa {\bf gpm} no tiene
definido un archivo de configuración, sino que recibe los valores por
parámetros.

Por ejemplo:
\verb!/usr/sbin/gpm -m /dev/psaux -t imps2!, le dice que use el
dispositivo {\bf /dev/psaux} como un mouse {\it IntelliMouse} PS/2.

Como tantos otros programas dentro del entorno Unix, {\bf gpm} es un
programa que realiza una sola tarea, la de manejar el mouse, y lo hace
bien.  Mientras que el servidor {\bf X} de modo gráfico hace una gran
cantidad de cosas.  Si elegimos que sea {\bf gpm} quien maneje el mouse,
podemos aliviar parte del trabajo del X. Para eso existe la opción \verb!-R!
de gpm (repeat) que puede enviar los comandos que detectó el gpm con o
sin formato a un dispositivo creado por el gpm ({\bf /dev/gpmdata}). 

Por ejemplo: \verb!/usr/sbin/gpm -m /dev/psaux -t imps2 -Rms3!. \\

Para configurar este servicio, dentro de la distribución Debian
GNU/Linux se utiliza el script {\bf gpmconfig}.  En otras
distribuciones se utilizan otros programas para configurar, o se edita
un archivo de configuración.  Los valores a utilizar serán muy
similares, ya que en definitiva son parámetros que se le indican al
{\bf gpm}.

El {\bf gpmconfig} es un script interactivo que en primer lugar
muestra la configuración actual del mouse (si es que existe), y luego
permite modificarla según sea necesario. Los parámetros que deben ser
configurados son:

\begin{description}
\item[Dispositivo (device)] es el dispositivo al que está conectado el
mouse.  Las posibilidades son las siguientes.
\begin{itemize}
\item {\bf /dev/psaux}, si se trata de un mouse PS/2.
\item {\bf /dev/ttyS0}, si está conectado al COM1.
\item {\bf /dev/ttyS1}, si está conectado al COM2.
\item {\bf /dev/ttyS2}, si está conectado al COM3.
\item {\bf /dev/ttyS3}, si está conectado al COM4.
\item {\bf /dev/usb/mouse}, si es un mouse USB.
\item {\bf /dev/mouse}, que
normalmente es un symlink al dispositivo correspondiente al mouse.
\end{itemize}

\item[Tipo (type)] es el tipo de mouse que se quiere configurar (con 2
o 3 botones, con o sin ruedita, etc).  En este caso hay muchas
posibilidades, se incluyen aquí las más comunes.

\begin{itemize}
\item {\bf msc}, para la mayoría de los mouse serie de 3 botones.

\item {\bf ms}, si se trata de un mouse serie, de tipo {\it
Microsoft}, con 2 o 3 botones (si tiene sólo dos, el tercero es
{\it simulado} cuando se aprietan los dos a la vez).

\item {\bf ms3}, si se trata de un mouse serie con ruedita y tres
botones.

\item {\bf ps2}, si se trata de un mouse PS/2 genérico.

\item {\bf imps2}, si se trata de un mouse PS/2, con ruedita y dos o
tres botones (si tiene dos, el tercero es emulado).

\item {\bf netmouse}, si se trata de un mouse {\it Genius Netmouse},
que tiene dos botones de arriba/abajo en lugar de ruedita.

\end{itemize}

\item[Aceleración (responsiveness)] permite que el mouse se mueva a
mayor velocidad a través de la pantalla.  Se trata de un valor
numérico, cuyo valor predeterminado es 10. Un cursor veloz se obtiene
con 20, utilizando 30 ya es demasiado rápido (todo esto depende del
mouse).

\item[Protocolo de Repetición (repeat protocol)] es la forma en que el
{\bf gpm} va a repetir la entrada del mouse al modo gráfico, según se
explicó anteriormente.

Para que esto se haga efectivo, será necesario indicarle al servidor
{\bf X} que la entrada de mouse la lea de {\bf /dev/gpmdata}, en lugar
de leerla directamente desde el mouse.  Y el tipo de mouse que se le
especifique al servidor deberá coincidir con el protocolo indicado.

Si se especifica la opción {\bf none}, no se realizará la repetición.
Esta es la opción a seleccionar cuando se quiere que el modo gráfico
maneje la entrada de mouse.  Si, en cambio, se especifica la opción
{\bf ms3}, la repetición se realizará en el protocolo {\it
IntelliMouse} y esto mismo habrá que seleccionar en la configuración
del servidor.

\item[Opciones Adicionales (additional arguments)] es posible
configurar una cantidad de opciones adicionales a las mencionadas
anteriormente.  Para saber qué opciones pueden utilizarse en esta
línea, se puede consultar el manual de {\bf gpm}.
\end{description}

\subsection{Configuración de teclado}

La forma de configurar el teclado varía de distribución en
distribución.  Hay dos maneras de configurarlo: directamente desde el
kernel o desde el sistema.  Algunas distribuciones utilizan una forma
o la otra, y algunas -como Debian- permiten elegir de qué forma se lo
configurará.

Dentro de Debian la forma de configurar el teclado es ejecutar el
comando \verb!dpkg-reconfigure console-common!.  La primera pantalla
explica las opciones que se van a mostrar en la segunda.  En la
segunda pantalla se permite seleccionar la forma de configuración de
teclado (kernel o no).

Seleccionando la opción {\bf Select keymap from arch list}, debemos
luego poner la disposición general de las teclas ({\bf qwerty} es la
disposición común, de la mayoría de los teclados en inglés y español).
Y en la siguiente pantalla se selecciona la disposición regional.  El
teclado {\bf latino-americano} es el teclado que tiene la @ en la misma
tecla que la Q, y el {\bf español} el que tiene la @ en la misma tecla
que el 2 y las ". 

\subsection{Módulos}

En GNU/Linux, gran parte del hardware que utilicemos tiene que estar
soportado por el kernel Linux, antes de que lo usemos.

Por ejemplo, normalmente Linux ya tiene compilado el soporte de rígidos IDE,
de manera que podemos utilizar el disco rígido ni bien se inicia el sistema.
Esto mismo sucede con los dispositivos más comunes, como los puertos
serie y paralelo.

Sin embargo, es normal que no este compilado en el kernel el soporte para
todo el resto del hardware, sino que el soporte esté disponible en
forma de módulos. En la práctica los módulos funcionan como los {\it
drivers} en otros sistemas operativos, cargar el módulo correcto nos
permite utilizar nuestro hardware. \\

Para manejar los módulos usamos:

\begin{description}
\item[lsmod] Lista los módulos que ya están cargados.

\item[modprobe -l] Muestra todos los módulos disponibles para la
versión del kernel que estamos utilizando. (El listado es largo, se puede
utilizar: \verb!modprobe -l | less!, o bien \verb!modprobe -l | grep net!, \\
\verb!modprobe -l | grep agp!, según el módulo que se esté buscando).

\item[modinfo módulo] Muestra información sobre el modulo, como por
ejemplo, qué opciones recibe.

\item[modprobe módulo opciones] Carga el módulo y le pasa las
opciones.

\item[insmod ruta/modulo.o] Otra forma de cargar el módulo,
en este caso recibe como parámetro la ruta de acceso al módulo.

\item[rmmod] Quita el módulo de memoria. El módulo no puede estar
siendo utilizado si se lo quiere sacar de la memoria.

\item[modconf] (Específico de Debian)
Es una aplicación un poco más amigable, que permite
buscar en el listado de módulos, instalar el módulo que necesario y
configurarlo para que se cargue automáticamente al reiniciar el sistema.

\end{description}

Por otro lado, si queremos configurar los módulos para que se carguen cuando
se inicia el sistema, deberemos editar el archivo {\bf /etc/modules}.

Y también el archivo {\bf /etc/modules.conf}, que permite configurar
algunas opciones que el sistema le va a pasar a los módulos cuando se
cargan, así como formas para que cargue determinado módulo al querer
usar determinado recurso. \\

Las sintaxis de este archivo es:

{\bf options módulo opciones} Para especificar las opciones para el
módulo.

{\bf alias recurso módulo} Para especificar qué módulo cargar al usar
determinado recurso. \\

En Debian GNU/Linux el archivo /etc/modules.conf es mantenido por una
aplicación llamada \verb!modutils!, que permite tener varios
archivos de configuración sencillos, separados por tareas o recursos.
Estos archivos deben ser colocados dentro del directorio {\bf
/etc/modutils/ }. Y para recopilar los archivos en /etc/modules.conf
se utiliza el comando \verb!update-modules!.

\subsection{Placas de Red - Ethernet}

La mayoría de las placas de red PCI se
configuran sin mayores dolores de cabeza, mientras que para configurar las ISA
puede llevar más tiempo encontrar la combinación de dirección/irq apropiada.

\subsubsection{Configuración del módulo}

En el caso de las placas PCI con la ayuda de \verb!discover! se puede
obtener el nombre del módulo que debe ser cargado para habilitar la
placa. Para la mayoría de las placas ISA se deberá utilizar el módulo
{\bf ne}. \\

Algunos ejemplos, de configuración de placas de red.

\begin{description}
\item [modprobe ne io=0x300 irq=10]

Le indica al sistema que busque y use una placa
de red ISA compatible con ne2000 el la dirección (io) 300, irq
10. La dirección de la placa debe escribirse en hexadecimal,
a eso se debe el 0x al comienzo del valor.

\item[modprobe ne2k-pci]

Le indica al sistema que habilite una placa PCI, la
mayoría de las placas de 10mb/s se configuran con este módulo.

\end{description}

\subsubsection{IP}

Una vez cargado el módulo tendremos disponible el acceso al dispositivo, pero
todavía no habremos configurado el acceso a la red.

Los nombres de los dispositivos que representan a las placas de red son
eth0 para la primera placa de red, eth1 para la segunda, etc.

Si en nuestra red se utiliza DHCP (obtención dinámica de IPs),
deberemos ejecutar un cliente de DHCP como \verb!pump!, \verb!dhcpcd!
o \verb!dhclient!, para obtenerla.  Estos comandos reciben como parámetro
el nombre del dispositivo a configurar.

En el caso de tener que configurar una dirección de IP manualmente, el comando
ifconfig nos puede resultar de utilidad. Si se ejecuta sin parámetros muestra el
estado de los dispositivos de red (además del dispositivo especial {\bf lo}), pero
también nos sirve para configurar una placa de red.

Por ejemplo: {\bf ifconfig eth0 192.168.200.32 netmask 255.255.255.0 up},
configura la dirección 192.168.200.32 para nuestra placa de red eth0.

\subsubsection{Rutas y DNS}

Normalmente también deberemos configurar un gateway, esto es, la dirección de
la máquina que nos permite acceder a otras redes. El comando
\verb!route!
será el que deberemos utilizar. Si lo ejecutamos sin parámetros nos muestra
información, al igual que \verb!ifconfig!, y con los parámetros adecuados
podemos configurar la ruta deseada.

Por ejemplo: \verb!route add default gw 192.168.200.1!, agrega una ruta default
(normalmente, el acceso al resto del mundo) a través de 192.168.200.1,
que deberá ser nuestro gateway.

También debemos configurar un DNS (Domain Name Server), es decir, la IP de
una máquina que pueda transformar nombres de dominios en direcciones IP.
Para eso debemos editar el archivo {\bf /etc/resolv.conf}, la sintaxis es
simple. Por ejemplo:

\begin{small}
\begin{verbatim}
domain local
nameserver 200.42.0.108
nameserver 200.42.0.109
\end{verbatim}
\end{small}

La primera línea configura el dominio en el que se encuentra la estación.
El dominio en el que esté dependerá de qué tipo de red se trate.
Las otras dos líneas de nameserver configurar los DNS que vamos a
utilizar.

\subsubsection{Proxy}

Si estamos en una red en la que debemos utilizar un Proxy para poder acceder a
Internet, deberemos configurar el proxy desde cada programa que queramos
utilizar. \\

Existe una variable de entorno, {\bf http\_proxy}, que es utilizada por los
programas de consola, como por ejemplo el navegador {\bf lynx}.  En esta
variable deberemos poner la ruta al proxy, incluyendo el usuario y el
password (si es que el proxy lo requiere).

Por ejemplo: {\bf http\_proxy=http://usuario:password@host.dominio:8080}.
Donde, host.dominio es el nombre de la máquina que funciona como proxy en
nuestra red, y 8080 es el puerto donde se encuentra el proxy.  Otros puertos
comunes donde podemos encontrar un proxy son: 3128 y 80.

Los navegadores gráficos, como el mozilla, tendrán una sección dentro de
las preferencias donde deberá introducirse la dirección del proxy y el
puerto a utilizar. \\

Para otros programas, deberemos utilizar el manual de la aplicación para
encontrar de qué manera se configura el proxy.  Por ejemplo, en el caso de la
herramienta apt de Debian, el proxy se configura en el archivo {\bf
/etc/apt/apt.conf} y la sintaxis es:

\begin{small}
\begin{verbatim}
Acquire::http::Proxy "http://usuario:password@host.dominio:8080";
\end{verbatim}
\end{small}
\subsubsection{Configuración en Debian}

Hasta aquí, las configuraciones que hicimos fueron cargadas a mano.
Sin embargo, lo deseable es realizar todos estos pasos una sola vez y que
luego se carguen automáticamente al iniciar el sistema.  Esta etapa será
distinta según la distribución que estemos utilizando.

En Debian GNU/Linux, utilizaremos la herramienta {\bf modutils}, que
mencionamos antes, para que se cargue el módulo de la placa
automáticamente cuando vamos a usar la placa.
Para eso creamos un archivo cualquiera (por ejemplo eth0)
en {\bf /etc/modutils} con una o dos líneas:

\begin{small}
\begin{verbatim}
alias eth0 módulo
options módulo opciones
\end{verbatim}
\end{small}

Deberemos utilizar la línea {\bf options} solamente en el caso de que
nuestra placa requiera opciones adicionales al utilizar \verb!modprobe! (por
ejemplo, si es una placa ISA).

Una vez editado el archivo, deberemos ejecutar \verb!update-modules!, de forma
que estos datos se guarden en {\bf /etc/modules.conf}.  De esta forma, cuando
tratemos de usar eth0 cargará automáticamente ese módulo dejando
disponible eth0. \\

A continuación, editaremos el archivo {\bf /etc/network/interfaces}.

Este archivo tiene una línea {\bf auto} que dice que interfaces configurar cuando
inicia el sistema. Varias líneas {\bf iface} una por cada dispositivo de red,
además de una especial (lo), que es importante tener.

En las líneas {\bf iface} podemos configurar si la interfaz se
configura manualmente (static) o dinámicamente (dhcp). Si ponemos
static deberemos especificar dirección (address), máscara de
red (netmask) y gateway. Por ejemplo:

\begin{small}
\begin{verbatim}
auto lo eth0

iface lo inet loopback

iface eth0 inet static
          address 192.168.200.32
          netmask 255.255.255.0
          gateway 192.168.200.1

iface eth1 inet dhcp
\end{verbatim}
\end{small}

Una vez editado el archivo, utilizaremos el comando {\bf ifup interfaz}
para levantar la configuración de una determinada interfaz, e {\bf
ifdown interfaz} para bajarla.

Es importante recordar que si configuramos nuestra red static deberemos editar
el archivo {\bf /etc/resolv.conf} para ingresar los DNS, como se explicó
anteriormente.

\subsection{Sonido}

Configurar la placa de sonido, suele ser bastante sencillo.  Será
necesario, al igual que con la placa de red, cargar el módulo correcto, con
las opciones necesarias.

Algunos ejemplos de módulos a utilizar:

\begin{description}
\item[modprobe trident] es el módulo para las placas de sonido
SiS701x y para las placas de sonido Trident.

\item[modprobe cmpci] es el módulo que se utiliza para muchas placas
C Media.

\item[modprobe sb io=0x220 irq=5 dma=1 dma16=5] será la línea que
se deberá utilizar para configurar una Sound Blaster 16 ISA, con
algunas de las opciones comunes.
\end{description}

Una vez que hayamos probado que la placa está funcionando correctamente,
tendremos que agregar el módulo a {\bf /etc/modules} para que pueda
utilizarse cada vez que se inicia la computadora \\

Una posibilidad para probar si la placa de sonido está funcionando o no,
es el comando de consola {\bf play}, que viene dentro del paquete {\bf sox}.
Podremos usar {\bf play /usr/share/sounds/*.wav} para verificar el
funcionamiento del sonido.

La placa de sonido en Debian GNU/Linux sólo la pueden usar aquellos usuarios
que pertenezcan al grupo {\it audio}. Para agregar a un usuario a ese grupo,
utilizamos: {\bf adduser usuario audio}.

\subsection{Video}

La forma mas común de usar la placa de video en modo gráfico es usando el
Xfree86, y para poder utilizarlo no hace falta cargar módulos de kernel.
Es necesario, sin embargo, configurar en XFree86 una serie de parámetros que
serán utilizados por la placa de video.\\

Veremos cómo configurar un Xfree86 4.x.x y luego veremos las diferencias
para versiones anteriores.

\subsubsection{XFree86 4.x.x}

El archivo de configuración que vamos a editar es \verb!/etc/X11/XF86Config-4!.
Dado que es un archivo bastante largo y con muchas posibilidades distintas,
está divido en secciones que permiten configurar el entorno, el mouse, el
teclado, el monitor, la placa de video, la resolución, etc.
Además tiene una sección que indica cómo combinar las anteriores (layout).

Si se arman varias resoluciones distintas, una vez que estemos utilizando
el X podremos cambiar entre ellas con CtrlAlt+ y CtrlAlt-.
Si queremos cerrar el X por la fuerza, podemos utilizar Ctrl-Alt-Backspace.

Veremos ahora las secciones que son relevantes a la configuración del video.

\begin{small}
\begin{verbatim}
Section "Device"
    Identifier  "Primary Card"
    BoardName   "NVIDIA Riva TNT2 (generic)"
    Driver      "nv"
    VideoRam    32768
EndSection
\end{verbatim}
\end{small}

En la sección {\bf Device} se configura la placa de video. La línea
más significativa es {\bf Driver}, es la que indica qué controlador
usar para esta placa. Con {\bf Identifier} le damos un nombre,
con el cual haremos referencia a esta placa más adelante.
La linea {\bf BoardName} es solo descriptiva. Por último, la línea
{\bf VideoRam} es opcional, aunque puede ser necesario para ciertas
placas no muy bien soportadas.

Para obtener una lista de placas soportadas podemos usar {\bf discover}, buscarlo
en la web o revisar en los archivos que nos instaló el paquete. Generalmente
hay un archivo que contiene la lista de placas compatibles con cada driver.

En Debian GNU/Linux tenemos páginas de {\bf man} para cada uno de los
controladores de placas de video.
Además, podemos utilizar \verb!dpkg -L xserver-xfree86! para ver una
lista de los archivos que son de ese paquete.

\begin{small}
\begin{verbatim}
Section "Monitor"
    Identifier  "My Monitor"
    HorizSync   30 - 55
    VertRefresh 50-120
EndSection
\end{verbatim}
\end{small}

Una vez especificada la placa de video, debemos asegurarnos que la sección
{\bf Monitor} esté bien configurada. Para eso debemos ponerle el rango de
frecuencias horizontales y verticales. Puede ser necesario que consultemos el
manual del monitor para obtener estos valores.

Por otro lado, muchos de los monitores modernos pueden informarle a la placa de
video estos datos sin nuestra intervención. En ese caso, es necesario agregar
\verb!Load "ddc"!, a la sección {\bf Module}.

Además, si en lugar de editar el archivo de configuración directamente,
utilizamos algún programa para configurar el XFree86, probablemente
contaremos con una base de datos con los valores necesarios para
gran cantidad de monitores.

\begin{small}
\begin{verbatim}
Section "Screen"
    Identifier  "Screen 1"
    Device      "Primary Card"
    Monitor     "My Monitor"
    DefaultDepth 16
    Subsection "Display"
        Depth       8
        Modes       "640x480" "800x600" "1024x768"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "1024x768" "640x480" "800x600"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "640x480"
        ViewPort    0 0
    EndSubsection
EndSection
\end{verbatim}
\end{small}

La sección {\bf Screen} relaciona la configuración de la placa de video
con la del monitor, configura la cantidad de colores estándar
(normalmente no se puede cambiar una vez iniciado el X) y las resoluciones a usar.

Esta configuración está pensada para que sea sencillo configurar varios
monitores y placas de video, tener múltiples monitores por usuario o manejar
distintas consolas gráficas.

\subsubsection{Xfree86 3.x.x}

Si en lugar de utilizar la versión 4 de XFree86, utilizamos una versión
3.x.x, debemos tener en cuenta que el comando que se ejecutará (xserver)
será distinto según la placa de video que utilicemos.

En Debian GNU/Linux (y también en otras distribuciones) existen varios
paquetes distintos, llamados xserver-* (xserver-svga, xserver-ati, etc) que
son los comandos correspondientes a cada placa.  Mientras que xserver-xfree86
es el xserver de Xfree86 4.x.x.

Además, cuando utilizamos la versión 3 de XFree86, el archivo de
configuración será {\bf /etc/X11/XF86Config}.

La sintaxis de este archivo es levemente distinta. Para la misma
configuración que vimos anteriormente tendremos:

\begin{small}
\begin{verbatim}
Section "Monitor"
   Identifier      "Primary Monitor"
   HorizSync       31.5-48.5
   VertRefresh     55-90
EndSection
\end{verbatim}
\end{small}

Es decir, en la configuración del monitor casi no hay diferencias con
respecto a la configuración anterior.  Las diferencias principales estarán
en las otras dos secciones.

\begin{tiny}
\begin{verbatim}
Section "Device"
   Identifier      "Primary Card"
   VendorName      "Unknown"
   BoardName       "NVIDIA Riva TNT2 (generic)"
EndSection

Section "Screen"
   Driver          "Accel"
   Device          "Primary Card"
   Monitor         "Primary Monitor"
   DefaultColorDepth 16
   SubSection "Display"
      Depth        16
      Modes        "1024x768"
   EndSubSection
   SubSection "Display"
      Depth        24
      Modes        "1024x768"
   EndSubSection
EndSection

Section "Screen"
   Driver          "SVGA"
   Device          "Primary Card"
   Monitor         "Primary Monitor"
   DefaultColorDepth 16
   SubSection "Display"
      Depth        16
      Modes        "1024x768"
   EndSubSection
   SubSection "Display"
      Depth        24
      Modes        "1024x768"
   EndSubSection
EndSection

Section "Screen"
   Driver          "VGA16"
   Device          "Primary Card"
   Monitor         "Primary Monitor"
   SubSection "Display"
      Depth        4
      Modes        "1024x768"
   EndSubSection
EndSection

Section "Screen"
   Driver          "VGA2"
   Device          "Primary Card"
   Monitor         "Primary Monitor"
   SubSection "Display"
      Depth        1
      Modes        "1024x768"
   EndSubSection
EndSection

\end{verbatim}
\end{tiny}

Como vemos en este último tramo del archivo, en la sección {\bf Device}
no se especifica el Driver a utilizar, sino que se especifica en la sección
{\bf Screen}.  Los drivers con los que contemos para configurar nuestra placa
de video, dependerán del xserver que estemos utilizando.  Por ejemplo, los
que están aquí listados (Accel, SVGA, VGA16 y VGA2) son los drivers que nos
permite utilizar xserver-svga.

\subsubsection{Aplicaciones de Configuración}

El XFree86 nos provee de una herramienta gráfica para poder escribir en el
archivo de configuración, llamada {\bf xf86config}. \\

En Debian GNU/Linux podemos utilizar una herramienta del sistema para
configurar el XFree86, sin tener que editar el archivo de texto.
Accedemos a esta herramienta utilizando 
\verb!dpkg-reconfigure xserver-xfree86!
(o xserver-svga, o xserver-ati, o el xserver que estemos
utilizando).

\subsubsection{Mouse}

Para configurar el soporte de mouse para X, utilizamos una sección dentro
de \verb!XF86Config! o \verb!XF86Config-4!:

\begin{small}
\begin{verbatim}
Section "InputDevice"
    Identifier  "Mouse1"
    Driver       "mouse"
    Option      "Protocol"    "IntelliMouse"
    Option      "Device"      "/dev/mouse"
    Option      "Buttons"    "3"
    Option      "ZAxisMapping" "4 5"
EndSection
\end{verbatim}
\end{small}
Aquí le decimos que utilice el dispositivo {\bf /dev/mouse}, se puede
utilizar cualquiera de los dispositivos que se explicaron
anteriormente, incluyendo {\bf /dev/gpmdata}.
Además, se está utilizando el driver de {\it IntelliMouse}.  La
indicación de que los botones son 3 permite que el tercer botón sea
emulado apretando los dos botones a la vez, si el mouse no tiene más
que dos botones.
Por último, se habilita la ruedita (ZAxisMapping 4 5).

Para que esto funciones, deberemos asegurarnos que el dispositivo
{\bf /dev/mouse} existe (generalmente es un symlink al dispositivo real).

El soporte de mouse en X es muy amplio,
para más información se puede consultar el archivo README.mouse
en la distribución de Xfree86 (viene con los  paquetes de xserver también). \\

\section{Instalación de Software}

El software libre se distribuye en muchas formas y formatos distintos. Por
ejemplo, el conocido navegador de internet Mozilla lo podemos
encontrar en formato binario para Windows, MacOs y GNU/Linux; también
lo podemos encontrar empaquetado para diversas distribuciones de
GNU/Linux como RedHat, Mandrake, Debian, Slackware, etc; así como
también podemos obtener el código fuente del navegador y compilarlo
en la plataforma que tengamos.

A continuación daremos un repaso general en cuanto a cómo manejar
cada uno de estos distintos formatos.

\subsection{Formatos de compresión}

Uno de los formatos de compresión más usuales en el mundo del
software libre, es {\bf .tar.gz} o {\bf .tgz}. Este formato es, en
realidad, la combinación de dos formatos.

El formato {\bf .tar} agrupa varios archivos en uno solo, de tal manera que se
pueden conservar los datos extendidos de los archivos (permisos, dueño, grupo,
fechas).  Originalmente, fue pensado para grabar los archivos sin
compresión, en una cinta de backup.

El formato {\bf .gz} es el que se encarga de la compresión.  El
algoritmo de compresión es muy similar al del {\bf .zip}.

Además del {\bf .tar.gz} existe el {\bf .tar.bz2} que se diferencia en
que el formato de compresión es el del {\bf bzip2}. \\

Para descomprimir estos formatos podemos utilizar dos formas alternativas:

\begin{itemize}
\item \verb!gunzip -c archivo.tar.gz | tar x!
\item \verb!tar xzf archivo.tar.gz!
\end{itemize}

De la misma manera, para crear un archivo comprimido, podemos elegir de varias
formas alternativas:

\begin{itemize}
\item \verb!tar cf - comprimir* | gzip -c - > archivo.tar.gz!
\item \verb!tar cf archivo.tar comprimir* ; gzip archivo.tar!
\item \verb!tar czf archivo.tar.gz comprimir*!
\end{itemize}

Así vemos como el comando {\bf tar} nos da la posibilidad de utilizar
los comandos {\bf gzip} y {\bf gunzip} directamente desde sus opciones.  De la
misma manera, podemos utilizar los comandos de {\bf bzip2} y {\bf bunzip2} con
la opción {\bf j}. \\

El conocido formato {\bf .zip}, puede utilizarse con los comandos {\bf zip} y
{\bf unzip}.  Los archivos generados con este formato serán
compatibles con los generados con otras plataformas (Ej: WinZip).

\subsection{Desde el principio: utilización de código fuente}

Si un determinado programa tiene una licencia de software libre, significa que
de alguna manera podremos llegar a obtener el código fuente de ese
programa.

Normalmente el código fuente se encuentra comprimido en el formato
{\bf .tar.gz}. Una vez que hayamos descomprimido los archivos,
deberemos ejecutar la acción que corresponda según el lenguaje en el
que esté desarrollada la aplicación. \\

La mayor parte del software libre está desarrollada en lenguaje C, y
pensada para ser compilada con el {\bf gcc} (GNU C Compiler).

El software que sigue
los lineamientos de empaquetado de GNU, tendrá un comando {\bf
configure} que detectará una gran variedad de datos acerca de nuestro
sistema (el procesador, el sistema operativo, el compilador C, las
bibliotecas necesarias para compilar, y todos los recursos necesarios
para compilar el código fuente en cuestión). En el caso en que falte
un determinado recurso (bibliotecas, programas, etc), nos avisará que
deberemos obtenerlo.

Una vez que todos los recursos han sido detectados correctamente, será
necesario ejecutar el comando {\bf make}, que compila el código
fuente, y luego el comando {\bf make install} que instala el programa
en nuestro sistema, dejándolo listo para usar. \\

Para el caso de los programas que no usen {\bf configure} y {\bf make}
será necesario leer la documentación que acompañe al código fuente
para saber cómo realizar la compilación.

Una de las excepciones comunes a los lineamientos de empaquetado de GNU
es el kernel (Linux), que incluye un menú de configuración propio,
y los pasos de instalación son distintos.
Veremos cómo realizar la compilación y la instalación más adelante
en este curso.

\subsection{Ganando tiempo: utilización de código binario}

Si bien todo programa que sea software libre nos da la posibilidad de que lo
compilemos nosotros mismos, esto requiere mucho tiempo, y normalmente no hay
ganancia en el rendimiento que tiene la aplicación.  De manera que
muchas veces podemos elegir utilizar el código binario que ya ha sido
compilado por otras personas, para la plataforma que estemos
utilizando. \\

La gran mayoría de los programas, se distribuyen también en forma
binaria, compilada por el mismo desarrollador.  Y normalmente este
código binario se encontrará en formato .tar.gz, al igual que el
código fuente. O incluso en archivos ejecutables que pueden
instalarse directamente.

Por lo general alcanza con descomprimir el archivo y luego agregar el directorio
correspondiente a la variable PATH, o bien ejecutarlo directamente desde el
directorio. \\

Tanto la instalación desde el código fuente como la instalación a
partir del código binario permiten que un usuario instale una
aplicación en su directorio personal sin tener que pedirle permiso al
administrador del sistema.

Cuando la instalación es realizada por el administrador del sistema,
es recomendable colocar los programas en la ruta {\bf /usr/local}, o
bien {\bf /opt}.  De forma que todos los usuarios del sistema puedan
acceder a estos programas.

\subsection{Manejo de paquetes}

Llamamos {\it paquete} al conjunto formado por el código binario de
una aplicación, los scripts necesarios para configurar, instalar y
desinstalar esta aplicación, los datos
acerca de que otros programas y bibliotecas que son necesarios
para su correcto funcionamiento (dependencias) y algunos otros datos
adicionales relacionados con la aplicación en cuestión. \\

Existen varios formatos de paquetes, los de Red Hat y derivados (rpm), los de
Debian (deb), los de Slackware (tgz). Para manejar estos paquetes,
cada distribución tiene su conjunto de
herramientas, que permiten instalarlos, des-instalarlos, actualizarlos,
etc.

\subsubsection{Paquetes rpm}

En el caso de los paquetes rpm, la herramienta para manejarlos se llama
también {\bf rpm} y para instalar un paquete debemos primero obtenerlo
(por ejemplo, de Internet) y luego ejecutar \verb!rpm -i paquete.rpm!.

Para actualizar un paquete que ya está instalado en el sistema,
utilizamos el comando \verb!rpm -iU paquete.rpm! (en el caso en que el
paquete no estuviera instalado, el funcionamiento será el mismo que
-i).

Para desinstalar un paquete ya instalado, utilizaremos el comando:

\verb!rpm -e nombre-paquete!

Varias distribuciones aparte de Red Hat (Mandrake, Suse, Conectiva, etc)
utilizan paquetes rpm, sin embargo no es recomendable utilizar en una
distribución un paquete pensado para otra distribución -incluso
distintas versiones de una misma distribución- pues la resolución de
las dependencias suele ser muy distinta y puede dar lugar a problemas
variados. \\

Para obtener paquetes rpm en internet, el sitio más utilizado es: 

\verb!http://www.rpmfind.net!

En este sitio se pueden buscar el archivo rpm para el paquete y la
distribución deseada.

Existe un sistema llamado up2date que nos permite bajar las
actualizaciones de los paquetes de Red Hat, esta aplicación utiliza una
base centralizada en los servidores de Red Hat, aunque ofrece un número
limitado de conexiones anónimas (gratuitas).

Es de esperar que aplicaciones similares existan, o bien se estén
desarrollando, para otras distribuciones de paquetes rpm.

\subsubsection{Paquetes deb}

En el caso de los paquetes deb, contamos con dos herramientas para instalar,
desinstalar y configurar los paquetes: {\bf apt} y {\bf dpkg}.

El {\bf dpkg} es un manejador de paquetes muy parecido al {\bf rpm} (tiene
opciones para instalar, actualizar, desinstalar, etc).  Puede ser utilizado
obteniendo los paquetes y luego escribiendo: \verb!dpkg -i paquete.deb!
para instalar o actualizar, \verb!dpkg -r nombre-paquete! para
desinstalar.

Sin embargo, la herramienta más utilizada (por su sencillez de uso)
es {\bf apt}.  Con esta
aplicación podemos buscar paquetes por su nombre o por su
descripción, utilizando el comando {\bf apt-cache search patrón} y
luego instalar los paquetes obteniéndolos directamente de Internet o
de un cd-rom, cumpliendo con todas las dependencias que sean
necesarias, con:

\verb!apt-get install nombre-paquete!

Para esto será necesario configurar un archivo /etc/apt/sources.list,
donde se encuentran los datos que necesita el programa para saber de
dónde obtener los paquetes.  Este archivo puede escribirse en forma
manual, o a través de la herramienta \verb!apt-setup!. Un ejemplo de
algunas líneas del archivo sources.list, serían:

\begin{small}
\begin{verbatim}
deb http://http.us.debian.org/debian sarge main contrib non-free
deb http://non-us.debian.org/debian-non-US sarge/non-US main contrib non-free

deb cdrom:[Debian GNU/Linux 2.2 r0 _Potato_ - Official i386 Binary-1
(20000814)]/ unstable contrib main non-US/contrib non-US/main
\end{verbatim}
\end{small}

Una vez que se ha configurado correctamente este archivo, será
necesario ejecutar {\bf apt-get update} para tener un listado
actualizado de los paquetes disponibles.

En el caso en que se utilizan paquetes de internet, es recomendable
actualizar este listado periódicamente.

Con la lista de paquetes actualizada podemos pedirle a sistema que actualice
todos los paquetes que tenemos instalados a la última versión con
{\bf apt-get upgrade} o {\bf apt-get dist-upgrade }, la diferencia es
sutil: si alguno de los paquetes que queremos actualizar necesita de
otro que no tenemos instalado el upgrade no lo actualizará, en cambio
el dist-upgrade instalará el nuevo paquete y actualizará el que ya
estaba instalado. \\

Recientemente, se ha incorporado una herramienta similar a apt para
Red Hat, llamada apt-rpm.

\subsubsection{Paquetes Slackware}

Los paquetes Slackware utilizan la extensión {\bf .tgz}, pero están
pensados para ser utilizados con las herramientas propias de Slackware
para su instalación, actualización y desinstalación.

Las herramientas utilizadas son {\bf pkgtool}, una aplicación que
permite seleccionar los paquetes a instalar o desinstalar, desde un
menú amigable.  Y, por otro lado, {\bf installpkg} para instalar los
paquetes, {\bf upgradepkg} para actualizarlos y {\bf removepkg} para
des-instalarlos.

Un buscador de paquetes Slackware puede encontrarse en el sitio:

\verb!http://www.slackware.com/packages/!

\subsection{Otros paquetes}

Además de los paquetes binarios, también existen paquetes de código
fuente. Y normalmente son un paso intermedio para hacer un paquete
binario desde los fuentes, en estos paquetes suele estar separado el
código fuente del autor, las modificaciones hechas por el responsable
del mantenimiento del paquete, los scripts a usar en la instalación y
desinstalación y los datos del paquete (descripción, etc).


\section{Administración Básica del sistema}

Administrar un sistema UNIX incluye muchos aspectos diferentes.  Desde la
instalación, hasta el manejo de seguridad que se va a utilizar.  En esta
sección, sin embargo, nos enfocaremos en los temas que son imprescindibles
saber para cualquier administrador UNIX.

\subsection{Usuarios y grupos}

El manejo de usuarios en UNIX se centraliza en el archivo {\bf
/etc/passwd}. Este archivo contiene: el nombre del usuario, su clave,
su número de usuario, su número de grupo principal,
alguna información adicional sobre el  usuario,
el directorio home del usuario y el shell que debe utilizar cuando se inicia
el sistema. Todos estos datos están separados por \verb!:!.

Por razones de seguridad, lo más usual es que la clave del usuario no se
encuentre en este archivo, sino que esté almacenada dentro de {\bf
/etc/shadow}.  En este archivo se encuentra la clave encriptada, y
contiene, además, información de cuándo
se vence la clave, cuando se actualizó por última vez,
cada cuánto tiempo se le va a pedir
al usuario que cambie su clave, etc.

Los permisos del archivo {\bf /etc/shadow} están dados de tal forma que
solamente lo puede leer o modificar el superusuario, con esto, nos
aseguramos que ningún usuario pueda tener acceso a la clave de otro
usuario, ni siquiera en formato encriptado.  \\

En Debian GNU/Linux, este archivo pertenece al grupo {\it shadow}, de tal forma que
los usuarios que pertenezcan a este grupo pueden leer el contenido del
archivo.  Está pensado para que el administrador admita en este grupo
solamente a los usuarios que se vayan a encargar de determinada
administración relacionada con usuarios.


\subsubsection{Permisos Especiales}

Los archivos {\bf /etc/passwd} y {\bf /etc/shadow}
pueden ser modificados solamente por el superusuario.
Sin embargo, cualquier usuario puede cambiar su contraseña
mediante el comando {\bf passwd}, que debe escribir dentro de estos
archivos. Esto se debe a que este comando utiliza un permiso especial.

Si miramos los permisos de este comando ({\bf ls -l `which passwd`}),
veremos que tiene una {\bf s} en el lugar de ejecución del dueño.
Este permiso se llama {\bf setuid}.  Cuando la aplicación (en este caso el
comando {\bf passwd}) se esté ejecutando, tendrá los mismos permisos
que el dueño del programa.

Es decir que cuando cualquier usuario quiere cambiar su clave accede a
ciertos archivos con los mismos permisos que si fuera el superusuario.  Este
permiso especial es un arma de doble filo, y hay que usarlo con mucha
moderación.  Es importante tener conciencia de cuáles son los comandos que
tienen este permiso, y saber que estos comandos no tengan fallas de
seguridad. \\

También existen permisos similares para el grupo y para el resto de los
usuarios, y se llaman {\bf setgid} y {\bf sticky bit}.

El setgid tiene el mismo sentido que el setuid, pero se utiliza con
grupos, es decir, le permite a un usuario tener los mismos permisos que el
grupo al que pertenece el comando, aún cuando el usuario no pertenezca.

El {\bf sticky bit} ya no se usa. Originalmente se utilizaba para indicarle al
kernel que tenía que mantener el programa en memoria aún después de
haberlo ejecutado, se usaba para programas que se ejecutaran muy seguido.

El {\bf setgid} en directorios sirve
para que todos los directorios que se creen a partir de ese pertenezcan al
mismo grupo.  \\

Para asignar estos permisos usamos {\bf chmod u+s,g+s,o+t
archivo} o con la otra sintaxis {\bf chmod 4755 /usr/bin/passwd}
(deja el comando passwd con los permisos correctos).

\subsubsection{Técnicas para la administración de usuarios}

Existen muchas formas distintas de administrar los usuarios de un sistema,
aquí sólo hablaremos de algunas de ellas. \\

Para agregar un usuario, podemos simplemente agregar una línea de texto
con el formato que explicamos anteriormente,
al archivo {\bf /etc/passwd}.  Si estamos utilizando {\bf /etc/shadow} para
guardar las claves encriptadas, es un poco mas difícil, pero podemos
copiar una línea de otro usuario y cambiar solamente el nombre de usuario.
Esto nos dejaría el usuario nuevo con la contraseña del anterior, para
actualizar este valor utilizamos con el comando {\bf passwd}.

Hay que tener en cuenta que el comando {\bf passwd} le permite al
administrador cambiar la contraseña de cualquier
usuario, con la sintaxis {\bf passwd usuario}. \\

El manejo de grupos está centralizado en el archivo {\bf /etc/group},
que contiene: nombre de grupo, clave (normalmente ninguna), número
de grupo, usuarios.

Dentro de este archivo se configuran los grupos adicionales al principal a los
que puede pertenecer un usuario (recordar que el principal está definido
en /etc/passwd. También existe un {\bf /etc/gshadow}, para guardar las claves
encriptadas, pero normalmente no es utilizado. \\

Para ayudar al administrador suelen existir herramientas como {\bf
useradd}, {\bf userdel}, {\bf usermod}, {\bf groupadd}, {\bf groupdel},
{\bf groupmod}. Estas herramientas permiten agregar, modificar y eliminar la
información de los archivos que acabamos de comentar.  Reciben por parámetro
los datos que sean necesarios, para luego actualizar los archivos como
corresponda.

Dado que la implementación de estos comandos varía entre las distintas
distribuciones, será necesario utilizar el manual de los comandos para
poder conocer el formato en que reciben los parámetros. \\

En Debian GNU/Linux existen los comandos {\bf adduser}, {\bf deluser} y
{\bf addgroup}. Que nos permiten hacer estas tareas sin recordar
demasiadas opciones. Si queremos crear un usuario usaremos: {\bf adduser
usuario} y nos preguntará línea por línea los datos necesarios para agregar
el usuario al sistema (clave e información adicional),
luego creará el directorio home del usuario y le copiará los archivos que se
encuentran dentro de {\bf /etc/skel} al directorio home recién creado.

Si queremos agregar un grupo usamos {\bf addgroup
grupo}, y si queremos agregar un usuario a un grupo usamos {\bf adduser
user group}. Para eliminar un usuario del sistema usamos {\bf deluser
usuario}. En este último caso, hay que notar que el directorio del
usuario no es borrado cuando se borra el usuario. \\

Un usuario conectado al sistema puede convertirse en super usuario, o en
cualquier otro usuario utilizando el comando {\bf su}. Si
ejecutamos {\bf su} sin ninguna opción nos pedirá la clave del superusuario,
para poder tener sus permisos. También podemos usar {\bf su usuario} y
nos pedirá la contraseña de ese usuario para convertirnos en él.

Ésta suele ser la manera correcta de usar el usuario administrador.
Es decir, ingresar al sistema con un usuario normal y cuando haya que
configurar o manipular algo del sistema, ejecutar el comando su.

Existe una opción muy usada para este comando: \verb!su - usuario!,
que le indica al {\bf su} que, no solo asuma la identidad del usuario, sino
que también ejecute los scripts de inicio del usuario en quien nos estamos
convirtiendo ({\bf .profile}, {\bf .bash\_profile}, {\bf .bashrc}, etc).

\subsection{Manejo de sistemas de archivos}

El manejo de los diversos sistemas de archivos (file systems) que deben
montarse al inicio, o que pueden montarse más adelante, se configura en el
archivo {\bf /etc/fstab}. Este archivo contiene: nombre del dispositivo,
directorio donde montarlo, tipo de sistema de archivos, opciones,
configuración de backup, configuración de verificación al inicio.

Los primeros cuatro parámetros son manejados por
el comando {\bf mount}, el quinto por el comando {\bf dump} y el sexto por
{\bf fsck}.

\begin{description}
\item[Dispositivo a montar] es normalmente un archivo que se encuentra
dentro del directorio {\bf /dev}, pero puede ser cualquier cosa,
representación del estado del kernel (como proc), conexiones de red,
imágenes ISO, etc.

\item[Directorio] donde montarlo, es el directorio, dentro del árbol
general del sistema, donde se va a montar ese sistema de archivos.

\item[Tipo] de sistema de archivos, es el formato que tiene el dispositivo.
Algunos de los formatos soportados son:
adfs, affs, autofs, coda, coherent, cramfs,
devpts, efs, ext, ext2, ext3, hfs, hpfs, iso9660, jfs, minix, msdos,
ncpfs, nfs, ntfs, proc, qnx4, reiserfs, romfs, smbfs, sysv, tmpfs, udf,
ufs, umsdos, vfat, xenix, xfs, xiafs. Para obtener el listado completo de los
formatos disponibles en el sistema, se debe consultar el manual del comando
{\bf mount}

Los formatos más usados son: {\it ext2} (típico en GNU/Linux),
{\it vfat} (fat con nombres largos, usado en windows),
{\it msdos} (normal de DOS) y {\it ext3}, {\it reiserfs}, {\it xfs}, {\it jfs}
(sistemas de archivos con journalling, es decir, que siempre se encuentran
en un estado consistente).

\item[Opciones] son muy numerosas, y es recomendable consultar el manual
del comando {\bf mount} para obtener la referencia completa. Se las escribe
separadas por comas sin espacios.

Cabe destacar la opción {\bf user} que permite que
cualquier usuario pueda montar o desmontar ese sistema de archivos. Y la
opción {\bf async}, que le indica al kernel que ese sistema de archivos se
puede actualizar asincrónicamente (mediante un buffer).

\item[Backup] se utiliza para especificar que sistemas de archivos debe
backupear el sistema. Si la opción está en 0 no se realizará el backup.
El comando {\bf dump}, es el que se activa en caso contrario.

\item[Verificación] le indica al
sistema que verifique ese sistema de archivos al inicio, utilizando el
comando {\bf fsck}.  Aún si está en 0, si el sistema de archivos es de
tipo {\bf ext2}, será necesario realizar la verificación cuando
no haya sido desmontado correctamente.  Los números mayores a 0 le dicen al
sistema el orden en que debe realizarse esta verificación.
\end{description}


\section{Inicio del sistema}

Este es un pequeño recorrido por el inicio del sistema, desde que arranca
el bootloader, hasta que es posible iniciar una sesión de usuario
en el sistema.

\subsection{Bootloader}

El bootloader es el programa que se sitúa en el sector de arranque (boot)
de un disco. Es el que recibe la orden del BIOS de iniciar el sistema. Es
también el encargado de ejecutar el sistema operativo que nosotros queremos
usar.

En GNU/Linux los bootloaders más comunes son el {\bf LILO} y el {\bf GRUB}.
Ambos son muy configurables, y permiten arrancar el sistema desde las más extrañas
configuraciones. El caso de grub va un poco mas allá, ya que nos permite
cargar el sistema desde la red, un puerto serial, etc. Además, nos puede dar
una línea de comandos, de forma que podamos decirle exactamente qué hacer. \\

A continuación, un ejemplo de configuración típica de LILO, del archivo
{\bf /etc/lilo.conf}.

\begin{small}
\begin{verbatim}
lba32
boot=/dev/hda
root=/dev/hda2
install=/boot/boot.b
map=/boot/map
delay=20
vga=normal
default=Linux

image=/vmlinuz
      initrd=/initrd.img
      label=Linux
      read-only

image=/vmlinuz.old
      initrd=/initrd.img.old
      label=LinuxOLD
      read-only
      optional

other=/dev/hda1
       label=Windoze
       restricted
\end{verbatim}
\end{small}

En primer lugar, el significado de las primeras líneas del archivo:

\begin{itemize}
\item La línea {\bf lba32} es necesaria si usamos rígidos IDE LBA.

\item La opción {\bf boot} indica dónde se va a instalar el sector de booteo.

\item La opción {\bf root} es el filesystem que vamos a usar como /, es decir,
como directorio  raíz.

\item {\bf delay} es el tiempo que va a esperar al usuario, para que ingrese algún
valor distinto del default.  Pasado ese tiempo, se iniciará el sistema operativo
indicado como default.

\item Con la opción {\bf vga}, podemos decir que modo de video usar. Es decir
que, el lilo puede iniciar el sistema en modo gráfico
(siempre que tenga soporte de nuestra placa de video ).

\item La opción {\bf default} le dice cuál es la configuración que va a usar por
omisión, es decir, la que se ejecutará si no apretamos nada cuando está iniciando,
y la que aparecerá seleccionada al cargarse el Lilo.
\end{itemize}

Cada bloque {\bf image=} y {\bf other=} definen una forma de arranque. Cada
una de estas debe tener un {\bf label} (etiqueta), que será la forma de identificarlos,
tanto dentro de la configuración del Lilo, como para el usuario en el momento de
elegir qué sistema ejecutar.

Las líneas de {\bf image} indican cuál es el kernel que debe utilizarse,
y de ser necesario también debe especificarse un initrd.

La líneas {\bf other} definen otros sistemas operativos.
Normalmente, este tipo de configuración es utilizada por los sistemas que no están
pensados para que se les pueda cambiar el kernel fácilmente. \\

Una configuración típica dentro de grub seria:

\begin{small}
\begin{verbatim}
timeout 10
default 0

title GNU amadeus 2.4.19
root (hd0,0)
kernel /boot/vmlinuz-2.4.19 root=/dev/hda1

title GNU amadeus 2.4.19
root (hd0,0)
kernel /boot/vmlinuz-2.4.19 root=/dev/hda1 ro single

title GNU system Debian (kernel 2.4.18-686)
root (hd0,0)
kernel /boot/vmlinuz-2.4.18-686 root=/dev/hda1
initrd /boot/initrd.img-2.4.18-686

title GNU system Debian - single-user (kernel 2.4.18-686)
root (hd0,0)
kernel /boot/vmlinuz-2.4.18-686 root=/dev/hda1 ro single
initrd /boot/initrd.img-2.4.18-686
\end{verbatim}
\end{small}

Como podemos ver, la especificación del sistema de archivos raíz es
distinta de la de LILO, y de Linux en general.  En {\it (hd0, 0)} hd0
representa el primer disco rígido y 0, la primera partición..

Al arrancar
con grub es posible elegir una de estas opciones, cambiar estas
configuraciones o ir directamente a una línea de comandos en la cual se
puede auto-completar con tab y escribir fácilmente comandos de grub.

Podemos observar en este tipo de configuración, que muchas de las líneas
de configuración de LILO son en realidad parámetros que recibe el
kernel. El sistema de archivos raíz es un parámetro imprescindible.

\subsection{Kernel}

Como muchas veces hemos hecho notar, {\bf Linux} es el nombre del kernel del
sistema operativo que estamos utilizando.  De forma que en esta sección, cada vez
que utilicemos el término {\bf Linux} nos estaremos refiriendo al kernel. \\

El bootloader le pasa el poder a Linux. Y le envía algunos parámetros
imprescindibles, como el sistema de archivos raíz. El kernel puede recibir
muchos otros parámetros, que se utilizan para configurar el soporte de
hardware que está compilado en el kernel, especificar la forma de arranque,
etc. \\

Por ejemplo, existe un parámetro {\bf sb} que permite configurar la
placa de sonido sb, solamente si el soporte está compilado dentro del
kernel (que no es lo mismo que tenerlo en un módulo).

También existe un parámetro {\bf nfsroot} con el cual le podemos
indicar que el sistema de archivos raíz debe ser leído en un determinado
servidor dentro de la red. Este parámetro se utiliza en máquinas que
tienen un disco rígido muy pequeño, o que no tiene disco rígido.

Un parámetro para destacar es {\bf init}. Este es el primer programa
que se ejecuta una vez cargado el kernel, y se ejecuta en {\it modo
usuario}. Normalmente este valor no lo vamos a cambiar.  El comando que se
utiliza por lo común es {\bf /sbin/init}, que realiza muy bien la tarea
para la cual fue pensado.  Pero bajo determinadas situaciones podemos
querer reemplazarlo.

Por ejemplo, si estamos arrancando la máquina, y le pasamos al kernel como
parámetro \verb!init=/bin/bash!, podremos tener acceso directo a una línea
de comandos sin tener que ingresar a la máquina, y con permisos de
superusuario.

Esto es, por supuesto, algo que un administrador de sistema
puede querer evitar, porque implica que una persona con acceso físico a la
computadora podría montar el sistema de archivos y tener control total de
la computadora.  Para evitarlo, será necesario editar la configuración
del bootloader para que no permita hacer esto.\\

Para más información revisar {\bf Documentation/kernel-parameters.txt} dentro de
los fuentes del kernel o \verb!man bootparam!.

\subsection{init}

Una vez que se ha cargado en memoria, el kernel ejecuta su primer programa
{\bf init}. Esta aplicación va a ser el {\it padre} de todos los procesos del sistema.

El comando {\bf /sbin/init} utiliza la configuración que se encuentra en el archivo
{\bf /etc/inittab}, primero en búsqueda de {\bf initdefault},
que le indica cuál es el {\it runlevel} en el que debe entrar. \\

Un {\bf runlevel} es una configuración que permite iniciar cierto grupo de
programas. Es decir, permite armar un grupo de programas que se deben
ejecutar uno a continuación del otro, para realizar una tarea en particular.

Típicamente en UNIX existen 7 runlevels diferentes, el 0 halt, 1-5
configurables por el administrador y 6 reboot. En GNU/Linux suele existir,
además, un runlevel S o s, para ser usado en tareas de rescate y los runlevels
7-9 que normalmente no se usan. \\

Si el {\bf /etc/inittab} no existe o no tiene una línea que contenga
el {\it initdefault} configurado, el comando {\bf /sbin/init}
pedirá al usuario el runlevel deseado. También se puede pasar el runlevel
con el cual se quiere iniciar como un parámetro al kernel.

La sintaxis del archivo {\bf /etc/inittab} es bastante simple y está
extensamente explicada en el manual {\bf man inittab}. Cada línea contiene
id:runlevels:action:process.

Ejemplo:

\begin{small}
\begin{verbatim}
id:2:initdefault:
si::sysinit:/etc/init.d/rcS
~~:S:wait:/sbin/sulogin
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
z6:6:respawn:/sbin/sulogin
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
\end{verbatim}
\end{small}

\subsection{Scripts de inicio}

Cuando se inicia la máquina, se suelen ejecutar una serie de scripts
básicos del sistema. En Debian GNU/Linux estos scripts son {\bf
/etc/init.d/rcS} y {\bf /etc/init.d/rc}, este último recibe como parámetro
el runlevel con el que debe iniciar.

Estos scripts ejecutan otros scripts, que se encuentran en {\bf /etc/rcS.d} y
{\bf /etc/rc[1-6].d}, respectivamente. Que a su vez son symlinks de scripts que
están en {\bf /etc/init.d/}.

Los symlinks tienen la forma [SK][0-9][0-9]nombre, la S o la K le dice si debe
iniciar o detener ese proceso respectivamente. Esto lo hace ejecutando el
script con el parámetro {\it start} o {\it stop} según corresponda. El
número de 00-99 determina el orden de ejecución.

Los scripts que se encuentran en {\bf /etc/rcS.d} hacen varias comprobaciones y
múltiples cosas para dejar el sistema funcionando. Se considera que hasta este
momento solo está accesible el sistema de archivos raíz y algún script de
{\bf /etc/rcS.d} se encarga de montar los otros sistemas de archivos.

Luego de dejar el sistema mínimamente funcional, los scripts de cada runlevel
iniciarán los servicios que sean necesarios. Como el apache (web server) o el
gdm (logueo al sistema en modo gráfico).

\subsection{Ingreso al sistema}

El archivo {\bf /etc/inittab} define qué y cuántas consolas virtuales tendremos
y qué programa se utilizará para ingresar al sistema. Además, también puede
haber algún programa que se cargue en un script como un demonio (por
ejemplo, el {\bf gdm}).

Algunos otros servicios (como telnet, o ssh)
pueden ofrecer una forma alternativa de ingresar al sistema.

\subsection{Servicios / Daemons}

Entre los servicios que se inician al ejecutarse algún runlevel, existen algunos
que podemos esperar que se encuentren en cualquier sistema UNIX. Como el
{\bf syslog}, el {\bf cron}, {\bf anacron}, {\bf at} y {\bf inetd}.  \\

El {\bf syslog} es el responsable de distribuir los mensajes del sistema en
distintos archivos de log. La configuración se encuentra en {\bf /etc/syslog.conf},
y la mayoría de los logs se almacenan en el directorio {\bf /var/log}.

Un usuario puede mandar mensajes al log del sistema con el comando {\bf logger}. \\

Los servicios {\bf cron}, {\bf anacron} y {\bf at} se encargan de ejecutar tareas en
determinados momentos. Pero cada uno de ellos, lo hace de una manera
distinta.

\begin{description}
\item[cron] se encarga de ejecutar tareas en determinado momento. El
archivo de configuración típico es {\bf /etc/crontab} y su sintaxis es:
minutos hora día-del-mes mes día-de-la-semana usuario comando

Nuevas versiones de {\bf cron} tienen además un directorio {\bf
/etc/cron.d}, que contiene varios archivos con el mismo formato que el
crontab. Esta separación en archivos se utiliza para tener tareas
programadas separadas por grupos.

\item[anacron] ejecuta un comando, sólo si hace una determinada cantidad
de días que no se ejecuta. A diferencia de {\bf cron}, no asume que el
sistema va a estar prendido todos los días las 24 hs.
El archivo de configuración es {\bf /etc/anacrontab} y sintaxis: días retraso
identificador comando.

El directorio {\bf /var/spool/anacron} suele tener archivos con la información
necesaria para utilizar {\bf anacron}.

\item[\bf atd] es el servicio que recibe pedidos desde el
comando {\bf at}. Es una cola de procesos que se ejecutarán en orden
cronológico.

El comando {\bf at} puede ser utilizado por cualquier usuario
(excepto aquellos que se encuentren en el archivo {\bf /etc/at.deny}) y el único
parámetro necesario es la hora en que se debe ejecutar el comando,
el comando a ejecutar se lee por entrada estándar.

Con {\bf atq} se puede revisar la cola de procesos programados y con
{\bf atrm} quitar un proceso de la cola.
\end{description}

Por otro lado, tenemos al {\bf inetd} que es un super-demonio que se encarga de
recibir y derivar servicios de red. Su archivo de configuración es
{\bf /etc/inetd.conf}
y tiene la siguiente sintaxis: nombre-del-servicio tipo-de-conexión protocolo
flags usuario servicio parámetros.

Utilizando el nombre del servicio, se puede encontrar en el archivo
{\bf /etc/services} el un número de puerto correspondiente.
El {\bf inetd} se quedará esperando recibir una conexión con ese
protocolo, en ese puerto, y una vez iniciada la conexión, le
desviará a otro comando esa conexión.


\end{document}
