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__
|