Preparando LFS para tener un inicio estilo BSD (Slackware)

TÍTULO:		Preparando LFS para tener un inicio estilo BSD (Slackware).
VERSIÓN LFS:	2.4+
AUTOR:		Marc Heerdink <marc@koelkast.net>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
Esta receta expone un modo alternativo de arrancar tu sistema.

RECETA:
ÍNDICE:

1. Prólogo
2. Configurando inittab
3. Creando los guiones de arranque
4. En referencia a rc.local
5. Palabras de sabiduría
6. El final


1. PRÓLOGO

   Desde que LFS usa por defecto los guiones de arranque SYSV, casi todo aquél que
tiene un sistema LFS esa este tipo de inicio. Pero hace unos días leí en las listas de 
correo que alguien quería utilizar el inicio al estilo BSD. Puesto que yo lo uso desde el
principio, he decidido escribir una receta para todo aquél que quiera usar el inicio al 
estilo BSD (o los que quieran probarlo).

   El inicio BSD usa el programa init normal de SYSV, pero con un inittab diferente y 
con los guiones de arranque organizados de otra forma. BSD arranca tu sistema de 
una forma mucho menos complicada, pues los guiones son más fáciles de mantener.
Pienso que uno debería leerse esta receta antes de instalar cualquiera de los dos
estilos de inicio, porque la decisión debería tomarse, preferiblemente, antes del primer
arranque.

   Esta RECETA nunca estará completa, los comentarios pueden enviarse a
marc@koelkast.net. Estoy trabajando en una receta para un modo de inicio mixto que
usé en mi primer sistema LFS (en la actualidad sólo tengo guiones de inicio estilo BSD).


2. CONFIGURANDO INITTAB

   El inittab reside en /etc y configura tu inicio. Antes de que comiences a escribirlo,
debes saber que un inittab erróneo puede provocar (en el peor de los casos) un
pánico del núcleo (kernel panic), pero como mínimo te dará un monto de problemas
al arrancar el sistema. También tendrás que elegir, antes de empezar, qué niveles de
arranque quieres usar. Yo tengo activados los siguientes (este ejemplo es bastante
bueno y lo usaré en el resto de la receta):


  NIVEL DE ARRANQUE:        DESCRIPCIÓN:
              0                               Cierra el sistema
              S                               Modo de usuario único
              1       			        Alias para S
              2                                Nivel multi-usuario en modo texto
              3                                Nivel multi-usuario en modo gráfico
              4                                Alias para 2
              5                                Alias para 2
              6                                Reinicia el sistema

   No recomiendo cambiar el propósito de los niveles de arranque 0, 6 y S porque
deben estar así configurados para muchos programas. Por lo que respetaremos su
función. Debido a que sólo uso 3 modos para el arranque (Usuario único, Multi-usuario 
en modo texto y Multi-usuario en modo gráfico) los niveles de arranque 4 y 5 son alias 
del nivel de arranque 2 (el usado por defecto). Puedes cambiarlos a lo que quieras,
pero recomiendo que lo hagas hasta que termines esta receta.

   ¡Ahora, vamos a hacer negocios! Pon esto en tu /etc/inittab:

-------------------------------/etc/inittab----------------------------------
id:2:initdefault:

si:S:sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc.0
l1:1:wait:/etc/rc.d/rc.1
l2:2:wait:/etc/rc.d/rc.2
l3:3:wait:/etc/rc.d/rc.3
l4:4:wait:/etc/rc.d/rc.4
l5:5:wait:/etc/rc.d/rc.5
l6:6:wait:/etc/rc.d/rc.6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -r now

su:S1:respawn:/sbin/sulogin

c1:2345:respawn:/sbin/agetty tty1 38400 linux
c2:2345:respawn:/sbin/agetty tty2 38400 linux
c3:2345:respawn:/sbin/agetty tty3 38400 linux
c4:2345:respawn:/sbin/agetty tty4 38400 linux
c5:2345:respawn:/sbin/agetty tty5 38400 linux
c6:2345:respawn:/sbin/agetty tty6 38400 linux
----------------------------fin de /etc/inittab------------------------------

   Esta es una bonita configuración básica que debería ser suficiente para todo el
mundo. Como puedes ver, init primero lanza /etc/rc.d/rc.sysinit y entonces carga el
fichero necesario para el nivel de arranque por defecto (/etc/rc.d/rc.2).


3. CREANDO LOS GUIONES DE ARRANQUE

   Vamos a crear primero /etc/rc.d/rc.sysinit:

-----------------------------/etc/rc.d/rc.sysinit----------------------------
#!/bin/sh
echo "Montando el dispositivo raíz en solo lectura..."
/bin/mount -n -o remount,ro /

echo "Inicializando las particiones de intercambio..."
/sbin/swapon -a

