Scripts de arranque. Pablo Sanz Mercado. 1 1. Configuración y comandos básicos. Los niveles de ejecución en Linux son las diferentes formas en las que podemos encontrar un sistema operativo Linux. Cuando arrancamos un sistema Linux, tenemos la posibilidad de que el sistema operativo se comporte por ejemplo de forma monousuario, es decir, que no tengamos que introducir ni siquiera la contraseña del super usuario ya que arranca directamente en esta cuenta, como pasaba con los sistemas opertivos DOS o Windows95/98/me. Otra forma que podemos tener de arrancar Linux es que permita que múltiples usuarios puedan conectarse a nuestra máquina, y que arranque un entorno gráfico en el cual pueda trabajar de forma muy agradable la persona que se siente delante de este equipo. Niveles de ejecución tenemos varios, es más, podremos incluso crear nuestro propio nivel de ejecución, totalmente personalizado. Por tanto esta forma de trabajar aumenta la versatilidad que tiene el sistema operativo Linux. Al ser los niveles de ejecución totalmente configurables, es posible que al trabajar en diferentes versiones de Linux veamos diferencias significativas. En la mayorı́a de las distribuciones de Linux vamos a tener que el nivel de ejecución 0 es el de apagado, es decir, si vemos que nuestro equipo está en este nivel de ejecución, inmediatamente tendremos que darnos cuenta de que está produciéndose el apagado del mismo. Otro nivel de ejecución que suele ser el mismo en todas las distribuciones es el número 6, que es el nivel de ejecución de reinicio, es decir, cuando nuestra máquina pasa a estado de ejecución 6 realmente está reiniciándose. Llegados a este punto nos damos perfecta cuenta de que un nivel de ejecución no es una forma de arrancar el sistema operativo, sino un estado del mismo. En muchas distribuciones el nivel de ejecución número 5 es el nivel de ejecución multiusuario con entorno gráfico y es el que se ejecuta por defecto cuando arranca el equipo. No tenemos que querdarnos entonces en que el nivel de ejecución de nuestro equipo es el número 5, sino que en ese justo momento está en el nivel de ejecución 5 y podremos cambiar a otro nivel en el momento que deseemos. También es habitual que en las diferentes distribuciones Linux el nivel de ejecución número 3 sea el de multiusuario sin entorno gráfico. Si bien es posible que en algún sistema Linux este nivel de ejecución no sea el número 3, normalmente nos encontraremos este nivel de ejecución ya que es muy habitual que las máquinas permanezcan la mayorı́a del tiempo en él. Esto suele ocurrir en máquinas destinadas al cálculo, donde es superfluo un entorno gráfico ya que suelen ser administradas en remoto y el tener este entorno aumenta la necesidad en disco pero sobre todo la cantidad de memoria RAM necesaria para las operaciones habituales. Ya que habı́amos hablado del nivel de ejecución monousuario, comentar que en la mayorı́a de las distribuciones suele ser el número 1, es decir, estar en nivel de ejecución número 1 implica necesariamente la imposibilidad de poder conectarnos a esta máquina con más de un usuario, y además este (root) debe conectarse directamente en consola. El nivel de ejecución número 2 es multiusuario sin entorno gráfico y sin NFS 2 en muchas distribuciones de Linux, es decir, es como el nivel de ejecución número 3 pero sin la posibilidad de importar/exportar recursos de disco a través de la red. Este nivel de ejecución se suele utilizar si tenemos algún problema con la red, si bien queremos mantener la caracterı́stica de entorno multiusuario en nuestro equipo. Finalmente comentar que el nivel de de ejecución número 4 suele estar reservado para que el administrador del equipo lo adapte a sus propias necesidades, siendo por tanto este nivel de ejecución el personal del administrador, teniendo las caracterı́sticas que este haya querido introducir. Cuando hablamos de nivel de ejecución es posible que lo veamos como un ente extraño y totalmente lejano a nuestras necesidades y posibilidades. Nada más lejano de la realidad. Cuando accedemos a un nivel de ejecución, realmente lo que ocurre es que se ejecutan los scripts contenidos en el directorio rcX.d, donde X es un número que indica el nivel de ejecución al que nos referimos (rc5.d por ejemplo a multiusuario con entorno gráfico). Los directorios rcX.d habitualmente los encontramos directamente en el directorio /etc, si bien en ciertas distribuciones los encontraremos en /etc/init.d, y si comprobamos su contenido nos daremos cuenta de que contienen varios (en muchas ocasiones una gran cantidad) enlaces simbólicos con nombres que siguen una estructura muy caracterı́stica: El primer carácter que nos encontramos es o una K o una S. A continuación tenemos dos caracteres que son números y finalmente tenemos un nombre sin ninguna regla preestablecida, pero que suele ser exactamente igual al nombre del fichero que apunta el enlace simbólico, por ejemplo: K05network Los ficheros a los que apuntan, los scripts a los que apuntan, habitualmente los encontraremos en el directorio /etc/init.d (si bien no es obligatoria esta ubicación), y normalmente responden estos scripts a una estructura tipo case. Cuando pasamos a un nivel de ejecución dado, digamos el número 5, lo que ocurre es que se ejecutan en orden estricto todos y cada uno de los scripts a los que hacen referencia los enlaces simbólicos. Estos scripts se ejecutan con un único argumento, que será start o stop dependiendo de si los enlaces simbólicos empiezan por S o K respectivamente. Es decir, si en el directorio rc5.d tenemos los siguientes enlaces simbólicos: S01network --> /etc/init.d/network S05nfs --> /etc/init.d/nfs K01ypbind --> /etc/init.d/ypbind el orden estricto implica por tanto que el primer script en ejecutarse será /etc/init.d/ypbind (K es anterior a S), seguido de /etc/init.d/network (S01 es anterior a S05) y finalmente /etc/init.d/nfs La forma de ejecutar estos scripts será por tanto: 3 /etc/init.d/ypbind stop /etc/init.d/network start /etc/init.d/nfs start Lo cual nos da una idea de la sencillez a la hora de incluir scripts personales para que se ejecuten de una determinada manera a la hora de pasar a un nivel de ejecución concreto, pues lo que tendremos que hacer es ubicar nuestro script en el directorio /etc/init.d y realizar un enlace simbólico en el directorio rcX.d que consideremos oportuno, llamando a este script con la sintaxis correcta. Hay que tener en cuenta que al ejecutarse en orden estricto, es conveniente tener en cuenta qué scripts se ejecutan antes y después del que estamos modificando. Por ejemplo deberı́amos tener en cuenta que si nuestro script ejecutará alguna herramienta que necesite de la red para funcionar, deberı́a ejecutarse (si este es el caso), con posterioriddad al script que arranca la red, por lo tanto si este último está enlazado como S08network, nuestro script podrı́a ser S09script para que se ejecute con posterioridad al arranque de la red. Muchas veces equivocamos el sentido del fichero /etc/inittab al relacionarlo con los niveles de ejecución. Este fichero indica qué procesos tienen que ejecutarse en el arranque ası́ como en la operación habitual, y una de sus lı́neas indica qué nivel de ejecución se utilizará, por defeto, al arrancar la máquina. La lı́nea a la que hacemos referencia bien podrı́a ser: id:3:initdefault: en la que se indica que el nivel de ejecución por defecto, el que se ejecutará al arrancar la máquina, será el nivel número 3. No obstante nosotros podremos cambiar de nivel de ejecución fácilmente utilizando el comando telinit, telinit 2 harı́a que nuestra máquina pasara al nivel de ejecución número 2, de tal forma que podemos utilizar los comandos halt (o shutdown -h now ) y reboot (o shutdown -r now para apagar la máquina o reiniciarla respectivamente, o bien sus análogos telinit 0 y telinit 6 respectivamente. En cualquier momento, podremos saber en qué nivel de ejecución estamos sin más que teclear, runlevel 2. service Estos scripts que tenemos en nuestro sistema pueden ejecutarse con la opción stop o start cuando se cambia de nivel de ejecución, pero también los podremos ejecutar mediante el comando service 4 service httpd start por ejemplo arrancará el servidor web en nuestro ordenador, es decir, buscará el script httpd en el directorio /etc/init.d y lo ejecutará con la opción start, sin tener que escribir nosotros toda la ruta completa. 3. chkconfig Además de poder darle la opción start, podemos optar por proporcionarle la opción stop o cualquier otra (status por ejemplo), que tuviera configurada el script. Finalmente, si queremos configurar los distintos scripts que queremos que paren o arranque al pasar a uno u otro nivel de ejecución, pero no nos atrae la idea de estar borrando, modificando o creando enlaces simbólicos en los directorios correspondientes, siempre podremos hacer uso del comando chkconfig La ejecución de este comando con la opción –list chkconfig --list nos mostrará en pantalla una lista con todos y cada uno de los scripts que pueden arrancarse o pararse al cambiar de nivel de ejecución, describiendo su estado para cada nivel de ejecución, es decir, nos indicarán si en el nivel 5, por ejemplo, se arrancan o se paran, etc. Un ejemplo de ejecución podrı́a ser: xfs 3:activo ypbind 3:desactivado 0:desactivado 4:activo 0:desactivado 4:desactivado 1:desactivado 5:activo 1:desactivado 5:desactivado 2:activo 6:desactivado 2:desactivado 6:desactivado Con esta herramienta no sólo podremos listar el estado, sino que también podremos configurar un determinado script para que se le envı́e una señal stop a la hora de pasar a un nivel de ejecución determinado: chkconfig --level 35 sendmail off que configurarı́a los directorios rc3.d y rc5.d de tal forma que se mandarı́a una señal stop al script sendmail al pasar a cualquiera de estos dos niveles de ejecución. Igual que hemos utilizado este comando para parar estos scripts, lo podrı́amos haber hecho de forma equivalente para que arrancaran estos scripts cuando pasáramos a estos niveles de ejecución, pues lo único que habrı́a cambiado es on por off. 5