1 Inicialización del sistema y servicios Capítulo 1 Sinopsis de la secuencia de arranque Conceptos clave • • • Después del arranque, la inicialización de Red Hat Enterprise Linux se realiza en cuatro etapas: BIOS, un gestor de arranque, el kernel y /sbin/init. La configuración del BIOS permite especificar una secuencia de dispositivos que se deberían considerar dispositivos de arranque. Una vez que el BIOS haya seleccionado un dispositivo de arranque, transfiere el control a cualquier ejecutable que se encuentre en el registro de arranque maestro del dispositivo. Introducción Desde el momento en que se enciende hasta que los usuarios inician sesión en una máquina que esté funcionando, el sistema pasa a través de cuatro etapas distintas de inicialización. 1. BIOS: El sistema operativo mínimo que está localizado en el ROM de la placa madre. 2. Gestor de arranque: La aplicación mínima que se carga desde el MBR del disco, se utiliza para cargar y pasar el control al kernel de Linux. 3. Kernel: El kernel de Linux inicializa las estructuras internas y los controladores de dispositivos, provee un sistema de archivos inicial e inicia el primer proceso. 4. /sbin/init: El proceso /sbin/init realiza la mayor parte del trabajo duro (pertinente a la administración del sistema) para inicializar la máquina. Este cuaderno explicará las diferentes etapas en detalle. Esta primera lección presenta toda la estructura y la configuración pertinente del BIOS. La segunda lección presenta el gestor de arranque GRUB y la función del kernel de Linux en el arranque. Las últimas dos lecciones abordarán la función del proceso inicial /sbin/init y la configuración de servicios de Red Hat Enterprise Linux. BIOS Cada computador, cuando se enciende por primera vez, inicia un sistema operativo mínimo llamado BIOS de Basic Input/Output Sytem (sistema básico de entrada/salida). El BIOS de un sistema es una funcionalidad permanente de la placa madre. [1] La mayoría de los BIOS ofrecen una utilidad interactiva, que puede ser iniciada al presionar una secuencia de teclas determinada durante el inicio tal como la tecla SUPR, o F10. La secuencia de teclas difiere entre sistemas y se presenta como parte del proceso de inicio. Cuando inicia, el BIOS de un sistema por lo general realiza las siguientes funciones. Verificación del sistema POST 2 Inicialización del sistema y servicios El BIOS realiza una revisión integral del sistema, asegurando que los componentes centrales tales como la CPU o la memoria están presentes y funcionando. Esta prueba se refiere a menudo como el POST o Prueba de energía en sí mismo. Inicialización de dispositivos El BIOS de un sistema inicializa los controladores de dispositivos centrales para el teclado, los puertos seriales de vídeo y otros, asignando los recursos de sistema apropiados tales como líneas IRQ y puertos E/S. Los BIOS modernos implementan el protocolo Plug n' Play, el cual se utiliza para probar los dispositivos PCI para configuraciones de recursos compatibles y luego asignar a cada dispositivo PCI una configuración sin conflictos. Muchos sistemas operativos también pueden realizar una configuración similar a Plug n' Play y la mayoría de BIOS proveen una configuración tal como Plug n' Play Aware OS? [Y/n], la cual puede hacer que BIOS difiera la configuración hasta que se cargue el sistema operativo. Aunque Linux sí soporta Plug n' Play, se sugiere, por lo general, que BIOS realice la configuración Plug n' Play (por ejemplo, al responder "No" a la configuración BIOS anterior). Selección del dispositivo de arranque Después de inicializar los dispositivos, BIOS busca un dispositivo de arranque apropiado. El dispositivo de arranque es seleccionado generalmente desde las opciones posibles. • • • • Dispositivo blando CD-ROM IDE o disco duro SCSI Tarjeta de red conforme a PXE Una tarjeta de red conforme a PXE, del inglés Preboot Execution Environment (entorno de ejecución de prearranque) suele implementar el protocolo de configuración IP DHCP (o BOOTP) y el archivo TFTP transfiere el protocolo de origen, el cual permite que la tarjeta de red descubra y descargue una imagen de kernel desde la red. Dicha tarjeta de red es la excepción a la regla y la configuración PXE va más allá del objetivo de este curso. La elección del dispositivo de arranque apropiado se configura a través de las aplicaciones interactivas del BIOS. Por lo general, el BIOS permite que se establezca un "orden jerárquico", primero busca un disquete de arranque y si no hay uno entonces busca un CD-ROM de arranque y por último busca un disco duro de arranque. Entregando las riendas Una vez se ha seleccionado el disco de arranque apropiado, el BIOS carga el primer bloque del disco (512 bytes) en la memoria y pasa la ejecución a esta región. El primer 3 Inicialización del sistema y servicios bloque de un disco de arranque debe contener un ejecutable pequeño conocido como un gestor de arranque. Continuaremos con este tema en la próxima lección. Capítulo 2 El gestor de arranque GRUB Conceptos clave • • • • • • En general, los gestores de arranque en Linux son responsables de tres cosas: 1. Componer una línea de comandos de kernel correcta (que haga referencia a la partición raíz correcta). 2. Cargar un disco ram inicial apropiado (initrd). 3. Cargar y pasar el control a un kernel Linux apropiado. Los gestores de arranque suelen diseñarse en dos etapas, con la primera etapa lo suficientemente pequeña para residir en un registro de arranque maestro. GRUB es el gestor de arranque recomendado para Red Hat Enterprise Linux. GRUB utiliza el archivo de configuración /boot/grub/grub.conf. Tras el inicio, GRUB se puede utilizar para editar su configuración y arrancar con la nueva especificación de modo interactivo. Tras el inicio, el kernel de Linux monta la partición raíz de sólo lectura e inicia el primer proceso, por lo general, /sbin/init. La función de un gestor de arranque Tras el arranque, el BIOS pasa el control a un pequeño ejecutable conocido como un cargador de arranque. Por lo general, realiza las siguientes tres tareas. 1. Componer una línea de comandos kernel. 2. Cargar un disco ram de inicio (initrd), si es necesario. 3. Cargar y pasar el control al kernel de Linux ¿Qué es un disco ram de inicio? Algunas veces, Red Hat elige implementar partes del kernel necesarias para cargar el sistema de archivos como módulos del kernel. Esta elección naturalmente presenta un problema. ¿Desde dónde carga el kernel sus módulos de kernel si son necesarios en el proceso de arranque antes de que se cree el sistema de archivos? La respuesta es un disco RAM inicial, el cual es una imagen del sistema de archivos que contiene los módulos necesarios. El gestor de arranque carga la imagen en la memoria para el kernel, desde donde el kernel puede montar el sistema de archivos y cargar los módulos necesarios. Los detalles de las imágenes de disco RAM iniciales conocidas como initrd, se tratarán en un cuaderno más adelante. Por ahora, observe que en Red Hat Enterprise Linux, los kernels casi siempre tienen initrd asociados, los initrd se llaman convencionalmente /boot/initrd-kernelversion.img y el gestor de arranque es el responsable de cargarlos. Una elección de gestores de arranque 4 Inicialización del sistema y servicios Red Hat Enterprise Linux ofrece una surtido de gestores de arranque, cada uno de los cuales puede realizar estas funciones. El gestor de arranque tradicional de Linux se conoce como LILO, cuyo nombre es un doble juego de palabras en inglés, porque es LInux LOader, y LIes LOw en el proceso de arranque. El gestor de arranque LILO es específico para Linux y el sistema de archivos ext2. Un gestor de arranque relativamente reciente es el GRUB Grand Unified Bootloader, (Gran gestor de arranque unificado). El GRUB es un proyecto patrocinado por GNU y como su nombre lo implica, está diseñado para funcionar con múltiples sistemas operativos (y sistemas de archivos). Tanto LILO como GRUB pueden utilizarse para realizar las tareas necesarias mencionadas anteriormente desde una configuración predeterminada (no interactiva) o para permitir al usuario sobrescribir la configuración en el momento del arranque. GRUB es ahora el gestor de arranque de Red Hat Enterprise Linux (LILO ya no se utiliza) y será el tema de este texto. Diseño del gestor de arranque Como mencionamos en la lección anterior, el BIOS generalmente pasa el control al gestor de arranque cuando carga y ejecuta el primer bloque de un disco. Esto obliga a los gestores de arranque a implementar un diseño de dos etapas. Primera etapa La primera etapa de un gestor de arranque es generalmente pequeña, diseñada para ajustarse en el registro de arranque maestro (de hecho, ¡comparte el MBR con la tabla de particiones!) o el bootsector de una partición. [1] La única tarea de este gestor de arranque de la primera etapa es el ubicar, cargar y pasar el control al gestor de arranque de la segunda etapa. Ya que el gestor de arranque de la primera etapa se encuentra en el MBR o en el sector de arranque usualmente no es un archivo visible en el sistema de archivos. Segunda etapa La segunda etapa de un gestor de arranque es por lo general el propio gestor de arranque, el cual ejecuta una forma de aplicación (a menudo interactiva) en el inicio y puede leer información de configuración acerca de configuraciones por defecto. El gestor de arranque de la segunda etapa suele ser un archivo binario identificable en el sistema de archivos. Diseño GRUB Los componentes del gestor de arranque GRUB tradicionalmente residen en el directorio /boot/grub. [root@station root]# ls /boot/grub/ 5 Inicialización del sistema y servicios device.map ffs_stage1_5 vstafs_stage1_5 e2fs_stage1_5 grub.conf xfs_stage1_5 fat_stage1_5 jfs_stage1_5 menu.lst splash.xpm.gz minix_stage1_5 stage1 reiserfs_stage1_5 stage2 La segunda etapa del gestor de arranque es bastante fácil de identificar: se llama stage2. El archivo stage1 es una copia del gestor de arranque de la primera etapa instalada en el MBR o en el sector de arranque (observe que el tamaño es sospechoso en la siguiente transcripción). [root@station root]# ls -l /boot/grub/stage1 -rw-r--r-1 root root 512 Apr /boot/grub/stage1 1 2003 Los archivos que terminan en 1_5 son sistemas de archivos específicos a la "primera etapa y mitades", utilizados para localizar y leer stage2, grub.conf y otros archivos desde varios sistemas de archivos. Por lo general, la única parte "servible al usuario" de GRUB es su archivo de configuración, /boot/grub/grub.conf. Configuración GRUB GRUB utiliza un archivo de configuración de texto ASCII, /boot/grub/grub.conf, que suele ser editado a mano con un editor de texto. Una muestra del archivo de configuración se ilustra a continuación. [root@station root]# cat /etc/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda3 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu password --md5 $2$MrXSq0xS$0LXqkBTfpywyD3TVCao3d0 title Red Hat Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ rhgb quiet vga=0x317 initrd /initrd-2.6.9-5.EL.img El archivo está estructurado con una sección "global" principal que consta de todas las líneas antes de la primera línea empezando por la palabra clave title, y una o más definiciones menuitem que comienzan con la palabra clave title. El espacio en blanco 6 Inicialización del sistema y servicios dentro de una línea es insignificante, aunque la definición de estrofas llevan sangrías con el TABULADOR. Cada línea correspondiente debe iniciar con una palabra clave reconocida y el resto de los parámetros de la palabra clave deben presentarse en la misma línea, (los usuarios de editores de texto que automáticamente delimitan líneas, ¡tengan cuidado!) Por lo general, el archivo /boot/grub/grub.conf se edita directamente y los cambios se efectúan la próxima vez que grub se ejecute, (i.e., en el próximo arranque del sistema). Cómo se refiere GRUB a los archivos La sintaxis del archivo de configuración GRUB es sencilla a excepción de la sintaxis que GRUB utiliza para referirse a los archivos, la cual se presenta a continuación. (dispositivo,partnum)ruta de archivo Los componentes entre paréntesis se utilizan para identificar una partición de disco particular. La ruta de archivo identifica un archivo dentro del sistema de archivos que se encuentra en una partición especificada. La interpretación de cada componente implica sutilezas resumidas en el cuadro a continuación. Table 1. Forma en que GRUB se refiere a archivos Componente Role GRUB no se refiere a los dispositivos como hda o sdc o fd0, como lo hace el kernel de Linux. En su lugar, GRUB se refiere a dispositivos utilizando los siguientes nombres. dispositivo • • • hd0: "DISPOSITIVO BIOS #1" hd1: "DISPOSITIVO BIOS #2" fd0: "DISPOSITIVO BLANDO #1" Cada BIOS mantiene un concepto de su primer dispositivo. A menudo es su dispositivo IDE de maestro primario, algunas veces es otro dispositivo IDE, algunas veces es un dispositivo SCSI. Al cambiar la configuración BIOS, la identidad del "primer dispositivo" puede cambiar. partnum El partnum es un número entero utilizado para identificar la partición en un dispositivo. Infortunadamente, GRUB cuenta las particiones comenzando por 0, mientras que el kernel de Linux cuenta particiones comenzando por 1. Por lo tanto, lo que GRUB llama partición número 3, el kernel de Linux llamaría partición número 4. ruta de archivo El ruta de archivo es una ruta absoluta del archivo, relativo al directorio raíz del sistema de archivos. GRUB se refiere a los archivosantes los sistemas de archivos se montan en un único árbol de 7 Inicialización del sistema y servicios Componente Role directorio, por lo tanto, GRUB no tiene ningún concepto de los puntos de montaje. Este punto hace énfasis en el AVISO localizado por el instalador de Anaconda en el archivo de configuración de muestra presentado anteriormente. Para ilustrar, analizamos la siguiente línea del archivo de configuración, la cual especifica la imagen de fondo ("pantalla splash") para la aplicación GRUB. splashimage=(hd0,0)/grub/splash.xpm.gz La interpretación del nombre de archivo implica los siguientes tres pasos. 1. Determinar el dispositivo: Puesto que sabemos que nuestro sistema arrancó desde el dispositivo IDE de maestro primario, asumiremos que hd0 o el "Dispositivo BIOS #1", se refiere a éste. Lo que GRUB llama hd0, el kernel de Linux llamaría /dev/hda. 2. Determinar la partición: Ahora que conocemos el dispositivo, localizamos la partición en el dispositivo mediante el partnum, recordando que necesitamos agregar 1 para compensar el punto de inicio diferente de GRUB. El 0 anterior por lo tanto especifica la primera partición en el dispositivo /dev/hda1. 3. Determinar el archivo: Puesto que GRUB hacereferencia a archivos relativos al directorio raíz del sistema de archivos, necesitamos determinar dónde se monta la partición /dev/hda1 en nuestro árbol de directorios. Utilizamos el comando df para examinar los montajes actuales. 4. 5. [root@station root]# df Filesystem 1K-blocks on 6. /dev/hda3 8159420 7. /dev/hda1 69973 8. /dev/hdb5 30241928 9. /dev/hdb7 28130956 10. none 370024 /dev/shm 11. /dev/fd0 1430 /mnt/floppy Used Available Use% Mounted 5299244 25972 25947992 10578516 0 2445700 40388 2757724 16123460 370024 69% 40% 91% 40% 0% 1380 51 97% / /boot /home /var Dado que la partición /dev/hda1 está montada para /boot, el archivo /grub/splash.xpm.gz relativo al directorio raíz del sistema de archivos es el archivo /boot/grub/splash.xpm.gz relativo a la raíz del árbol de directorios. Después de determinar la partición y saber dónde está montada, podemos traducir el archivo "GRUB speak"(hd0,0)/grub/splash.xpm.gz a "Linux speak" como /boot/grub/splash.xpm.gz. Para reforzar el proceso de traducir referencias de archivo GRUB a referencias de archivos Linux, el siguiente cuadro lista archivos que utilizan ambos. Recuerde que la asignación depende de la estructura de particionamiento identificada en la salida del comando df visto anteriormente y cambiaría en discos con particiones diferentes. 8 Inicialización del sistema y servicios Table 2. Traducciones de nombres de archivos de GRUB a Linux Lo que GRUB llama... ... Linux llamaría... (hd0,0)/grub/splash.xpm.gz /boot/grub/splash.xpm.gz (hd0,2)/etc/passwd /etc/passwd (hd1,6)/log/dmesg /var/log/dmesg (hd1,4)/elvis/civgame+0220.sav.gz /home/elvis/civgame+0220.sav.gz (fd0,0)/syslinux.cfg /mnt/floppy/syslinux.cfg (hd0,0)/vmlinuz-2.6.9-5.EL /boot/vmlinuz-2.6.9-5.EL (hd0,0)/initrd-2.6.9-5.EL.img /boot/initrd-2.6.9-5.EL.img ¿Por qué GRUB debe ser tan diferente? Recuerde que GRUB se está ejecutando antes de que el kernel de Linux sea cargado y pueda considerarse un sistema operativo mínimo en sí mismo. Como GRUB es el cargador "Gran unificado" y no sólo el cargador Linux, su sintaxis no se relaciona con la del kernel de Linux. Configuración global GRUB Con la parte difícil ya explicada, volvamos a la sección global del archivo de configuración GRUB, que es, todas las líneas que aparecen antes que una línea inicie con title. default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz password --md5 $2$MrXSq0xS$0LXqkBTfpywyD3TVCao3d0 hiddenmenu Las siguientes entradas se encuentran a menudo dentro de la sección global. Table 1. Sintaxis de configuración global GRUB Palabra clave Propósito default=N Define la entrada del menú por defecto, si el usuario no escoge ninguna. Las entradas de menú se cuentan empezando desde 0. timeout=N Especifica la cantidad de tiempo (en segundos) que el usuario tiene para escoger una entrada de menú, antes de utilizar la entrada del menú predeterminada. splashimage=file Usa file como una imagen de fondo para el menú. password plaintext Especifica una contraseña para la aplicación GRUB utilizando texto sin formato. password --md5 ciphertext Especifica una contraseña para la aplicación GRUB con codificación MD5. hiddenmenu No muestra el menú GRUB en el arranque. 9 Inicialización del sistema y servicios Palabra clave Propósito Utilice password, no passwd Un error común dentro del archivo de configuración GRUB es el uso incorrecto de la palabra clave passwd , en lugar de password. Configuración de elementos del menú de GRUB En el arranque, GRUB suele presentar al usuario un menú de posibles configuraciones. Dichas configuraciones vienen en estrofas en el archivo de configuración grub.conf que comienza por la palabra clave title, seguida por texto utilizado para etiquetar la estrofa como se ilustra a continuación. title Red Hat Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ rhgb quiet vga=0x317 initrd /initrd-2.6.9-5.EL.img La siguiente sintaxis se encuentra en elementos del menú utilizados para arrancar kernels de Linux. A diferencia de la sección global, los elementos individuales deben aparecer en el orden especificado. Table 1. Sintaxis de configuración de los elementos del menú de GRUB Palabra clave Propósito root partition Monta y utiliza de modo implícito el partition especificado en todas las referencias de archivo posteriores. kernel Carga el archivo especificado como imagen de kernel y pasa los argumentos al kernel como línea de comando del kernel. filecommandline... initrd file Carga el archivo especificado como un disco RAM inicial para el kernel. Observe cómo el diseño de una estrofa de un elemento de menú refleja los parámetros necesarios. La línea de configuración kernel especifica la imagen de kernel para cargar y su línea de comando asociada, mientras que la línea de configuración initrd especifica un disco RAM inicial a cargar. Uso de GRUB Por lo general, el grub se instala con el instalador de Anaconda y se utilizará cada vez que se inicie el sistema. Cuando GRUB se ejecuta, primero muestra un texto sencillo en el inicio y luego presenta al usuario un menú gráfico y en la configuración predeterminada de Red Hat Enterprise Linux, un temporizador de conteo regresivo desde 10. 10 Inicialización del sistema y servicios Para nuestros propósitos, nos referiremos a GRUB como si estuviera ejecutándo en uno de los cinco modos: • • • • • Modo seguro: Este modo presenta al usuario un menú de selecciones de arranque. Modo básico: El modo básico se parece al modo seguro, pero en lugar de seleccionar el elemento del menú, el usuario puede optar por entrar en los siguientes modos. Modo de edición: Este modo permite al usuario hacer correcciones en una configuración existente. Modo de agregar: Semejante al modo de edición, este modo permite al usuario corregir la línea de comandos del kernel. Modo de comando: En este modo, el usuario opera dentro de una shell interactiva grub. Cada uno de los modos se trata detalladamente a continuación. Modo seguro El modo seguro es el modo predeterminado si una contraseña se especificó en el archivo de configuración grub.conf. Grub presenta el usuario con un menú, cuyos títulos son una reflexión directa de las líneas title que se encuentran en el archivo de configuración grub.conf. Al seleccionar un elemento del menú, el sistema inicia con la configuración especificada. Si se especifica la contraseña correcta, el usuario puede saltar del modo seguro al modo básico. Modo básico El modo básico es el modo por defecto si no se proporciona una contraseña en el archivo de configuración grub.conf. Los usuarios pueden elegir un elemento de menú apropiado o pueden utilizar cualquiera de las siguientes claves para entrar en uno de los modos a continuación. Table 1. Comandos para cambiar de modo en GRUB. clave Acción e entra el modo de edición para el elemento de menú seleccionado a entra el modo de agregar para el elemento de menú seleccionado c entra el modo de comando Modo de edición 11 Inicialización del sistema y servicios Al entrar el modo de editar, grub muestra líneas desde la estrofa grub.conf pertinente en un editor de texto primario. El editor le permite al usuario agregar una nueva línea, borrar una línea existente o editar una línea existente con cambios arbitrarios. Una vez el usuario ha editado la estrofa a su gusto puede utilizar b para iniciar con una nueva configuración o ESC para abandonar todos los cambios y volver al modo básico. En cualquier evento, los cambios a la configuración hechos con el modo de edición de grub se aplican a ese inicio únicamente. La aplicación grub no permite a los usuarios editar archivos de modo permanente. Modo de agregar El modo de agregar puede considerarse como una reducción del modo de edición, donde sólo los argumentos que componen la línea de comando del kernel se pueden editar. Aunque es menos versátil (un nuevo kernel o archivo initrd no se podría especificar, por ejemplo) el modo de agregar se puede utilizar en la mayoría de los casos cuando un usuario desee sobrescribir la configuración grub por defecto. Como en el modo de edición, los cambios se aplican sólo en ese inicio. Modo de comando En el modo de comando, se omite el archivo existente grub.conf y el usuario opera en una shell interactiva grub, (en este caso, el término shell se utiliza en el sentido general. ¡No espere encontrar todas las capacidades de la shell bash !) Los usuarios expertos pueden usar la shell para especificar un kernel e initrd de modo manual e iniciar el sistema, o usar la shell para examinar el sistema de archivos. Se puede salir de la shell grub con la tecla ESC, la cual devuelve al usuario al modo básico. Instalación de GRUB Cuando la gente se refiere a la instalación de un gestor de arranque, por lo general se refieren a transferir la primera etapa del gestor de arranque al registro de arranque maestro o al sector de arranque apropiados. Los administradores de sistemas rara vez necesitan reinstalar la primera etapa del gestor de arranque GRUB, cuando Anaconda la instala tras la instalación del sistema y aparte de los cambios al archivo de configuración [1] grub.conf, la instalación no se debería modificar para uso rutinario. Sin embargo, si por alguna razón necesita instalar GRUB puede utilizar grub-install. El comando se llama con un solo argumento, el nombre del dispositivo cuyo registro de arranque maestro se puede utilizar para la instalación. [root@station root]# grub-install /dev/hda Installation finished. No error reported. This is the contents of the device map /boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. 12 Inicialización del sistema y servicios # this device map was generated by anaconda (fd0) /dev/fd0 (hd0) /dev/hda Tras la instalación, grub-install muestra la interpretación actual del "Dispositivo BIOS #1" (o los dispositivos a los que se haga referencia). Por lo general, esta información es correcta. Si no parece apropiada, se tendría que editar el archivo /boot/grub/device.map y ensayar de nuevo. Administración de contraseñas de GRUB Como veremos más adelante, la habilidad de modificar la línea de comando del kernel en el arranque proporciona una gran flexibilidad, pero a su vez trae riesgos de seguridad. Por ejemplo, al proveer los argumentos apropiados, se puede iniciar el sistema en una shell de mantenimiento desde la cual se puede cambiar la contraseña de la cuenta de root. Por consiguiente, se sugiere proveer una contraseña en el archivo de configuración grub.conf. Aunque el archivo de configuración admite contraseñas en texto sin formato, el almacenamiento de contraseñas en texto sin formato en el sistema de archivos nunca es una buena idea. password redhat En su lugar, se puede utilizar el comando grub-md5-crypt para generar contraseñas encriptadas, las cuales se pueden pegar en el archivo de configuración, como a continuación. [root@station root]# grub-md5-crypt Password: redhat Retype password: redhat $2$vCoF50$x48AkrGLEoXPznNiWnqhA. La siguiente línea se pudo incluir en el archivo de configuración grub.conf. password --md5 $2$vCoF50$x48AkrGLEoXPznNiWnqhA. Esta línea establece la contraseña de GRUB para redhat, pero no deja la contraseña expuesta en texto sin formato en el archivo de configuración. Limitaciones de BIOS y GRUB Cuando la aplicación GRUB se está ejecutando, el kernel de Linux aún no está en su sitio. Por consiguiente, GRUB utiliza controladores de dispositivos de BIOS para acceder a los discos. Algunos controladores más antiguos no tienen limitaciones significativas. 1. Algunos BIOS no pueden acceder más de 1.024 cilindros. 2. Muchos de los BIOS son sólo conscientes de las particiones primarias. 13 Inicialización del sistema y servicios La primera limitación es la motivación para la partición /boot. Por diseño, la partición /boot debe contener todos los elementos del sistema necesarios antes que el kernel de Linux se cargue: la imagen misma del kernel, cualquier initrd y el gestor de arranque. La partición es por lo general pequeña y se presenta tan pronto como sea posible en el dispositivo, para que se ajuste totalmente dentro de los primeros 1.024 cilindros de disco. Dicho esto, la mayoría de BIOS modernos proporcionan extensiones que superan esta limitación. De manera interesante, un sistema Linux se puede operar bastante bien sin montar la partición /boot, (recuerde que sólo se encuentran los aspectos del sistema que se necesitan antes de iniciar el kernel). En la práctica, no es una buena idea, puesto que hay un archivo ocasional al cual se hace referencia desde el sistema de ejecución (tal como System.map, o el archivo de configuración grub.conf, si el administrador desea hacer cambios). La segunda limitación sólo afecta a donde GRUB puede instalarse si otro gestor de arranque se utiliza en el registro de arranque maestro. Es decir, sólo los sectores de arranque de particiones primarias son candidatos para la instalación de la primera etapa GRUB. Esto no se considera una configuración estándar y los detalles de configuración van más allá de los objetivos de este curso. Al cerrar, volvemos a hacer énfasis en que estas dos limitaciones están relacionadas con BIOS no con Linux. Cuando el kernel de Linux está en ejecución, ninguna de estas limitaciones importa. El kernel de Linux La lección anterior presentó la inicialización de Linux ocurriendo en cuatro fases diferentes. Esta lección trata principalmente del gestor de arranque; las siguientes dos lecciones describirán /sbin/init y los procesos relacionados. Entre estos dos está la sección corta, la cual proporciona algo más que una transición y describe la función del kernel al cargarlo en el sistema. Aunque se puede decir mucho de la inicialización del kernel desde el punto de vista del diseño de sistemas operativos, desde el punto de vista de la administración del sistema, hay muy poco que decir. No obstante, lo que hay que decir es importante. En esencia, un administrador de sistemas puede ver el kernel mientras realiza tres etapas. 1. Remplaza todos los controladores de dispositivos BIOS con controladores de dispositivos Linux. 2. Monta la partición root de sólo-lectura. 3. Inicia el primer proceso. El kernel hace muy poco para inicializar el sistema y confía en que el primer proceso haga todo el trabajo difícil. 14 Inicialización del sistema y servicios Hay algunas repercusiones asociadas con cada paso. 1. Puesto que Linux remplaza todos los controladores de dispositivos BIOS, las limitaciones de BIOS mencionadas anteriormente no son relevantes una vez que el kernel inicia. 2. Puesto que el kernel debe montar la partición raíz, se le debe decir qué partición es la correcta para el montaje. Esto generalmente se realiza con el parámetro de línea de comando del kernel de root=, el cual puede referirse a una partición específica (tal como root=/dev/hda5) o como el comando mount, puede hacer referencia a la partición raíz por su etiqueta de sistema de archivos ext2 (mediante una sintaxis bastante extraña root=LABEL=/). ¿Por qué el kernel lo monta de sólo lectura, en lugar de lectura-escritura? La respuesta se encuentra en una próxima lección. 3. Como el kernel inicia el primer proceso directamente, se debe especificar la partición root correcta. El nombre del primer proceso está fijado en el kernel: /sbin/init. El kernel montará como partición root cualquier partición que usted le diga, pero sólo podrá hallar /sbin/init si usted le da la correcta. La línea de comandos del kernel: parámetros de arranque Así como los procesos tienen una línea de comandos, el kernel también tiene una línea de comandos. Los parámetros de la línea de comandos para el kernel actual se pueden examinar al leer /proc/cmdline. [root@station ~]# cat /proc/cmdline ro root=LABEL=/ rhgb quiet Los símbolos especificados según el nombre de archivo del kernel en el archivo de configuración grub.conf se pasan al kernel, el cual los administra de la siguiente manera. 1. Primero, el kernel comprueba si el símbolo es un parámetro incorporado del kernel. Si lo es, el kernel aplica el parámetro. Algunos de los parámetros más comunes del kernel están documentados en la página de manual bootparam(7). 2. Segundo, si el kernel no reconoce el símbolo y el símbolo tiene la forma nombre=valor,el kernel pasa el valor al primer proceso como variable de entorno nombre, (el primer proceso es casi invariable /sbin/init). 3. Por último, todo lo que el kernel no reconozca y que no tenga la forma de nombre=valor, el kernel pasará al primer proceso como un argumento de línea de comandos. Algunos de los argumentos más utilizados de la línea de comandos del kernel se encuentran en el siguiente cuadro. Table 1. Parámetros comunes de arranque del kernel Parámetro Efecto 15 Inicialización del sistema y servicios Parámetro Efecto root=dispositivo Utiliza dispositivo como partición raíz (vea arriba). Este parámetro se requiere casi siempre. ro Monta la partición raíz de sólo lectura (ver arriba). Este parámetro casi siempre se requiere. quiet No muestra mensajes en el inicio. Aunque habilitado por defecto en Red Hat Enterprise Linux, muchos administradores prefieren quitarlo para ver el flujo de mensajes del kernel. rhgb Este parametro del inglés "Red Hat Graphical Boot" (Arranque gráfico de Red Hat), hace que un servidor X inicie temprano en el proceso de arranque. El parámetro se puede quitar fácilmente si esto complica o retarda el proceso de arranque. Referencia a un nuevo kernel Un administrador de sistemas compiló un kernel personalizado, creó un disco RAM asociado de inicio y lo colocó en el directorio /boot como los archivos vmlinuz2.4.21-custom y initrd-2.4.21-custom.img, respectivamente. Ahora quiere actualizar su archivo grub.conf para poder arrancar en el nuevo kernel. Su archivo actual se ve de esta forma. [root@station root]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda3 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz password --md5 $2$MrXSq0xS$0LXqkBTfpywyD3TVCao3d0 title Red Hat Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ quiet rhgb initrd /initrd-2.6.9-5.EL.img El administrador abre el archivo en un editor de texto y en primer lugar duplica la "consabida" estrofa. title Red Hat Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ quiet rhgb initrd /initrd-2.6.9-5.EL.img title Red Hat Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ vga=0x317 16 Inicialización del sistema y servicios initrd /initrd-2.6.9-5.EL.img Luego, el administrador edita la segunda estrofa, cambiando las referencias de título, kernel e initrd, como corresponda. title Red Hat Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ quiet rhgb initrd /initrd-2.6.9-5.EL.img title Red Hat Linux (2.4.21-custom) root (hd0,0) kernel /vmlinuz-2.4.21-custom ro root=LABEL=/ quiet rhgb initrd /initrd-2.4.21-custom.img Ahora, el administrador almacena sus cambios y reinicia. Al reiniciar, puede escoger su nuevo kernel personal y el menú GRUB. Si algo sale mal (tal como un error tipográfico en el archivo de configuración grub.conf), siempre podrá reiniciar otra vez en la "consabida" entrada. Migración a un archivo de configuración GRUB Un administrador está migrando un archivo de configuración grub.conf de un sistema a otro. Aquí está el contenido del archivo. [root@station root]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda3 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz password --md5 $2$MrXSq0xS$0LXqkBTfpywyD3TVCao3d0 title Red Hat Enterprise Linux (2.6.9-5.EL) root (hd0,0) kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ vga=0x317 initrd /initrd-2.6.9-5.EL.img Como los comentarios lo implican, en el sistema original, el directorio /boot fue particionado Sin embargo en el sistema actual, solo hay una partición raíz: el dispositivo /dev/hda2. Ya que el directorio /boot ahora es parte de la partición raíz, el administrador necesita realizar los siguientes ajustes. 1. La especificación de la partición raíz necesita actualizarse para referirse al dispositivo /dev/hda2. 17 Inicialización del sistema y servicios 2. Las rutas de archivos para el kernel y el disco RAM de inicio se necesitan actualizar para reflejar el hecho que el directorio /boot es ahora parte del sistema de archivos raíz. Puesto que en la nueva máquina, la configuración original no funcionará, decide modificar la estrofa "en su sitio". La estrofa modificada se lista a continuación. title Red Hat Linux (2.6.9-5.EL) root (hd0,1) kernel /boot/vmlinuz-2.6.9-5.EL ro root=LABEL=/ vga=0x317 initrd /boot/initrd-2.6.9-5.EL.img Ejercicios en línea Lab Exercise Objetivo: Ganar experiencia en la configuración del gestor de arranque de GRUB. Estimated Time: 30 mins. Specification Usted va a copiar (¡no a mover!) su kernel existente e initrd a un nuevo sitio y va a modificar su grub.conf de modo apropiado para arrancar el kernel recién creado. 1. Crear el directorio /kernel. 2. Utilizar el comando uname -r para reportar su versión de kernel actual. 3. Copiar los archivos /boot/vmlinuz-versión de kernel y /boot/initrdversión_de_kernel.img al directorio /kernel recién creado. Asegúrese de copiar el archivo empezando por vmlinuz, no vmlinux. 4. Como precaución, haga una copia de seguridad de su archivo /boot/grub/grub.conf, llamado /boot/grub/grub.conf.prelab4.2. Abra su archivo /boot/grub/grub.conf y haga los siguientes cambios. a. Duplique la estrofa de los elementos del menú pertinentes a su kernel actual y establezca el título de la estrofa recién creada a la única palabra lab4.2. . No modifique su estrofa original de ninguna manera. b. En su estrofa de elementos de menú recién creada, actualice las referencias al kernel y los archivos initrd, para que se refieran a los archivos recién creados /kernel/vmlinuz-versión_de_kernel y /kernel/initrd-versión de kernel.img. Probablemente también tendrá que actualizar la referencia a la partición raíz. c. En la línea de comandos del kernel, agregue el argumento panic=42, (puede consultar la página del manual bootparam(7) para obtener mayor información). d. Establezca la contraseña del gestor de arranque como redhat con una contraseña en texto sin formato, (si el gestor de arranque ya tiene contraseña, quite el comentario de la línea que especifica la contraseña original). 18 Inicialización del sistema y servicios Guarde sus cambios. 5. Reinicie su máquina. En el menú GRUB, entre la contraseña del gestor de arranque (redhat). Abra la estrofa recién agregada(lab4.2) para editarla. Dentro del editor, agregue el argumento rha=fun a la línea de comandos del kernel, sin cambiar los otros argumentos y por último, inicie su máquina. 6. Una vez iniciado, inicie sesión en su cuenta de Red Hat Academy y califique su ejercicio. Note En algunas máquinas, puede que no se pueda reiniciar la máquina con su nueva configuración, debido al límite de 1024 cilindros de BIOS. Si este es el caso, reinicie su máquina con la estrofa original (¿no la modificó, no es cierto?). Repita el Laboratorio pero en lugar de copiar su kernel e initrd al directorio /lab4.2, cópielos al directorio /boot/lab4.2 y edite su estrofa lab4.2 en el archivo grub.conf. Resultados Question 1 1. Un archivo del sistema de archivos /proc/cmdline que reporte los argumentos panic=42 y rha=fun. 2. Un archivo /boot/grub/grub.conf, que contenga una estrofa para un elemento del menú titulado lab4.2. El elemento del menú debería hacer referencia al sitio del nuevo kernel e initrd y especificar un argumento de línea de comandos de kernel panic=42, pero no un argumento de línea de comandos de kernel rha=fun. Capítulo 3 /sbin/init y Run Levels Conceptos clave • • • • • • El primer proceso iniciado por el kernel es /sbin/init El comando init se ejecuta, mientras se ejecute el sistema y está encargado de iniciar y detener otros procesos. El comando init organiza el estado de ejecución de procesos con un concepto llamado niveles de ejecución. El comando init utiliza el archivo de configuración /etc/inittab para determinar qué procesos deberían ejecutarse en qué niveles de ejecución. Los comandos init y telinit se pueden utilizar para cambiar niveles de ejecución o forzar init a releer su archivo de configuración. Los comandos shutdown, reboot, halt y poweroff sirven para detener o reiniciar la máquina. 19 Inicialización del sistema y servicios /sbin/init El nombre del primer proceso para iniciar está fijado al kernel de Linux: /sbin/init. Este comando es ejecutado directamente por el kernel en el inicio y por lo tanto siempre tiene un Id de proceso 1. El programa init está diseñado para ejecutarse mientras se ejecuta el sistema y es el último proceso que muere. Para asegurarse que el proceso no termine accidentalmente, el Id 1 del proceso está protegido contra la señal letal SIGKILL (señal número 9). El proceso init emplea su tiempo, iniciando, deteniéndose y monitorizando otros procesos. Lo primero que init hace es leer su archivo de configuración, el archivo /etc/inittab. Se le recomienda ver el archivo mientras lee esta explicación, pero tenga cuidado de no modificarlo accidentalmente: Es un archivo de configuración clave y si se daña no se podría arrancar su sistema. Niveles de ejecución A continuación, extraemos y explicamos varias líneas del archivo /etc/inittab. Comenzamos por examinar el comentario en la parte superior del archivo y la primera línea de configuración pertinente. # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <[email protected]> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: En los comentarios al comienzo del archivo, vemos que init organiza una máquina Linux mediante un concepto llamado en inglés runlevels (niveles de ejecución). Los niveles de ejecución tradicionalmente se nombran con números enteros de 0 a 6. En muchas versiones de Unix, los números enteros implican una secuencia (i.e., para iniciar en nivel de ejecución 5, debe pasar por los niveles de ejecución de 1 a 4). Esto no sucede en Linux; los niveles de ejecución pudieron haberse llamado algo tan fácil como "anaranjado", "azul" y "verde". 20 Inicialización del sistema y servicios Por tradición Unix asocia las siguientes configuraciones con varios niveles de ejecución y Linux se adhiere a dicha convención. Table 1. Convenciones de los niveles de ejecución Nivel de ejecución Uso Comentarios Halt Una utilidad de nivel de ejecución utilizada para detener la máquina. Modo monousuario Un nivel de ejecución de mantenimiento conocido como un Modo monousuario. Cuando se está en nivel de ejecución 1, solo root puede iniciar en la máquina y debe iniciar en la consola. Las conexiones de red por lo general no están activas y la mayoría de los demonios (si no todos) están apagados. Este nivel de ejecución está diseñado para realizar operaciones de mantenimiento, tales como montar y desmontar particiones sin interferencias inesperadas. No NFS En Unix tradicional, el nivel de ejecución 2 era de modo multiusuario sin red (recuerde que en un comienzo, Unix era esencialmente un servidor de terminal.) La mayoría de Unix modernos utilizan el nivel de ejecución 2 para de alguna manera calificar la extensión de red. En Red Hat Enterprise Linux, el nivel de ejecución 2 implica modo multiusuario de red, pero sin ningún sistema de archivos NFS relacionado. 3 Multiusuario total El nivel de ejecución 3 es un modo operativo total de red y multiusuarios, pero no se inicia ninguna interfaz gráfica (servidor X). En muchas máquinas utilizadas como servidores de red, este es el nivel de ejecución predeterminado. 4 El nivel de ejecución 4 suele no tener implicaciones y se Configuración deja para que los sitios lo utilicen en la implementación de local políticas locales. 5 Multiusuario con X El nivel de ejecución 5 tiene todas las implicaciones del nivel de ejecución 3, más el mantenimiento continuo de un servidor X. 6 reboot Una utilidad de nivel de ejecución utilizada para reiniciar la máquina. 0 1 2 La última línea en el listado anterior establece el nivel de ejecución predeterminado para la máquina, si no se especifica ninguno. Para la mayoría de las máquinas, el nivel de ejecución sería el nivel de ejecución 3 o 5. Sintaxis /etc/inittab 21 Inicialización del sistema y servicios Cuando trate de aprender la sintaxis del archivo /etc/inittab, la primera línea (que establece el nivel de ejecución por defecto) no es útil; no sigue la sintaxis. Todas las demás líneas que constan de 4 campos separados por dos puntos sirven para las siguientes funciones. Table 1. Sintaxis /etc/inittab Campo Uso 1 Una etiqueta de sólo dos letras, aparte la etiqueta debe ser única. La etiqueta que init utiliza para mantener todas sus líneas rectas. 2 Una lista de los niveles de ejecución para los cuales es importante la línea. 4 El nombre del comando a ejecutar. 3 El tercer campo es el más interesante. Consiste de un acción predefinido, el cual dice a init cómo o cuándo ejecutar el comando especificado en el cuarto campo. El tercer campo se debe seleccionar de una selección de acciones predefinidas. Algunas de las acciones más comunes y su uso se listan a continuación. Table 2. Acciones utilizadas en el archivo /etc/inittab acción uso respawn init inicia y monitoriza el comando especificado. Si el comando alguna vez muere, inicia otro para remplazarlo. wait init inicia el proceso cuando entra a un nivel de ejecución pertinente y espera que el proceso termine antes de llevar a cabo todo lo demás. ctrlaltdel init ejecutará el comando asociado cuando alguien tecleeCONTROLALT-SUPR en el teclado de la consola. powerfail (y amigos) init iniciará comandos en respuesta a recibir señales para una UPS (suministro de alimentación ininterrumpible) agregada. /etc/inittab Configuración de inicialización del sistema y administración del nivel de ejecución Con la sintaxis de reserva, pasamos por el resto del archivo /etc/inittab, agregando comentarios cuando se ameriten. # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc l1:1:wait:/etc/rc.d/rc l2:2:wait:/etc/rc.d/rc l3:3:wait:/etc/rc.d/rc l4:4:wait:/etc/rc.d/rc 0 1 2 3 4 22 Inicialización del sistema y servicios l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 Tras el inicio del sistema, se ejecuta el script /etc/rc.d/rc.sysinit. El script se estudiará en detalle más adelante, donde descubriremos que el script de inicialización es la clave para realizar muchas de las inicializaciones del sistema. Después de cada cambio de nivel de ejecución (incluyendo el arranque en el nivel de ejecución inicial predeterminado), el script /etc/rc.d/rc se ejecuta con el nivel de ejecución apropiado como su único argumento. Este script realiza todo el trabajo difícil cuando el sistema pasa de un nivel de ejecución a otro, este será el tema de la próxima lección. Configuración para eventos externos /etc/inittab # Things to run in every runlevel. ud::once:/sbin/update # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Canceled" Los próximos líneas asocian comandos con varios eventos externos, tales como un usuario tecleando CONTROL-ALT-SUPR en la consola o una UPS registrando una falla de energía. La mayoría de estas variantes del comando shutdown se tratan en detalle a continuación (aunque la intención del comando debería ser obvia). /sbin/init y Gettys # Run gettys in standard runlevels 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 Otro uso tradicional del proceso init es el lanzamiento, monitorización y relanzamiento de gettys. En Linux (y Unix), un getty (llamado por "get tty") (obtener tty) es un proceso que monitoriza una línea serial. Siempre que escucha un "ruido" en la línea (tal como cuando alguien teclea ENTER varias veces), escribe una aviso en la línea, y espera de vuelta un nombre de usuario. Cuando recibe el 23 Inicialización del sistema y servicios nombre de usuario, éste ejecuta el comando login para continuar el proceso de inicio de sesión. Cuando un usuario sale, el proceso de inicio (el cual es un proceso getty) muere e init regenera un nuevo getty para ocupar su lugar. Un getty se debe lanzar para monitorizar cada línea serial en que los usuarios puedan iniciar sesión. Las líneas de configuración anteriores lanzan un mingetty para cada una de las primeras 6 consolas virtuales. ¿Por qué Linux suele tener seis consolas virtuales en las que los usuarios pueden iniciar sesión? Porque init genera seis gettys. Si un administrador quisiera proporcionar más consolas virtuales, se podrían añadir o suprimir más líneas. Igualmente si una terminal estuviera conectada al puerto serial de una máquina, los usuarios podrían utilizar la terminal hasta que una getty fuera conectada a la línea serial. Si se agrega la siguiente línea al archivo /etc/inittab, resolverá el problema para el primer puerto serial. s0:2345:respawn:/sbin/mingetty ttyS0 Por último, la última línea es lo que distingue principalmente al nivel de ejecución 3 del nivel de ejecución 5. En el nivel de ejecución 5, init de modo consistente regenera el script /etc/X11/prefdm, el cual comienza por el "gestor de pantalla preferido", i.e., el servidor X el cual le permite al usuario iniciar en la máquina mediante una interfaz gráfica. # Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon Como un ejemplo tangible de la capacidad de init para regenerar procesos, vaya a una máquina que esté en pantalla gráfica de inicio y utilice la combinación de teclas CONTROL-ALT-RETROCESO para matar el servidor gráfico X. Después de una corta pausa, init generará un nuevo servidor X para ocupar su lugar. Manejo de Init Observar los niveles de ejecución con runlevel El comando runlevel se puede utilizar para observar el nivel de ejecución actual de la máquina. [root@station root]# runlevel N 5 La salida no es tan simple como parecía porque se dan dos valores. El último es el nivel de ejecución actual, el primero es el nivel de ejecución anterior o “N” para una máquina recién iniciada. La salida anterior corresponde a una máquina recién iniciada en el nivel de ejecución 5. Cambio de niveles de ejecución con init o telinit 24 Inicialización del sistema y servicios A init se le puede pedir que cambie los niveles de ejecución al invocarlo con el nivel de ejecución deseado como único argumento. [root@station root]# init 3 El cambio de niveles de ejecución tiende a ser violento. Los procesos mueren, sacan los usuarios de la máquina. En máquinas de multiusuarios, los administradores tratan de programar cambios en el nivel de ejecución (por ejemplo pasar a modo monousuario para realizar tareas de mantenimiento) con el fin de no tomar por sorpresa a los usuarios. En algunas versiones de Unix, el proceso init no está diseñado para uso reentrante y se utiliza un segundo comando telinit para cambiar los niveles de ejecución. En Linux, tanto init como telinit sirven para cambiar los niveles de ejecución. Solicitar init para releer /etc/inittab Aunque el proceso init lee su archivo de configuración en el inicio, una vez leído ya no se monitoriza más. Si se le hacen modificaciones al archivo se le puede pedir al proceso init que relea el archivo y aplique los cambios con el comando init q. Apagar la máquina con shutdown Lo cierto de cualquier sistema operativo multitareas es que hay formas correctas e incorrectas de apagar una máquina Linux. Las formas incorrectas incluyen desconectar el cable de alimentación. A continuación trataremos las formas correctas. En principio, una máquina de Linux se apaga al cambiar a nivel de ejecución 0 (por razones que veremos en la próxima lección). Por lo tanto, el comando init se puede utilizar para iniciar un apagado instantáneo de una máquina. [root@station root]# init 0 Por lo general. los administradores prefieren utilizar un comando llamado shutdown o una de sus variantes. El comando shutdown tiene dos ventajas. Primero, el apagado se puede programar para que ocurra a una hora determinada. Segundo, se anuncia el apagado a las terminales de todos los usuarios conectados y con esto se les da la oportunidad de cerrar su trabajo y salir. El comando shutdown utiliza la siguiente sintaxis. /sbin/shutdown [-hprc] time [warning-message] Table 1. Opciones del comando shutdown Opción Efecto 25 Inicialización del sistema y servicios Opción Efecto -h Detener la máquina -p Después de detener la máquina, apáguela. -r Reiniciar la máquina -c Cancelar un apagado pendiente El comando shutdown suele llamarse con las opciones -h, -p, o -r, para que la máquina se detenga, se apague o reinicie, respectivamente. Si no se especifica ninguna de los tres, shutdown lleva la máquina al nivel de ejecución 1. La opción -c se puede utilizar para cancelar un apagado pendiente. El argumento de tiempo obligatorio se puede especificar de tres maneras. Table 2. Especificar tiempos para el comando shutdown Sintaxis Interpretación hh:mm Un tiempo absoluto cuando el apagado debe ocurrir, en horas y minutos. +n Un tiempo relativo cuando el apagado debe ocurrir en n minutos. ahora Un sinónimo para + 0. También existen unos atajos poco conocidos para el comando shutdown que presentamos a continuación. Table 3. Atajos para el comando shutdown Atajo halt Comando equivalente shutdown -h now poweroff shutdown -p now reboot shutdown -r now El script /etc/rc.d/rc.sysinit Tras el arranque, el kernel inicia el proceso /sbin/init. El comando init examina el archivo /etc/inittab, donde encuentra lo siguiente como su primera línea relevante. si::sysinit:/etc/rc.d/rc.sysinit Traduciendo esta línea dice init "en el inicio, sólo en el inicio, ejecute el script /etc/rc.d/rc.sysinit". Ahora veremos el script de inicio en detalle. El script rc.sysinit es un complicado script de shell bash, el cual realiza una gran cantidad de tareas. No podremos dar cada detalle del script, pero extraemos algunas partes importantes o puntos interesantes con comentarios. 26 Inicialización del sistema y servicios No piense que necesita recordar todos los detalles o todo lo que se presenta. Se puede excusar a quien trate de pasar por alto extractos de código bash como muchos harían con ecuaciones de física. Sin embargo, mientras lee los comentarios debería realizar una lista en su mente de las acciones que un script realiza cada vez que el sistema arranca. Para el interesado en saber más, también podría componer un segundo listado de los trucos de programación de la shell bash. Antes de empezar, recordemos el estado de la máquina. El kernel ha sido iniciado, se ha montado la partición raíz de solo lectura y se ha iniciado init, el cual a su vez inició este script. Cuando se ejecuta este script, ¿cuántos procesos se están ejecutando en la máquina? Dos. ¿A qué se parece el sistema de archivos? Sólo la partición raíz está montada y está montada de sólo lectura. #!/bin/bash # # /etc/rc.d/rc.sysinit - run once at boot time # ... HOSTNAME=`/bin/hostname` if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network else NETWORKING=no fi if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then HOSTNAME=localhost fi # Mount /proc (done here so volume labels can work with fsck) action $"Mounting proc filesystem: " mount -n -t proc /proc /proc ... El script comienza por examinar /etc/sysconfig/network para determinar un nombre de host para el sistema. Luego, en el proceso de inicio, el sistema de archivos proc se monta en el directorio /proc. ... # Print a text banner. echo -en $"\t\tWelcome to " if LC_ALL=C grep -q "Red Hat" /etc/redhat-release ; then [ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m" echo -en "Red Hat" [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m" PRODUCT=`sed "s/Red Hat \(.*\) release.*/\1/" /etc/redhat-release` echo " $PRODUCT" else PRODUCT=`sed "s/ release.*//g" /etc/redhat-release` echo "$PRODUCT" fi if [ "$PROMPT" != "no" ]; then echo -en $"\t\tPress 'I' to enter interactive startup." 27 Inicialización del sistema y servicios echo fi Luego, el script hace un gran esfuerzo examinando el archivo /etc/redhatrelease para decidir a qué llamar en el mensaje de bienvenida que muestra. # Set the system clock. update_boot_stage RCclock ARC=0 SRM=0 UTC=0 if [ -f /etc/sysconfig/clock ]; then . /etc/sysconfig/clock # convert old style clock config to new values if [ "${CLOCKMODE}" = "GMT" ]; then UTC=true elif [ "${CLOCKMODE}" = "ARC" ]; then ARC=true fi fi CLOCKDEF="" CLOCKFLAGS="$CLOCKFLAGS --hctosys" ... /sbin/hwclock $CLOCKFLAGS action $"Setting clock $CLOCKDEF: `date`" date Un gran esfuerzo en determinar cómo hacerlo, pero el tiempo del sistema finalmente se inicializa desde BIOS con el comando /sbin/hwclock. Luego, evitamos muchas líneas de inicialización del módulo del kernel de USB y las retomamos aquí. ... _RUN_QUOTACHECK=0 ROOTFSTYPE=`awk '/ \/ / && ($3 !~ /rootfs/) { print $3 }' /proc/mounts` if [ -z "$fastboot" -a "X$ROOTFSTYPE" != "Xnfs" ]; then STRING=$"Checking root filesystem" echo $STRING initlog -c "fsck -T -a $fsckoptions /" rc=$? if [ "$rc" = "0" ]; then success "$STRING" echo elif [ "$rc" = "1" ]; then passed "$STRING" echo 28 Inicialización del sistema y servicios fi # A return of 2 or higher means there were serious problems. if [ $rc -gt 1 ]; then if [ "$BOOTUP" = "graphical" ]; then chvt 1 fi failure "$STRING" echo echo echo $"*** An error occurred during the file system check." echo $"*** Dropping you to a shell; the system will reboot" echo $"*** when you leave the shell." str=$"(Repair filesystem)" PS1="$str \# # "; export PS1 sulogin echo $"Unmounting file systems" umount -a mount -n -o remount,ro / echo $"Automatic reboot in progress." reboot -f elif [ "$rc" = "1" ]; then _RUN_QUOTACHECK=1 fi fi Alrededor de la octava línea se encuentra la línea importante: initlog -c "fsck T -a $fsckoptions /", o reduciéndola a su esencia fsck /. Ahora entendemos la razón por la cual el kernel montó la partición raíz de sólo lectura. Un sistema de archivos montado de sólo lectura se puede ejecutar con fsck y se puede reparar, pero si es un sistema de archivos montado de lectura y escritura entonces no se puede reparar. El montaje de sólo lectura del kernel permite realizar el primer chequeo de la partición raíz. Si se presentan problemas, se envía al usuario a una shell de rescate. ... # Remount the root filesystem read-write. update_boot_stage RCmountfs state=`awk '/ \/ / && ($3 !~ /rootfs/) { print $4 }' /proc/mounts` [ "$state" != "rw" ] && \ action $"Remounting root filesystem in read-write mode: " mount n -o remount,rw / Ahora que se ha ejecutado fsck, la partición raíz se puede volver a montar como de lectura y escritura con mount -o remount,rw /. # LVM initialization if [ -f /etc/lvmtab -a ! -e /proc/lvm ] ; then 29 Inicialización del sistema y servicios modprobe lvm-mod >/dev/null 2>&1 fi if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ]; then action $"Setting up Logical Volume Management:" /sbin/vgscan && /sbin/vgchange -a y fi # Start up swapping. update_boot_stage RCswap action $"Activating swap partitions: " swapon -a -e Si se está utilizando la administración de un volumen lógico, la puede iniciar en este momento. También active cualquier partición swap. Luego evite varias líneas iniciando módulos de kernel y activando el RAID de software, si lo está utilizando. Al reanudar, recuerde el estado actual del sistema de archivos. Ahora la partición raíz se monta de lectura y escritura, pero aún es la única partición montada. ... _RUN_QUOTACHECK=0 # Check filesystems if [ -z "$fastboot" ]; then STRING=$"Checking filesystems" echo $STRING initlog -c "fsck -T -R -A -a $fsckoptions" rc=$? if [ "$rc" = "0" ]; then success "$STRING" echo elif [ "$rc" = "1" ]; then passed "$STRING" echo fi # A return of 2 or higher means there were serious problems. if [ $rc -gt 1 ]; then if [ "$BOOTUP" = "graphical" ]; then chvt 1 fi failure "$STRING" echo echo echo $"*** An error occurred during the file system check." echo $"*** Dropping you to a shell; the system will reboot" echo $"*** when you leave the shell." str=$"(Repair filesystem)" PS1="$str \# # "; export PS1 sulogin echo $"Unmounting file systems" umount -a mount -n -o remount,ro / 30 Inicialización del sistema y servicios echo $"Automatic reboot in progress." reboot -f elif [ "$rc" = "1" -a -x /sbin/quotacheck ]; then _RUN_QUOTACHECK=1 fi fi De nuevo, la línea importante se presenta alrededor de la octava línea en initlog c "fsck -T -R -A -a $fsckoptions" , o, reduce, fsck -A. Todos los sistemas de archivos restantes (desmontados) se están comprobando. El resto de la estrofa lleva al sistema a una shell de rescate si se presentan problemas mayores. # Mount all other filesystems (except for NFS and /proc, which is already # mounted). Contrary to standard usage, # filesystems are NOT unmounted in single user mode. action $"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O no_netdev Ahora que el resto de sistemas de archivos han sido ejecutados con fsck, se ejecuta el comando importante mount -a. Los sistemas de archivos de red tales como NFS y SMB, no se montan en este momento. En este punto, todo el sistema de archivos debe estar en su lugar. Recordemos qué procesos se están ejecutando en la máquina: init, este script y cualquier proceso que este script haya iniciado. En otras palabras, no muchos. ... # Clean out /. rm -f /fastboot /fsckoptions /forcefsck /.autofsck /halt /poweroff ... # Clean up /var. I'd use find, but /usr may not be mounted. for afile in /var/lock/* /var/run/* ; do if [ -d "$afile" ]; then case "$afile" in */news|*/mon) ;; */sudo|*/vmware) rm -f $afile/*/* ;; *) rm -f $afile/* ;; esac else rm -f $afile fi done rm -f /var/lib/rpm/__db* # Reset pam_console permissions [ -x /sbin/pam_console_apply ] && /sbin/pam_console_apply -r ... 31 Inicialización del sistema y servicios Todas estas líneas están limpiando el sistema de archivos de los variados archivos PID dejados por demonios y archivos de bloqueo y sockets de varias aplicaciones desde el arranque anterior. También se restablecen, las propiedades y permisos para dispositivos que podrían aún ser reclamados por un usuario de una consola no existente. ... # Now turn on swap in case we swap to files. swapon -a action $"Enabling swap space: " /bin/true Es interesante que el espacio swap se reactiva otra vez. Es necesari, porque el sistema podría estar utilizando un archivo de intercambio contenido en algún lugar diferente al de la partición raíz. Ahora pasamos por alto una gran cantidad de configuración miscelania y terminamos con lo siguiente. ... # Now that we have all of our basic modules loaded and the kernel going, # let's dump the syslog ring somewhere so we can find it later dmesg -s 131072 > /var/log/dmesg ... Recordemos que el archivo /var/log/dmesg contiene una copia de mensajes del kernel grabada pronto después del arranque más reciente. Aquí es donde se crea el archivo. Resumiendo, hallamos que el script rc.sysinit hace un montón de cosas (omitimos cerca de la mitad), pero aquí está lo más importante. En la entrada, el sistema de archivos consta de sólo la partición raíz, montada como de sólo lectura. En la salida, el sistema de archivos se revisa todo, se monta y limpia, listo para utilizarlo. Ahora el proceso de arranque continúa con el nivel de ejecución específico, el cual es el tema de la siguiente lección. Ejemplos Personalizar CONTROLALTSUPR para un portátil. Un propietario de un computador portátil se dio cuenta que pocas veces necesitaba reiniciar su portátil, pero en cambio con frecuencia estaba apagándolo para guardarlo y llevarlo con él. Modificó su archivo /etc/inittab para personalizar la conducta de la secuencia de teclas CONTROL-ALT-SUPR. El extracto a continuación muestra la línea original y la línea modificada. #ca::ctrlaltdel:/sbin/shutdown -t3 -r now ca::ctrlaltdel:/sbin/poweroff 32 Inicialización del sistema y servicios Ejercicios en línea Lab Exercise Objetivo: Administrar el proceso init con el archivo /etc/inittab. Tiempo estimado: 20 minutos. Specification 1. Como precaución, haga una copia de seguridad de su archivo /etc/inittab en el archivo /etc/inittab.prelab4. 2. Realice los siguientes cambios en su archivo /etc/inittab. En ningún caso deberían cambiar el primer campo de dos letras de una línea. a. Quite el comentario de las líneas que regeneren gettys para las consolas virtuales número cinco y seis. b. Duplique la línea que conecta un comando con la secuencia de teclas CONTROL-ALT-SUPR. Quite el comentario de la línea original, edite la nueva copia para que en lugar de reiniciar la máquina, la secuencia de teclas CONTROL-ALT-SUPR ejecute con echo el mensaje en inglés Three finger salute disabled, (este cambio sólo puede observarse desde la consola virtual cuando el servidor X bloquea la secuencia de teclas CONTROL-ALT-SUPR.) c. Modifique la línea que regenera el gestor de pantalla gráfico de tal modo que el gestor de pantalla sea regenerado tanto en el nivel de ejecución 4 como en el 5. d. Cambie su nivel de ejecución al nivel de ejecución 3 (si no lo ha hecho todavía). 3. Cuando termine, reinicie su máquina. Después de reiniciar, su máquina debe entrar al nivel de ejecución 3. 4. Inicie sesión desde la primera consola virtual. Utilice el comando init para cambiar de modo manual desde el nivel de ejecución 3 al 4. 5. En el nivel de ejecución 4, el gestor de pantalla gráfico (pantalla de inicio de sesión) se debe iniciar con init. Inicie sesión con la cuenta de Red Hat Academy y califique el ejercicio. Resultados Limpieza Después de haber completado el ejercicio, restaure su archivo original /etc/inittab colocando /etc/inittab.prelab4 de nuevo en su lugar como /etc/inittab y de modo manual cambie al nivel de ejecución 5, o reinicie su máquina. Question 1 1. Ningun proceso (en particular el de mingetty) se debe conectar a las terminales 33 Inicialización del sistema y servicios /dev/tty5 o /dev/tty6. 2. El comando runlevel debe revelar el nivel de ejecución actual como nivel de ejecución 4 y el nivel de ejecución anterior como nivel de ejecución 3. 3. El archivo /etc/inittab debe establecer el nivel de ejecución predeterminado a 3. 4. El proceso init debe regenerar el administrador de pantalla para los niveles de ejecución 4 y 5. 5. Desde dentro de una consola virtual, la secuencia de teclas CONTROL-ALTSUPR debe echo la frase Three finger salute disabled, pero sin reiniciar la máquina. Capítulo 4 Scripts de servicios de Red Hat Enterprise Linux Conceptos clave • • • Los scripts de servicios de Red Hat Enterprise Linux que se encuentran en el directorio /etc/rc.d/init.d. Los servicios se pueden iniciar o detener mediante el comando service. La configuración del nivel de ejecución predeterminado para servicios se puede realizar con el comando chkconfig. El directorio /etc/rc.d Mientras continuamos nuestra explicación sobre El arranque de máquinas Linux que comenzamos en lecciones anteriores, el kernel ha iniciado el proceso init, el cual a su vez ha ejecutado el script /etc/rc.d/rc.sysinit. Después de salir de este script, el sistema de archivos de la máquina se ha ensamblado. El proceso init continúa examinando el archivo /etc/inittab desde donde quedó. ... # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc l1:1:wait:/etc/rc.d/rc l2:2:wait:/etc/rc.d/rc l3:3:wait:/etc/rc.d/rc l4:4:wait:/etc/rc.d/rc l5:5:wait:/etc/rc.d/rc l6:6:wait:/etc/rc.d/rc 0 1 2 3 4 5 6 ... Observando con mucha atención el segundo campo, init sólo ejecuta una de las siguientes líneas /etc/rc.d/rc, una para el nivel de ejecución en el que el sistema está arrancando (probablemente 3 o 5). En cualquier caso, cada línea tiene el mismo efecto; se llama el script /etc/rc.d/rc con el nivel de ejecución apropiado como un argumento. 34 Inicialización del sistema y servicios No analizaremos el script rc directamente, pero describiremos lo que hace. Primero examinamos el diseño del directorio /etc/rc.d. [root@station rc.d]$ ls -F /etc/rc.d/ init.d/ rc0.d/ rc2.d/ rc4.d/ rc6.d/ rc* rc1.d/ rc3.d/ rc5.d/ rc.local* rc.sysinit* Haciendo un inventario rápido, vemos tres secuencias de comandos de scripts, varios directorios aparentemente llamados según los niveles de ejecución y un directorio init.d. Con el riesgo de ir más adelante de nosotros mismos, presentamos un resumen del contenido del directorio: Table 1. Contenido del directorio /etc/rc.d Archivo Tipo rc.sysinit script Propósito sistema de inicialización en el arranque rc.local script Personalización local de inicialización del sistema en el arranque rc script realiza cambios en nivel de ejecución init.d directorio contiene scripts de servicios de Red Hat Enterprise Linux rcn.d directorio contiene enlaces simbólicos que implementan la configuración del estado de servicios para el nivel de ejecución n. Al observar uno de los directorios de nivel de ejecución, hallamos lo siguiente. [root@station rc.d]$ ls -F /etc/rc.d/rc3.d/ K05saslauthd@ K40smartd@ S00microcode_ctl@ S80sendmail@ K10psacct@ K45named@ S05kudzu@ S85gpm@ K15dc_client@ K50netdump@ S08arptables_jf@ S90crond@ K15dc_server@ K50snmpd@ S08ip6tables@ S90xfs@ K15httpd@ K50snmptrapd@ S08iptables@ S95atd@ K20nfs@ K50tux@ S09isdn@ S97rhnsd@ K24irda@ K70aep1000@ S10network@ S99local@ K25squid@ K70bcm5820@ S12syslog@ S99mdmonitor@ K35smb@ K73ypbind@ S13irqbalance@ S99mdmpd@ K35vncserver@ K74nscd@ S13portmap@ K35winbind@ K74ntpd@ S14nfslock@ S17keytable@ S20random@ S24pcmcia@ S25netfs@ S26apmd@ S28autofs@ S55cups@ S55sshd@ S56rawdevices@ S56xinetd@ S59hpoj@ Como lo implica la representación proporcionada por la opción -F (o el color azul claro de las entradas en la terminal), el directorio no está lleno de archivos regulares, sino de 35 Inicialización del sistema y servicios enlaces simbólicos. Si pedimos que apunte a los enlaces simbólicos, hallamos lo siguiente. [root@station rc.d]$ ls -lF /etc/rc.d/rc3.d/ total 0 lrwxr-xr-x 1 root root 19 Dec 27 12:07 K05saslauthd -> ../init.d/saslauthd* lrwxr-xr-x 1 root root 16 Dec 27 12:08 K10psacct -> ../init.d/psacct* lrwxr-xr-x 1 root root 19 Dec 27 16:12 K15dc_client -> ../init.d/dc_client* lrwxr-xr-x 1 root root 19 Dec 27 16:12 K15dc_server -> ../init.d/dc_server* lrwxr-xr-x 1 root root 15 Dec 27 16:12 K15httpd -> ../init.d/httpd* lrwxr-xr-x 1 root root 13 Dec 27 12:08 K20nfs -> ../init.d/nfs* ... Cada enlace simbólico parece referirse a un script en el directorio /etc/rc.d/init.d. Al dar una mirada rápida a los directorios específicos de nivel de ejecución, hallamos lo mismo. Parece que hemos descubierto un directorio importante: /etc/rc.d/init.d. Los scripts de servicios y el directorio /etc/rc.d/init.d El directorio /etc/rc.d/init.d tiene una función especial en Red Hat Enterprise Linux y debería ser parte del vocabulario de trabajo de cualquier administrador de Red Hat Enterprise Linux . El directorio contiene exclusivamente scripts que comparten una interfaz similar. [root@station [root@station aep1000 apmd arptables_jf atd vncserver autofs bcm5820 crond cups dc_client dc_server [root@station Usage: ./sshd init.d]$ cd init.d]$ ls firstboot functions gpm halt /etc/rc.d/init.d/ isdn kdcrotate keytable killall netfs network nfs nfslock rawdevices rhnsd saslauthd sendmail hpoj kudzu nscd single httpd mdmonitor ntpd smartd ip6tables mdmpd pcmcia smb iptables microcode_ctl portmap snmpd irda named psacct snmptrapd irqbalance netdump random squid init.d]$ ./sshd {start|stop|restart|reload|condrestart|status} sshd syslog tux winbind xfs xinetd ypbind Cada script espera ser llamado con un sólo argumento, principalmente start, stop, restart, reload o status. Estos scripts se conocen como scripts de servicios y la mayoría manipulan directamente un demonio, el cual realiza un servicio particular. A manera de ejemplo, el script de servicios /etc/rc.d/init.d/sshd administra el demonio /usr/sbin/sshd, el cual es el servidor para el servicio de red de Secure Shell. 36 Inicialización del sistema y servicios Si queremos saber si el servicio está en ejecución entonces preguntamos por su status. [root@station init.d]$ ./sshd status sshd (pid 4992) is running... Hallamos que el demonio está despierto y en ejecución. Claro está que pudimos haber mirado directamente con el comando ps. [root@station init.d]$ ps aux | grep sshd root 4992 0.0 0.1 3444 1480 ? /usr/sbin/sshd root 5690 0.0 0.0 3576 636 pts/2 sshd S 05:05 0:00 S 05:52 0:00 grep Si queremos detener el servicio, le pedimos al script de servicios que pare con stop. [root@station init.d]$ ./sshd stop Stopping sshd: [root@station init.d]$ ./sshd status sshd is stopped [root@station init.d]$ ps aux | grep sshd root 5717 0.0 0.0 3580 640 pts/2 sshd [ S 05:52 OK ] 0:00 grep a iniciar el demonio. Como el script nos pidió y como confirmamos dos veces a través de dos técnicas diferentes, el demonio sshd está muerto. No debería ser difícil determinar cómo volver [root@station init.d]$ ./sshd start Starting sshd: [root@station init.d]$ ./sshd status sshd (pid 5729) is running... [ OK ] El demonio sshd está otra vez ejecutándose, naturalmente con un Id de proceso diferente. ¿Qué hace un restart? [root@station init.d]$ ./sshd restart Stopping sshd: Starting sshd: [root@station init.d]$ ./sshd status sshd (pid 5763) is running... [ [ OK OK ] ] Un stop, seguido por un start. ¿Qué hace un reload? Para ilustrar de una forma más directa, volvemos a cargar el demonio crond en lugar de sshd. [root@station init.d]$ ./crond status crond (pid 5999) is running... [root@station init.d]$ ./crond reload Reloading cron daemon configuration: [root@station init.d]$ ./crond status crond (pid 5999) is running... [ OK ] 37 Inicialización del sistema y servicios A diferencia de un restart, un reload es una acción sencilla y el mismo proceso suele ejecutarse después de un reload como lo era antes (observe que el Id del proceso crond es idéntico). Muchos demonios Linux (y Unix) anulan el numero de señal 1 (SIGHUP) y lo utilizan como signo para releer e implementar cambios hechos a los archivos de configuración. En otras palabras, se pueden reinicializar muchos demonios entregándoles un número de señal 1. En los viejos tiempos se referían a esto como rehupping un demonio. Aunque un restart literalmente detiene y luego inicia un demonio, un reload normalmente lo reinicia. No obstante, le advertimos acerca de los scripts de servicios que se están ejecutando desde el directorio /etc/rc.d/init.d. A continuación, observe la diferencia en los dos últimos comandos. [root@station root]$ cd /etc/rc.d/init.d/ [root@station init.d]$ ./sshd status sshd (pid 5864) is running... [root@station init.d]$ sshd status Extra argument status. ¿Por qué aparentemente el mismo comando produjo dos salidas diferentes? ¿Qué archivo se ejecutó en realidad en el último caso? . Los scripts de servicios de Red Hat Enterprise Linux proporcionan un mecanismo fácil y conveniente para la administración de demonios. Después de un tiempo, /etc/rc.d/init.d/... tiende a facilitar la tarea de un administrador de Red Hat Enterprise Linux. ¿Quiere iniciar el servidor de red? /etc/rc.d/init.d/httpd start. ¿Quiere que el demonio sshd relea su archivo de configuración? /etc/rc.d/init.d/sshd reload. ¿Quiere matar al demonio ftp? Usted entiende. Sin embargo, hay una forma aún más fácil... Los servicios y el comando service Debido a que los administradores suelen estar ejecutando scripts desde el directorio /etc/rc.d/init.d, se creó un atajo llamado service. El comando service espera como su primer argumento el nombre de un servicio de Red Hat Enterprise Linux y como segundo argumento un comando de una palabra tal como start, stop, etc. servicio service_name comando ¿Qué es un servicio de Red Hat Enterprise Linux? Cualquier componente del sistema administrado por un script de servicios en el directorio /etc/rc.d/init.d. Las siguientes dos líneas de comandos son exactamente iguales. service service_name start /etc/rc.d/init.d/service_name start La mayoría de los servicios tienen demonios asociados a ellos. Por ejemplo, hay un servicio llamado network. 38 Inicialización del sistema y servicios [root@station root]$ iniciar servicio de red Shutting down interface eth0: Shutting down interface eth1: Shutting down loopback interface: Disabling IPv4 packet forwarding: Setting network parameters: Bringing up loopback interface: Bringing up interface eth0: Bringing up interface eth1: [ [ [ [ [ [ [ [ OK OK OK OK OK OK OK OK ] ] ] ] ] ] ] ] Como el nombre lo implica, los componentes de red del sistema se detienen y reinician. Como se describirá más adelante no hay un demonio asociado de red. En cambio, el servicio de red únicamente cambia el estado del kernel. Igualmente, algunos servicios administran más de un demonio de modo colectivo como el caso para los servicios syslog y nfs. [root@station root]$ service nfs status rpc.mountd is stopped nfsd is stopped rpc.rquotad is stopped [root@station root]$ service syslog status syslogd (pid 4423) is running... klogd (pid 4427) is running... Lo que define un servicio no es un demonio determinado, sino la presencia de un script de servicios en el directorio /etc/rc.d/init.d. Muchos servicios administran un demonio, algunos no lo hacen, aunque algunos manejan más de un demonio en conjunto. La administración del sistema de servicios es aún más fácil. ¿Quiere empezar a utilizar el servidor de red? service httpd start. ¿Quiere saber si el servicio de Secure Shell se está ejecutando? service sshd status. Aunque el comando service facilita la vida a los administradores, deberían conocer el directorio /etc/rc.d/init.d y la función que realiza. Por ejemplo, ¿qué sucede si un administrador quiere iniciar el servidor SAMBA? [root@station root]$ service smbd start smbd: unrecognized service Un par de cosas podrían salir mal. 1. El software que implementa el servidor SAMBA no se podría instalar en el sistema. 2. El administrador podría tener incorrecto el nombre del servicio. En cualquier caso, una mirada rápida en el directorio /etc/rc.d/init.d identificará el problema. [root@station root]# ls /etc/rc.d/init.d/s* 39 Inicialización del sistema y servicios /etc/rc.d/init.d/saslauthd /etc/rc.d/init.d/squid /etc/rc.d/init.d/sendmail /etc/rc.d/init.d/sshd /etc/rc.d/init.d/single /etc/rc.d/init.d/syslog /etc/rc.d/init.d/smb /etc/rc.d/init.d/snmpd /etc/rc.d/init.d/snmptrapd En este caso, el administrador se da cuenta de que simplemente ha dado un nombre incorrecto al servicio. [root@station root]# service smb start Starting SMB services: Starting NMB services: [ [ OK OK ] ] (Como una ayuda, los scripts de servicios que administran un demonio único se llaman generalmente por el nombre del demonio, e incluyen la “d” final. Los scripts de servicios que administran múltiples demonios (como es el caso de smb) por lo general, no incluyen la “d” final.) El siguiente cuadro resume los comandos que deberían ser soportados por todos los scripts de servicios. Algunos scripts de servicios admiten comandos adicionales específicos para ese servicio. Table 1. Comandos de los scripts de servicios Comando Efecto start Inicia el servicio. stop Detiene el servicio. status Genera un mensaje de estatus del servicio apropiado. Como mínimo, el mensaje reporta si el servicio se está ejecutando y el Id del proceso de todos los demonios asociados. A menudo, el mensaje de estatus también incluye información específica del servicio. restart Primero se detiene y luego inicia el servicio. reload Reinicializa el servicio sin reiniciar, si es necesario. condrestart Si el servicio ya se está ejecutando, lo reinicia, de lo contrario, no hace nada, (este comando es útil con scripts automáticos.) Configuración del servicio de nivel de ejecución y chkconfig Aunque nuestro paseo por el comando service fue importante, éste nos sacó de nuestro tema sobre el proceso de arranque de Red Hat Enterprise Linux, al cual nos gustaría volver. Cuando lo dejamos, estábamos explorando el directorio /etc/rc.d. [root@station root]# ls -F /etc/rc.d/ init.d/ rc0.d/ rc2.d/ rc4.d/ rc6.d/ rc* rc1.d/ rc3.d/ rc5.d/ rc.local* rc.sysinit* rc.sysinit.rpmsave* 40 Inicialización del sistema y servicios En particular, hemos observado que varios subdirectorios específicos del nivel de ejecución contenían de forma meticulosa enlaces simbólicos, los cuales se referían a los scripts de servicios en el directorio /etc/rc.d/init.d. [root@station root]# ls -F /etc/rc.d/rc3.d/ K05saslauthd@ K40smartd@ S00microcode_ctl@ S80sendmail@ K10psacct@ K45named@ S05kudzu@ S85gpm@ K15dc_client@ K50netdump@ S08arptables_jf@ S90crond@ K15dc_server@ K50snmpd@ S08ip6tables@ S90xfs@ K15httpd@ K50snmptrapd@ S08iptables@ S95atd@ K20nfs@ K50tux@ S09isdn@ S97rhnsd@ K24irda@ K70aep1000@ S10network@ S99local@ K25squid@ K70bcm5820@ S12syslog@ S99mdmonitor@ K35smb@ K73ypbind@ S13irqbalance@ S99mdmpd@ K35vncserver@ K74nscd@ S13portmap@ K35winbind@ K74ntpd@ S14nfslock@ S17keytable@ S20random@ S24pcmcia@ S25netfs@ S26apmd@ S28autofs@ S55cups@ S55sshd@ S56rawdevices@ S56xinetd@ S59hpoj@ El nombre de cada enlace simbólico tiene la siguiente forma. Lddservice_name Aquí, L puede ser la letra “K” o la letra “S”, dd es un número de dos dígitos y service_name es el nombre del script de servicios a los cuáles apunta el enlace simbólico. Ahora podemos describir exactamente lo que hace un script /etc/rc.d/rc. Recuerde que cada vez que el sistema cambia niveles de ejecución (incluyendo entrar un nivel de ejecución en el arranque), init llama al script rc, el cual realiza lo siguiente. 1. A excepción del primer arranque, el script rc examina el directorio específico del nivel de ejecución al que se está entrando. Cualquier enlace que inicie “K” (para “matar”), rc comprobará si ese servicio se está ejecutando. Si se está ejecutando, el script de servicios asociado se llama con el argumento stop. 2. El script rc examina de nuevo el nivel de ejecución específico que se ha entrado. Cualquier enlace que inicie “S” (para “Start”), rc comprobará si ese servicio se está ejecutando o no, el script de servicio asociado se llama con el argumento start. Como resultado, una vez que init ha completado el cambio de niveles de ejecución, el estado de todos los servicios debe reflejar el estado de los enlaces simbólicos en el directorio del nivel de ejecución específico. Todos los servicios asociados con enlaces “K” se deben detener y todos los servicios asociados con enlaces “S” se deben iniciar. 41 Inicialización del sistema y servicios ¿Para qué sirven los números? Simplemente dan un orden a los servicios cuando se inician o cuando se detienen, (no sirve de mucho iniciar el servidor de red (httpd) antes de que se haya configurado la red (network)). Al reordenar los enlaces dentro de directorios específicos del nivel de ejecución, los administradores pueden cambiar la configuración predeterminada de su máquina. Por ejemplo, el servicio samba está actualmente inhabilitado por defecto en el nivel de ejecución 3. Un administrador podría hacer que el servicio se inicie por defecto en el nivel de ejecución 3 al escoger de una manera algo arbitraria un número de inicio y mover el enlace simbólico. [root@station root]# cd /etc/rc.d/rc3.d/ [root@station rc3.d]# mv K35smb S95smb Este tipo de alteración de enlaces "a mano" podrían hacer el trabajo, pero hay una forma más elegante con el comando chkconfig. El comando chkconfig existe para ayudar a los administradores a configurar el nivel de ejecución para servicios. Cuando se llama con --list, el comando chkconfig mostrará todos los servicios conocidos y el estado actual de los siete niveles de ejecución. [root@station rc3.d]# chkconfig --list kdcrotate 0:off 1:off 2:off ntpd 0:off 1:off 2:off syslog 0:off 1:off 2:off netfs 0:off 1:off 2:off network 0:off 1:off 2:off random 0:off 1:off 2:off ... 3:off 3:off 3:on 3:off 3:on 3:on 4:off 4:off 4:on 4:off 4:on 4:on 5:off 5:off 5:on 5:off 5:on 5:on 6:off 6:off 6:off 6:off 6:off 6:off (Al final de la lista, chkconfig cambia e indica el estado de los servicios de red controlados xinetd lo cual es un simple encendido o apagado. La configuración de servicios relacionados con xinetd va más allá del objetivo de este curso y estas entradas no se tienen en cuenta). Cuando se llama --list con un argumento, sólo se muestra la configuración del servicio nombrado. [root@station rc3.d]# chkconfig --list smb smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off Cuando se llama con dos argumentos, el primer argumento debe ser el nombre de un servicio y el segundo argumento puede ser on , off o reset. Para los niveles de ejecución 3, 4 y 5, chkconfig actualizará los enlaces simbólicos correctamente. A continuación, el administrador examina primero el estado del enlace pertinente en el directorio /etc/rc.d/rc3.d. Luego, con el comandochkconfig, habilita el servicio smb para niveles de ejecución 3, 4 y 5 y reexamina el estado del enlace. [root@station rc3.d]# pwd 42 Inicialización del sistema y servicios /etc/rc.d/rc3.d [root@station rc3.d]# K35smb [root@station rc3.d]# [root@station rc3.d]# smb 0:off [root@station rc3.d]# S91smb ls *smb* chkconfig smb on chkconfig --list smb 1:off 2:on 3:on ls *smb* 4:on 5:on 6:off El comando chkconfig manejó el "cambio" del enlace simbólico para el administrador. Además, el servicio smb está inhabilitado en la siguiente secuencia. [root@station rc3.d]# chkconfig smb off [root@station rc3.d]# chkconfig --list smb smb 0:off 1:off 2:off 3:off [root@station rc3.d]# ls *smb* K35smb 4:off 5:off 6:off Cada servicio trae consigo su propio concepto de lo que debe ser su estado predeterminado. El servicio de red, por ejemplo, no está habilitado "por defecto" para los niveles de ejecución 2, 3, 4 y 5. En contraste, la mayoría de los servicios de red, tales como los servicios httpd osmb, están apagados "por defecto" para todos los niveles de ejecución. El comando reset se puede utilizar para restablecer los estados del servicio a su configuración "por defecto". [root@station rc3.d]# chkconfig smb reset [root@station rc3.d]# chkconfig --list smb smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off Observar más allá El comando chkconfig también permitirá a los administradores configurar los estados de niveles de ejecución especificados. En la práctica, el nivel de ejecución predeterminado de una máquina es casi siempre 3 o 5 por lo tanto los comandos on y off serán suficientes. Consulte la página chkconfig(8) del manual para mayor información. También, observe que chkconfig tiene algún conocimiento incorporado en éste. Por ejemplo, sabe que el número de inicio para el servicio smb es 91 y el número para matar es el 35. De nuevo, la página de manual le dará mayores detalles. Configuración local de inicio Nuestra discusión sobre el proceso de arranque de Red Hat Enterprise Linux ya casi está completa. Nuestro último tema tratará sobre cómo personalizar el proceso de inicio y específicamente el script /etc/rc.d/rc.local. Al listar todas las instancias de la palabra local desde los directorios específicos de niveles de ejecución podemos deducir la función del script rc.local. [root@station rc.d]# ls -l /etc/rc.d/rc?.d/*local* lrwxrwxrwx 1 root root 11 Apr 1 2003 /etc/rc.d/rc2.d/S99local -> ../rc.local lrwxrwxrwx 1 root root 11 Apr 1 2003 /etc/rc.d/rc3.d/S99local -> ../rc.local 43 Inicialización del sistema y servicios lrwxrwxrwx 1 root ../rc.local lrwxrwxrwx 1 root ../rc.local root 11 Apr 1 2003 /etc/rc.d/rc4.d/S99local -> root 11 Apr 1 2003 /etc/rc.d/rc5.d/S99local -> El script rc.local se ejecuta cuando se entra a un nivel de ejecución tras el arranque. Por defecto, el script está vacío. Cualquier requisito particular se puede agregar a este script. Cualquier configuración que se agregue a rc.local se ejecutará después de que todos los servicios se hayan iniciado. Esta conducta se puede modificar correctamente, ajustando el número de inicio del enlace simbólico S99local. Resumen Al cerrar, se ofrece el siguiente consejo. No permita que los detalles presentados en esta lección oscurezcan la simplicidad de la administración del servicio de Red Hat Enterprise Linux. Se podría decir que la mayoría de las técnicas de administración de sistemas más importantes descritas en este cuaderno están plasmadas en estos dos comandos: service y chkconfig. Utilice el comando service para manipular directamente un servicio, como se muestra en los siguientes comandos. [root@station rc.d]# service vsftpd start Starting vsftpd for vsftpd: [root@station rc.d]# service vsftpd stop Shutting down vsftpd: [root@station rc.d]# service vsftpd status vsftpd is stopped [ OK ] [ OK ] Utilice chkconfig para establecer el estado perdeterminado de un servicio tras el arranque, como en los siguientes comandos. [root@station rc.d]# chkconfig vsftpd on [root@station rc.d]# chkconfig vsftpd off [root@station rc.d]# chkconfig --list vsftpd vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off Después de la instalación del software de un nuevo servicio, suelen usarse los dos comandos en conjunto para iniciar el servicio de inmediato y por defecto tras un reinicio posterior. [root@station rc.d]# service smb start Starting SMB services: Starting NMB services: [root@station rc.d]# chkconfig smb on [ [ OK OK ] ] Ejercicios en línea Lab Exercise Objetivo: Administrar de modo efectivo los servicios de Red Hat Enterprise 44 Inicialización del sistema y servicios Linux. Tiempo estimado: 15 minutos. Specification 1. Asuma que no anticipa futuros cambios al hardware de su máquina y que desearía disminuir su tiempo de inicio de la máquina. Cambie la configuración del nivel de ejecución para el servicio kudzu para que esté desactivado para todos los niveles de ejecución. 2. De inmediato desactive el servicio portmap (pero no cambie sus niveles de ejecución predeterminados). 3. De modo manual desactive el servicio rhnsd para nivel de ejecución 4, renombrando el enlace simbólico K01rhnsd. Resultados Question 1 1. Una configuración de nivel de ejecución que desactive el servicio kudzu para todos los niveles de ejecución. 2. Un servicio portmap que no esté actualmente en ejecución. 3. Una configuración de nivel de ejecución que desactive el servicio rhnsd para el nivel de ejecución 4 con un "número para parar " de 01. Limpieza Restaurar los servicios kudzu, portmap y rhnsd a su configuración predeterminada. Capítulo 5 Resolución de problemas en la secuencia de arranque Conceptos clave • • • • Al observar el flujo de mensajes de arranque, los administradores pueden determinar la naturaleza del error de configuración de una máquina. Al agregar un 1 a la línea de comandos del kernel, se puede iniciar una máquina en un estado en que el sistema de archivos es ensamblado, pero no se han iniciado servicios. Al agregar un init=/bin/sh a la línea de comandos del kernel, se puede arrancar una máquina en un estado donde hay una shell interactiva, pero no se ha hecho referencia a archivos de configuración. La aplicación gráfica de servicios En la lección anterior se presentaron los comandos services y chkconfig como la técnica preferida para administrar servicios de Red Hat Enterprise Linux. También 45 Inicialización del sistema y servicios existe una utilidad gráfica, a la cual se puede acceder desde el menú principal como configuración del sistema:configuración de servidor:servicios, o desde la línea de comandos como system-config-services. Figure 1. Utilidad de configuración del servicio gráfico La utilidad gráfica modifica un nivel de ejecución a la vez y el nivel de ejecución actual se puede seleccionar desde el menú nivel de ejecución. Los botones iniciar, detener y reiniciar realizan funciones análogas a service, mientras que las casillas de verificación se utilizan para establecer la conducta predeterminada del nivel de ejecución (de forma similar a chkconfig). Una corta descripción del servicio y su estado actual se proporciona en los paneles de texto. Administración de consolas virtuales Las consolas virtuales fueron mencionadas en una lección anterior, por lo tanto aprovechamos esta oportunidad para recoger información acerca de las consolas virtuales en un solo lugar. Debido a que el proceso init inicia 6 gettys para cada una de las primeras 6 consolas virtuales, la gente generalmente dice que Linux "tiene" 6 consolas virtuales. Usualmente, Linux proporciona 12 consolas virtuales y algunas veces más. Las 6 consolas virtuales que no permiten inicio de sesión se pueden utilizar para ejecutar servidores X y visualizar la salidas de otros comandos. La consola n se puede acceder a través del nodo de dispositivo /dev/ttyn. 46 Inicialización del sistema y servicios Como ejemplo, la siguiente línea de comandos haría que la décima la consola virtual mostrara constantemente las últimas líneas del archivo /var/log/messages. [root@station root]# tail -f /var/log/messages > /dev/tty10 & Igual que las primeras 6 consolas virtuales, las consolas más altas se pueden ver con la secuencia de comandos ALT-Fn, donde cada tecla de función asigna el número correspondiente de la consola virtual n. Al salir del entorno gráfico X, la secuencia de teclas ALT-Fn parece ser demasiado común, por lo tanto se necesita agregar CONTROL. Si tiene problemas para recordar la diferencia, CONTROL-ALT-Fn siempre funcionará. El siguiente cuadro presenta las secuencias de teclas más utilizadas para administrar consolas virtuales. Table 1. Secuencias de teclas para consolas virtuales Secuencia de teclas Uso ALT-Fn Se desplaza a la consola virtual número n. CONTROL-ALT-Fn Se desplaza a la consola virtual número n dentro de un entorno X. ALT-FLECHAIZQUIERDA, ALTFLECHADERECHA Se desplaza a la consola vecina. MAYÚSCULAS-PÁGINA-ARRIBA, MAYÚSCULAS-PÁGINA-ABAJO Se desplaza por el historial de la consola virtual, (el historial se pierde cuando se cambia la consola). Análisis de la secuencia de arranque Algunas veces, las máquinas pueden estar desconfiguradas al punto que pueden presentar problemas en el arranque. Reconocer en qué momento del proceso de arranque se presenta el problema puede ayudar en el diagnóstico. Por consiguiente, los administradores del sistema de Red Hat Enterprise Linux deben ser capaces de reconocer diversas fases del proceso de inicio del flujo de mensajes ingresados tras el arranque. Empezando con Red Hat Enterprise Linux 4, el determinar problemas en el tiempo de arranque es un poco dificil ya que los parámetros de tiempo de inicio del kernel quiet y rhgb están predeterminados. Si su sistema presenta problemas en el arranque, se deben suprimir esos parámetros de la línea de comandos del kernel (ya sea editando /etc/grub.conf, o probablemente omitiendo la línea de comandos del kernel en el arranque con GRUB). Aquí reproducimos los componentes clave de una muestra de secuencia de arranque (asumiendo que no están los parámetros de arranque del kernel quiet ni rhdb) e 47 Inicialización del sistema y servicios identificamos algunas de las fases importantes. Comencemos por el gestor de arranque GRUB. Si es rápido, podemos atajar un mensaje similar al siguiente cuando BIOS pase el control a GRUB. Etapa 2 de la carga de GRUB Rápidamente, el mensaje se reemplaza con el menú de aplicación de la etapa 2 de GRUB. Cuando un elemento del menú se ha seleccionado, aparece en pantalla lo siguiente. Booting 'Red Hat Linux (2.6.9-5.EL)' root (hd0,0) Filesystem type is ext2fs, partition type 0x83 kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/ rhgb quiet [Linux-bzImage, setup=0x1400, size=0x113738] initrd /initrd-2.6.9-5.EL.img [Linux-initrd @ 0x3cb000, 0x24881 bytes] Otra vez, debe ser rápido. Es muy probable, que el único momento en que pueda atajar esta información es si algo saliera mal (por ejemplo si GRUB no pudiera localizar el kernel o no pudiera localizar el disco RAM), porque los mensajes se remplazan rápidamente con mensajes de inicio del kernel mientras carga. Linux version 2.6.9-5.EL ([email protected]) (gcc version 3.2.3 2 0030502 (Red Hat Linux 3.2.3-26)) #1 Thu Jan 8 17:03:13 EST 2004 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009fc00 (usable) BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved) BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) ... Cortamos la mayoría de los mensajes del kernel, (los interesados pueden hojearlos en el archivo /var/log/dmesg). Volvemos a cuando el kernel está montando su disco RAM inicial, montando la partición raíz e iniciando el proceso init. ... RAMDISK: Compressed image found at block 0 Freeing initrd memory: 146k freed VFS: Mounted root (ext2 filesystem). Journalled Block Device driver loaded kjournald starting. Commit interval 5 seconds EXT3-fs: mounted filesystem with ordered data mode. kjournald starting. Commit interval 5 seconds Freeing unused kernel memory: 132k freed INIT: version 2.84 booting En este punto, init inicia y se ejecuta el script rc.sysinit. El script calla al kernel rápidamente y comienza una secuencia de inicio más representativa, cargando una fuente por defecto y luego procediendo a inicializar el sistema de archivos. Setting default font (latarcyrheb-sun16): [ OK ] 48 Inicialización del sistema y servicios Welcome to Red Hat Linux Press 'I' to enter interactive startup. Mounting proc filesystem: Unmounting initrd: Configuring kernel parameters: Setting clock (localtime): Fri Nov 14 14:32:45 EST 2003 Loading default keymap (us): Setting hostname dhcp63-237.rdu.redhat.com: Initializing USB controller (usb-uhci): Mounting USB filesystem: Initializing USB HID interface: Initializing USB keyboard: Initializing USB mouse: Checking root filesystem /: clean, 92214/393600 files, 463138/787177 blocks Remounting root filesystem in read-write mode: [ [ [ [ [ [ [ [ [ [ [ OK OK OK OK OK OK OK OK OK OK OK ] ] ] ] ] ] ] ] ] ] ] [ [ OK OK ] ] En este punto, se presenta un evento importante en la vida del sistema de archivos: la partición raíz ahora está montada como de lectura y escritura. Activating swap partitions: Finding module dependencies: Checking filesystems /boot: clean, 41/32128 files, 9270/128488 blocks /home: clean, 520/130560 files, 30874/522081 blocks [ [ OK OK ] ] Mounting local filesystems: [ OK ] Se produjo otro evento importante en el sistema de archivos: ahora todas las particiones locales se han montado de lectura y escritura. Enabling local filesystem quotas: Enabling swap space: INIT: Entering runlevel 5 [ [ OK OK ] ] En este punto, rc.sysinit termina e init comienza la configuración específica del nivel de ejecución. Las siguientes líneas reflejan, uno por uno, los diversos scripts de servicio del inicio del directorio /etc/rc.d/init.d. Entering non-interactive startup Checking for new hardware Updating /etc/fstab Setting network parameters: Bringing up loopback interface: Bringing up interface eth0: [ [ [ [ [ OK OK OK OK OK ] ] ] ] ] Ahora las interfaces de red deben estar activas y se pueden iniciar los servicios de red relacionados. Starting system logger: Starting kernel logger: Starting portmapper: [ [ [ OK OK OK ] ] ] 49 Inicialización del sistema y servicios Starting NFS statd: Starting keytable: Initializing random number generator: Starting pcmcia: Mounting other filesystems: [ [ [ [ [ OK OK OK OK OK ] ] ] ] ] ¿Qué "otros sistemas de archivos" faltan por montarse? Los sistemas de archivos relacionados, tales como los recursos compartidos NFS o SMB. Starting Starting Starting Starting Starting Starting Starting Starting Starting Starting Starting Starting Starting Starting up APM daemon: automount: No Mountpoints Defined sshd: xinetd: sendmail: sm-client: console mouse services: crond: cups: xfs: anacron: atd: firstboot: Red Hat Network Daemon: [ [ [ [ [ [ [ [ [ [ [ [ [ [ OK OK OK OK OK OK OK OK OK OK OK OK OK OK ] ] ] ] ] ] ] ] ] ] ] ] ] ] Los mensajes de inicio deberían desaparecer ahora, para ser remplazados por una consola virtual de texto con un intérprete de comandos de inicio de sesión (para el nivel de ejecución 3) o una pantalla gráfica de inicio (para el nivel de ejecución 5). Cuando todo sale bien, estos mensajes se pueden ignorar. No obstante, cuando la máquina está desconfigurada, el observar cuidadosamente en qué parte del proceso de arranque se inició el problema, puede ayudar bastante en el diagnóstico del problema. Modificación de la secuencia de arranque con la línea de comandos del kernel En la lección sobre el gestor de arranque GRUB, mencionamos la función de la línea de comandos del kernel y cómo modificar la línea de comandos mientras se arranca la máquina. Ahora que hemos descrito la secuencia de arranque de Red Hat Enterprise, volvamos al tema. Tras el inicio, el kernel examina la línea de comandos del kernel y responde correctamente a los argumentos reconocidos. Los argumentos que el kernel no reconoce, los pasa al primer proceso. Si el argumento desconocido tiene la forma nombre=valor, se pasa como variable de entorno. De lo contrario, el argumento desconocido se pasa como un argumento para el primer proceso. Algunas veces, los sistemas se desconfiguran por lo tanto no pueden arrancar correctamente. En tales situaciones, la línea de comandos del kernel se puede utilizar para arrancar la máquina a un nivel reducido, permitiéndole al administrador del sistema localizar y solucionar los problemas. Los siguientes dos escenarios se pueden utilizar para recuperar máquinas desconfiguradas en la mayoría de los casos. 50 Inicialización del sistema y servicios Arranque en el nivel de ejecución 1 Cuando la desconfiguración se presenta en las últimas etapas del proceso de arranque, tales como con la configuración de red o la autenticación de usuario, el sistema se puede iniciar en un estado muy útil al evitar el nivel de ejecución predeterminado y arrancando directamente en un modo de monousuario. Esto se lleva a cabo al agregar un “1” a la línea de comandos del kernel. El kernel, al no reconocer el argumento “1”, pasa el argumento al proceso init. ¿Qué sucede cuando el init es llamado con un argumento de “1”? Este arranca en el nivel de ejecución 1. El proceso init iniciará, el script rc.sysinit se ejecutará y después de entrar al nivel de ejecución 1, el usuario pasará a la shell de root. Debido a que el script rc.sysinit se ejecutó, el sistema de archivos debería reconstruirse totalmente. Desde aquí se puede estudiar el sistema, y esperemos que el problema se pueda solucionar. Cuando se haya identificado el problema y solucionado, el proceso de arranque puede continuar con sólo desplazarse a un nivel de ejecución más alto por ejemplo con init 5. Este truco es muy útil para recuperar las máquinas para las que se ha olvidado la contraseña de root. Evitar el /sbin/init A veces, sin embargo, se pueden presentar problemas tempranos en el proceso de arranque. Por ejemplo, ¿qué sucedería si el archivo /etc/fstab, o el archivo/etc/inittab o el script /etc/rc.d/rc.sysinit se destruyen? En dichos casos, arrancar en el nivel de ejecución 1 no es la solución. Los problemas se presentan incluso antes de que init considere los niveles de ejecución. En dichas situaciones, se le puede pedir al kernel que evite /sbin/init y ejecute una shell interactiva como su proceso inicial. Esto se realiza al agregar el argumento init=/bin/sh a la línea de comandos del kernel. El parámetro de arranque init= le pide al kernel que ejecute un comando diferente a /sbin/init como el proceso de inicio y el kernel se comporta como corresponde. ¿Qué sucede después del arranque? En este momento en el proceso de inicio del kernel se iniciaría init, pero no lo hace, en su lugar, se envía al usuario a una shell interactiva. init-2.05b# Recuerde el estado del sistema de archivos: únicamente se monta la partición raíz de sólo lectura. Una reacción natural sería tratar de remontar la partición raíz como de lectura y escritura. init-2.05b# mount -o remount,rw / mount: could not open /proc/partitions, conversion cannot be done. so UUID and LABEL 51 Inicialización del sistema y servicios mount: no such partition found init-2.05b# Sin montar /proc, ¡ni siquiera el comando mount funcionará correctamente! Primero, se debería montar el sistema de archivos /proc, luego se puede montar la partición raíz de lectura y escritura. Si todo sale bien, el siguiente comando puede ser un mount -a. init-2.05b# mount /proc init-2.05b# mount -o remount,rw / EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,6), internal journal init-2.05b# mount -a kjournald starting. Commit interval 5 seconds EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,7), internal journal EXT3-fs: mounted filesystem with ordered data mode. init-2.05b# En este punto, el usuario debería estar en un entorno bastante adecuado para localizar y solucionar problemas. Una vez se hayan identificado los problemas y solucionado, ¿cómo se puede salir el usuario de este entorno mínimo? Una opción es el comando exit. init-2.05b# exit exit Kernel Panic: Attempted to kill init! En este momento, el teclado de LED del usuario estará alumbrándose (una de las característicias del kernel de Linux que está bloqueado) y de otra manera el usuario está muerto. ¿Qué sucedió? El proceso interactivo /bin/sh era el Id del proceso número 1 y al kernel no le gusta que muera el proceso número 1. Una solución más apropiada es la siguiente. Primero, pare los procesos (diferentes a su shell). Luego deconstruya su sistema de archivos revocando el proceso anterior. init-2.05b# umount -a init-2.05b# mount -o remount,ro / init-2.05b# umount /proc init-2.05b# En este punto, el sistema se encuentra en el momento en que el kernel habría quedado : sólo un proceso se está ejecutando y el sistema de archivos está montado de sólo lectura. Haga que su shell se convierta en el proceso /init "ejecutando" /sbin/init. init-2.05b# exec /sbin/init INIT: version 2.84 booting Setting default font (latarcyrheb-sun16): Welcome to Red Hat Linux Press 'I' to enter interactive startup. [ OK ] 52 Inicialización del sistema y servicios ... Su sistema debería iniciar en limpio como si nada hubiera pasado. La búsqueda del kernel de un proceso inicial Si por alguna razón el kernel no encuentra o ejecuta /sbin/init, el kernel busca /bin/sh y otros ejecutables predefinidos. Por último, si el kernel agota su lista de candidatos sin encontrar un proceso inicial ejecutable, muere con el siguiente mensaje. Kernel panic. No init found. Try passing init= option to kernel. Ejercicios en línea Lab Exercise Objetivo: Ser competente predeterminada. al sobreescribir la secuencia de arranque Estimated Time: 30 mins. Specification copie su archivo /etc/fstab en el archivo /etc/fstab.prelab4.5. Edite su archivo original y quite el comentario de la línea definiendo el punto de montaje para la partición raíz. 2. Reinicie su máquina. En el intérprete de comandos de arranque GRUB, agregue el parámetro init=/bin/sh a la línea de comandos del kernel. 3. Su sistema continúa el arranque, pero rápidamente lo envía a la shell de mantenimiento. En la shell de mantenimiento, realice los siguientes pasos. a. Monte el sistema de archivos /proc. b. Vuelva a montar la partición raíz de lectura y escritura. c. Edite el archivo /etc/fstab y no comente la línea que retiró al comienzo del laboratorio. d. Vuelva a montar la partición raíz de sólo lectura. e. Desmonte el sistema de archivos /proc. f. Remplace su shell con el proceso init, pidiéndole ainit que traiga su máquina al nivel de ejecución 1 con la siguiente línea de comandos. 1. Por precaución, g. init-2.05b# exec /sbin/init 1 4. Su proceso de arranque debería continuar con init configurando la máquina al nivel de ejecución 1. Cuando haya terminado init abrirá otra shell, esta vez con el sistema de archivos totalmente ensamblado. Desde esta shell, entre al nivel de ejecución 5 con la línea de comandos init 5. 5. En este punto, su máquina debe haber arrancado completamente. Inicie sesión y califique su ejercicio. Resultados 53 Inicialización del sistema y servicios Question 1 1. Un /proc/cmdline que incluya el argumento init=/bin/sh. 2. El comando runlevel debería entregar su nivel de ejecución actual como nivel de ejecución 5 y su nivel de ejecución anterior como nivel de ejecución 1.