/sbin/fsck -A -a -C
if [ $? -gt 1 ]; then
   echo
   echo "ERROR:"
   echo "Tu sistema de ficheros parece seriamente dañado. Posiblemente puedas"
   echo "corregir este problema ejecutando manualmente e2fsck (p.e. con las opciones"
   echo " -v y -y). Después de que te desconectes, el sistema se reiniciará."
   echo
   PS1="(Reparar el sistema de ficheros)# "
   export PS1
   /sbin/sulogin
   /bin/umount -a -r
   /sbin/reboot -f
fi

echo "Remontado el sistema raíz en lectura-escritura..."
/bin/mount -n -v -o remount,rw /

echo "" >/etc/mtab
/bin/mount -f -o remount,rw /

echo "Montando otros sistemas de ficheros locales..."
/bin/mount -a -v -tnonfs

echo "Estableciendo el nombre del sistema..."
/bin/hostname `cat /etc/HOSTNAME |cut -d . -f1`
/bin/domainname `cat /etc/HOSTNAME |cut -d . -f2-`

if [ -f "/tmp/random-seed" ]; then
  echo "Inicializando el generador de números aleatorios..."
  /bin/cat /tmp/random-seed >/dev/urandom
  rm -f /tmp/random-seed
fi

echo "Cargando el mapa del teclado..."
/usr/bin/loadkeys -d

echo "Ajustando la fecha del sistema mediante el reloj del hardware..."
/sbin/hwclock --hctosys --utc

echo "Iniciando los demonios de registro del sistema y del núcleo...."
/usr/sbin/syslogd
/usr/sbin/klogd -c3

echo "Actualizando las dependencias de los módulos..."
/sbin/depmod -a
-------------------------fin de/etc/rc.d/rc.sysinit-------------------------

   Para que las líneas de hostname hagan su trabajo, crea un fichero /etc/HOSTNAME
 que contenga tu fqdn (Nombre de Dominio Cualificado Completo). Osea, por ejemplo,
 foo.bar.com o gimli.gimli.org. La última línea es opcional y sólo es útil si utilizas módulos.
 Una nota final sobre el comando hwclock: si el reloj de tu sistema no está configurado
 para usar UTC (lo que significa que usas la hora local), debes eliminar la opción --utc
 de esa línea. Lee la receta "La hora en LFS" para más información.

   Ahora crearemos el guión para el nivel de arranque de usuario único. Puesto que
 este nivel de arranque no se usa con frecuencia para iniciar el sistema, pero se
 retorna a él si algo le sucede al sistema, todos los programas en ejecución serán
 matados para que tengas en un entorno limpio cuando te encuentres en el modo de
 usuario único.

--------------------------------/etc/rc.d/rc.1-------------------------------
#!/bin/sh
echo "Desmontando los sistemas de ficheros remotos..."
/bin/umount -a -tnfs

# inserta una línea para cada tarjeta de red que uses. Esto es un ejemplo para una
#  configuración de tarjeta de red simple (configurada como eth0):
#
# echo "Desactivando la interfaz de red eth0..."
# /sbin/ifconfig eth0 down

echo "Enviando a todos los procesos la señal TERM..."
/sbin/killall5 -15
sleep 1

echo "Enviando a todos los procesos la señal KILL..."
/sbin/killall5 -9
----------------------------fin de /etc/rc.d/rc.1----------------------------

   Si se ejecuta este guión, ningún demonio debe permanecer activo excepto los del 
   núcleo e init. Una vez terminado se ejecuta sulogin (que es para lo que sirve la línea
 "su:S1:respawn:/sbin/sulogin"  :) de forma que sólo root puede usar el sistema. Todas
 las consolas virtuales son desactivadas.

   Vamos a por el siguiente guión, /etc/rc.d/rc.2. En este fichero se encuentran muchas
 opciones comunes, como la activación de una red de trabajo y la puesta en marcha
 de los demonios de red. Elimina las líneas que no quieras usar, pero no añadas nada
 hasta que hayas leído el capítulo 4.

--------------------------------/etc/rc.d/rc.2-------------------------------
#!/bin/sh
# En este ejemplo se configura la tarjeta de red con 192.168.0.2 como dirección
#  de red y una máscara de red 255.255.255.0. Esta tarjeta de red usa 192.168.0.1
#  como puerta de enlace por defecto. Esta es la configuración que deberías usar si
#  la máquina 192.168.0.1 fuese la puerta de enlace.
# ADVERTENCIA:
#  La opción "window 16384" es opcional pero puede mejorar la velocidad de tu red.
echo "Configurando el entorno de red..."
/sbin/ifconfig eth0 192.168.0.2 broadcast 192.168.0.255 netmask 255.255.255.0
/sbin/route add -net default gw 192.168.0.1 netmask 0.0.0.0 window 16384 metric 1

echo "Montando los sistemas de ficheros remotos..."
/bin/mount -a -v -tnfs

if [ -x /etc/rc.d/rc.local ]; then
  /etc/rc.d/rc.local
fi
----------------------------fin de /etc/rc.d/rc.2----------------------------

   Ahora copia /etc/rc.d/rc.2 a /etc/rc.d/rc.3 y añade lo siguiente al final del fichero:

------------------------------------snip-------------------------------------
echo "Iniciando el gestor gráfico de inicio de sesión..."

if [ -x /opt/kde/bin/kdm ]; then
  /opt/kde/bin/kdm -nodaemon
elif [ -x /usr/bin/gdm ]; then
  /usr/bin/gdm -nodaemon
elif [ -x /usr/X11R6/bin/xdm ]; then
  /usr/X11R6/bin/xdm -nodaemon
else
 echo "Has elegido iniciar el modo de inicio de sesión gráfico, pero ni KDM, GDM"
 echo "o XDM están instalados. Es guión busca estos gestores de pantalla en las"
 echo "siguientes localizaciones"
 echo
 echo "   KDM      /opt/kde/bin/kdm"
 echo "   GDM      /usr/bin/gdm"
 echo "   XDM      /usr/X11R6/bin/xdm"
 echo
 echo "Este mensaje desaparecerá en 10 segundos y, a continuación, serás"
 echo "cambiado al nivel de arranque 2."
 sleep 10
 /sbin/telinit 2
fi
----------------------------fin de /etc/rc.d/rc.3----------------------------

   Este guión es bastante auto-explicativo. Busca los gestores de pantalla más
comúnmente usados en localizaciones habituales. Si no encuentra ninguno, muestra
un aviso y el sistema cambia al nivel de arranque 2 con una pantalla de ingreso de
consola normal.

   Ahora tenemos creados todos los guiones de arranque excepto /etc/rc.d/rc.0 y
 /etc/rc.d/rc.6. Puesto que ambos realizan casi la misma función, lo crearemos sólo
 una vez:

--------------------------------/etc/rc.d/rc.0-------------------------------
#!/bin/sh
echo "Enviando a todos los procesos la señal TERM..."
/sbin/killall5 -15
sleep 1

echo "Enviando a todos los procesos la señal KILL..."
/sbin/killall5 -9
sleep 1

echo "Desactivando las particiones de intercambio..."
/sbin/swapoff -a

echo "Salvando el alimentador aleatorio en un fichero temporal..."
/bin/dd if=/dev/urandom of=/tmp/random-seed count=1 bs=512 2>/dev/null

echo "Salvando la fecha del sistema en el reloj hardware..."
/sbin/hwclock --systohc --utc

echo "Desmontando los sistemas de ficheros remotos..."
/bin/umount -a -f -tnfs

case "$0" in
  *6)
    /sbin/reboot -w
    ;;
  *0)
    /sbin/halt -w
    ;;
esac

echo "Remontando el sistema de ficheros raíz en solo lectura..."
/bin/mount -n -o remount,ro /

echo "Desmontando los sistemas de ficheros locales..."
/bin/umount -a -tnonfs

echo "Sincronizando los almacenadores intermedios de los sistemas de ficheros..."
/bin/sync

case "$0" in
  *6)
    echo "Por favor, espera mientras reinicio..."
    /sbin/reboot -d -f -i
    ;;
  *0)
    echo "Adiós..."
    /sbin/halt -d -f -p
    ;;
esac
----------------------------end of /etc/rc.d/rc.0----------------------------

   Unas notas sobre este fichero: hwclock debería estar configurado como en
 /etc/rc.d/rc.sysinit (sin --utc si tu reloj hardware usa la hora local). La construcción

  case "$0" in
    *6)
      /sbin/reboot -w
      ;;
    *0)
      /sbin/halt -w
      ;;
  esac

 escribe cierta información de estado en /etc/wtmp. Es buena idea hacer esto, pero 
 puedes suprimirlo sin problemas. Sobre los dos tercios del fichero llamo a
 /bin/sync. Este programa  sincroniza los almacenadores intermedios de los sistemas 
 de ficheros para que no pierdas ningún dato. Como la construcción anterior, es 
 opcional pero la recomiendo.

   Ahora tenemos creados todos los ficheros necesarios, para que funcionen falta por
   hacer algunos cambios. Ejecuta los siguientes comandos para hacerlos:

  chmod 755 /etc/rc.d/rc.0 /etc/rc.d/rc.1 /etc/rc.d/rc.2
  chmod 755 /etc/rc.d/rc.3 /etc/rc.d/rc.sysinit
  ln -s /etc/rc.d/rc.2 /etc/rc.d/rc.4
  ln -s /etc/rc.d/rc.2 /etc/rc.d/rc.5
  ln -s /etc/rc.d/rc.0 /etc/rc.d/rc.6

   ¡Ya lo tienes! ¡Respira hondo, teclea (como root) "reboot" y observa cómo tu
 sistema arranca con los guiones de inicio estilo BSD! Si tienes problemas usando 
 estos guiones, mándame unas líneas: marc@koelkast.net.


4. EN REFERENCIA A RC.LOCAL

   Como posiblemente sabes, es común tener un fichero /etc/rc.d/rc.local en donde
 pones los comandos que quieres que se ejecuten al final del proceso de arranque. 
 Puedes usarlo, por ejemplo, para crear ficheros actualizados o para escoger un 
 mensaje del día al azar. Pero puesto que creaste todos los guiones de arranque 
 personalmente, puedes modificarlos todo lo que desees, y posiblemente no 
 necesites este guión. Así que, ¿qué va a ser?

   Personalmente, recomiendo que crees este guión, para mantener la portabilidad.
 Muchos demonios escriben una o dos líneas en este fichero, y te evitas problemas
 si se encuentra presente. Puedes crearlo de esta forma:

   Pon esto en un fichero /etc/rc.d/rc.local:

-------------------------------/etc/rc.d/rc.local----------------------------
#!/bin/sh
-----------------------------fin /etc/rc.d/rc.local--------------------------

   No, no he cometido un error... :) No puedo crear este fichero por ti, pues debes ser 
 tú quien decida lo que poner en él (y, por supuesto, lo que no quieres poner). Haz 
 este guión ejecutable mediante:

  chmod 755 /etc/rc.d/rc.local

   Te será muy fácil desactivar /etc/rc.d/rc.local; simplemente elimina el permiso de
 ejecución y será ignorado durante el arranque.


5. PALABRAS DE SABIDUR¤A

   Supongo que querrás adaptar estos guiones a tus necesidades personales. Antes 
 de que lo hagas, .quisiera aconsejarte sobre donde poner los programas que quieras
 iniciar, y qué programas no deberías usar.

   Comencemos con los módulos del núcleo. Con frecuencia se cargan en una fase
 muy temprana, así que nosotros también lo haremos. Sugiero que insertes las líneas
 de modprobe después de la línea de depmod en /etc/rc.d/rc.sysinit.  Una excepción
 debe hacerse con las tarjetas de red, especialmente en máquinas con mucho tráfico
 o máquinas con l337 h4x0r5 como clientes. Para ponerte a salvo, deberías
 cargar los módulos de las tarjetas de red desde /etc/rc.d/rc.2 y /etc/rc.d/rc.3, pues 
 sólo se necesitan en modo multi-usuario. En caso de error del sistema, puedes
 reiniciar tu sistema en modo de usuario único sin entorno de red de forma segura.

   Mucha gente usa hdparm para ajustar sus discos duros. Yo lanzo hdparm desde el
 guión de inicialización del sistema, pues también quiero un disco duro rápido en el
 modo de usuario único :). Creo que carece de sentido lanzar hdparm cuando ya está 
 todo cargado, pues el arranque del sistema hace un uso intensivo del disco duro, y si 
 este es más rápido el proceso se acelerará.

   Los demonios de red, como los servidores de nombres, apache y mysql,  
 obviamente debería cargarse desde los guiones de inicio de multi-usuario, pues no
 los necesitas en entornos de usuario único.

  Si tienes instalado netkit-base para tu tarjeta de red, probablemente quieras tener
 disponible un dispositivo de red local para muchos programas. Para conseguir uno,
 pon lo siguiente en /etc/rc.d/rc.sysinit justo después de ejecutar hostname:

----------------------------------------------------------------------------
echo "Activando la interfaz de red local..."
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
----------------------------------------------------------------------------

   Como consejo final en esta sección, quisiera precisar que a menudo tengo un 
 entorno multi-usuario sin entorno de red. Puede ser una buena práctica para ti 
 configurar este entorno en, por ejemplo, el nivel de arranque 5, y configurarlo en
 un modo seguro. Esto implica que debes decidir qué servicios necesitas realmente
 y cuales no, para evitar causar cualquier daño causado por tu ignorancia.


6. EL FINAL

   Espero que aprendas con esta receta cómo trabaja el inicio al estilo BSD. Aunque
 esta configuración no es idéntica a la de Slackwares o BSDs, la idea es básicamente
 la misma. Si tienes comentarios sobre esta receta, o si simplemente te gusta, por 
 favor, mandame un mensaje a marc@koelkast.net. Adiós por ahora, y comprueba las
 actualizaciones de la receta.

__FIN__