El arranque en Windows Server 2008.

Una vez que ya hemos instalado nuestro Windows Server 2008 y hemos realizado las tareas de configuración inicial, vamos a estudiar la forma en que Windows Server 2008 arranca y la administración del almacén BCD. Para empezar, vamos a leer este texto.

El almacén BCD

Cuando Windows Vista y posteriores (incluido Server 2008) arranca, sigue una serie de pasos para poder cargar el Sistema Operativo. Estos pasos incluyen diferentes elementos, como el Sector de Arranque Maestro (MBR), el Sector de Arranque de Partición (VBR), códigos de arranque, gestores de arranque, etc. Todos funcionan en una secuencia de acciones ordenada que lleva como resultado el inicio de un Sistema Operativo.

Lo que se explica en este artículo es cómo funcionan esos elementos, y como manipularlos, lo que puede ser de ayuda para modificar, elminar o añadir opciones al arranque, o para resolver problemas cuando el sistema tiene problemas para llevar a cabo la secuencia anteriormente citada y no puede arrancar correctamente.

En la actualidad hay dos esquemas de particionado principales, que son MBR y EFI. Aunque la industria apuesta decididamente por EFI, la bibliografíca especializada sigue hablando de la MBR como modelo principal de particionado para sistemas x86 y x64 (no Itanium). En definitiva, una MBR está dividida en dos partes principales, a saber:

  • Un código de arranque maestro: es un programa sencillo cuya única finalidad es cargar en memoria un Sistema Operativo.
  • Una tabla de particiones: es un espacio definido para incluir en él información básica sobre las particiones del disco duro (primarias o extendidas).

Cuando un sistema basado en Windows Vista (como Windows Server 2008) arranca, el proceso es el siguiente:

  • La CPU ejecuta el código que se encuentra en la BIOS. Este código realiza una primera fase de reconocimiento del sistema (llamada POST - Power On Self Test -) y posteriormente busca el código de arranque maestro en la MBR y le cede el control.
  • El código de arranque maestro busca en la tabla de particiones una marca (flag) que le indique qué partición contiene el mecanismo de arranque del sistema operativo. Una vez que lo averigua, busca en el inicio de dicha partición (llamado sector de arranque) otro código de arranque. A diferencia del código de arranque maestro, el código de arranque de la partición está especializado en iniciar el gestor de arranque de Windows Vista y posteriores: bootmgr.
      NOTA: Existen diferencias entre un código de arranque y un gestor de arranque. Un código de arranque es similar a un motor de arranque de un coche. Su misión es cargar en memoria otro programa para que se ejecute. Sin embargo, un gestor de arranque propiamente dicho tiene como objetivo mostrar al usuario diferentes opciones de arranque, y en función de su elección, cargar en memoria uno u otro programa. En ocasiones, un gestor de arranque puede hacer funciones de un código de arranque, y de ahí la común confusión entre los términos.
  • El código de arranque de la partición tiene una particularidad que lo diferencia del código de arranque maestro: es capaz de comprender el sistema de ficheros NTFS. Debido a esto, puede buscar ficheros concretos dentro de la partición. Una vez cargado en memoria el código de arranque de la partición, éste busca el programa bootmgr, que es un gestor de arranque.
  • El gestor de arranque bootmgr, consulta el almacén BCD (Boot Configuration Data) que guarda información sobre las opciones de arranque. De hecho, el almacén BCD posibilita que se nos muestren varias opciones de arranque al inicio del sistema. Obteniendo la información necesaria del almacén BCD, bootmgr muestra diferentes opciones de arranque, esperando que el usuario elija una.
  • Una vez que el usuario ha elegido (suponemos) Windows Vista (o posterior), bootmgr inicia otro programa, llamado Winload, que es el encargado a su vez de iniciar tres elementos fundamentales: el núcleo del sistema (ntoskrnl.exe), la capa de abstracción del hardware (hal.dll) y la clave System del registro.

Tipos de entradas en el almacén BCD

El almacén BCD está estructurado de forma arbórea:

Como se puede ver, hay 3 tipos de elemento:

  • hay un elemento raíz, que es el almacén en sí.
  • Dentro del almacén BCD podemos encontrar los objetos BCD. Cada objeto BCD es un gestor de arranque de Windows (o de GNU/Linux).
  • Finalmente, están los elementos BCD. Estos elementos son en realidad parámetros que se pueden asignar a un cierto objeto.

Objetos BCD principales

El almacén BCD contiene diferentes objetos BCD. En un sistema basado en BIOS se pueden ver:

  • Windows Boot Manager. Solamente hay un gestor de arranque, de modo que solamente hay una entrada de gestor de arranque.
  • Uno o más objetos de tipo Boot Loader; una por cada sistema operativo Windows instalado.
  • Una entrada para sistemas Windows antiguos (XP, 2003, 2000). Esta entrada inicia el gestor de arranque Ntldr de estos sistemas, donde se podrán ver las entradas configuradas para dicho gestor de arranque.
  • Además del gestor de arranque de Windows, existen sistemas de arranque que admite BCD.
    • OSLOADER: cargador de sistema operativo de Windows Vista o posterior (winload.exe). El almacén BCD incorpora en una instalación fesca este objeto BCD
    • # bcdedit /create /application osloader /d "Windows Vista"
    • BOOTSECTOR: Código de arranque de partición "de Windows". En realidad también se pueden usar VBC de otros sistemas operativos.
    • # bcdedit /create /application bootsector /d "Ubuntu 12.04"
    • RESUME: cargador de recuperación de Windows hibernado. El almacén BCD incorpora en una instalación fresca este objeto BCD
    • # bcdedit /create /application resume /d "Recuperar hibernación Windows Vista"

Elementos BCD principales

Las claves o parámetros que se pueden ver por defecto en el gestor de arranque "bootmgr" son:

  • Identificador: UUID de la entrada.
  • device: Dispositivo en que se encuentra.
  • description: descripción textual.
  • locale: idioma que utiliza en el arranque.
  • inherit: importación de otra entrada del almacén.
  • default: sistema que se inicia por defecto.
  • displayorder: sistemas que se muestran en el arranque.
  • toolsdisplayorder: orden en que se muestran las herramientas de arranque.
  • timeout: tiempo que tarda en iniciar la entrada por defecto si no hay intervención del usuario.

Las claves o parámetros que se pueden ver por defecto en el cargador de arranque de Windows son:

  • Identificador: GUID de la entrada.
  • device: Dispositivo en que se encuentra. Observa el siguiente ejemplo
  • # bcdedit /store C:\BCD-copia /set {guid} device partition=C:
  • path: ruta al cargador. Observa el siguiente ejemplo
  • # bcdedit /store C:\BCD-copia /set {guid} path \Windows\system32\winload.exe
  • description: descripción textual.
  • locale: idioma.
  • inherit: importación de otra entrada del almacén.
  • osdevice: dispositivo donde se encuentra el sistema operativo.
  • systemroot: ruta a la cerpeta raíz del sistema operativo.
  • resumeobject: UUID del recuperador de hibernación.
  • nx: activa/descativa DEP (Data Execution Prevention). Puede ser útil en casos en que no se pueden iniciar aplicaciones legítimas.. Los valores posibles son "optout" (todos los programas y servicio son revisados por DEP), "optin" (solo los programas esenciales de Windows son revisados), "allwayson" o "allwaysoff".

Una vez comprendidos los fundamentos del arranque de un sistema Windows Vista (o posterior), vamos a analizar algunos comandos que nos pueden sacar de más de un apuro.

El comando bcdedit.

bcdedit es un comando pensado para interaccionar con el almacén BCD, esto es, la base de datos con la información sobre las opciones de arranque del sistema. El almacén BCD se organiza en entradas, que son en realidad un modo de agrupar varias opciones. Cada entrada tiene un nombre inequívoco y una serie de opciones. Cada entrada con sus opciones describe por lo general un programa, indicando cosas como en qué partición está, como se llama el ejecutable o el idioma configurado.

Algunas opciones del comando bcdedit son las siguientes:

Ver las entradas principales del almacén BCD: bcdedit

muestra solo las entradas que se utilizan actualmente durante el arranque del sistema.

Ver el contenido completo del almacén BCD:  bcdedit /enum all /v
muestra todo el contenido del almacén. Si no se utiliza la opción /v, se muestra la misma información pero de forma reducida (los GUID de los elementos se muestran con nombres "bien conocidos"). La mayoría de las entradas mostradas no aparecen durante el arranque, ya que solo se mostrarán las que aparezcan citadas en la opción "displayorder" de la entrada "Administrador de arranque de Windows".

Exportar el almacén: bcdedit /export C:\bcdbackup\BCD

lo primero que debemos hacer antes de tocar en el almacén es exportarlo. Después, en caso de desastre, siempre podemos restaurar la copia guardada del BCD. La ruta al backup, es decir C:\bcdbackup, debe ser creada previamente.

Importar el almacén: bcdedit /import C:\bcdbackup\BCD

Si la hemos liado, y tras tocar en el almacén BCD con bcdedit el sistema no arranca, "Don't Panic". Inserta un disco de instalación de Windows (en nuestro caso Server 2008) e inicia la consola de recuperación (un símbolo del sistema). Desde allí no tienes más que ejecutar el comando de importación y listo.

Añadir una nueva entrada: bcdedit /create /application osloader /d "Windows Vista"

Por lo general es suficiente con las entradas que existen en el almacén BCD. Pero como un alumno me comentó... "Quiero tener la opción de arranque en modo seguro siempre disponible cuando arranco, porque en mi máquina virtual con Windows Server 2008 no puedo iniciar las opciones de arranque avanzadas ya que no recoge la tecla F8 durante el inicio.". Para este caso necesitaremos crear una nueva entrada. En otra ocasión explicaré como hacer esto.

Clonar una entrada existente:bcdedit /copy {uuid} /d "Descripción de la entrada"

De este modo se genera un nuevo objeto BCD con la misma configuración que el objeto clonado.

Añadir una opción a una entrada: bcdedit /set {identificador} device partition=D:

Una vez creada una entrada, probablemente queremos llenarla de opciones, como indicar cuál es la partición donde encontrar el programa que describe la entrada. donde aparece {identificador}, debemos incluir el identificador de la entrada, ya sea en su versión "bien conocida" (algo como {current}) o en su versión guid (algo como {135fa224-bc23-de43-7232-fb239ac5fbc}).

Borrar una opción de una entrada: bcdedit /set {identificador} device
Del mismo modo, podemos eliminar una opción de una entrada.

Borrar una entrada del almacén:
bcdedit /delete {identificador}

Si lo que queremos es eliminar toda una entrada del almacén, entonces el comando es el anterior, donde {identificador} es el identificador de la entrada.

Cambiar el orden: bcdedit /displayorder {current} {memdiag}

Suponiendo que tenemos más de una opción de arranque, ¿En qué orden se muestran? Esto se controla con la opción "displayorder" que se muestra en la entrada "Administrador de arranque de Windows". En el ejemplo anterior, se indica que durante el arranque se muestren las opciones en el siguiente orden: primero, el sistema operativo (llamado aquí {current}) y después la herramienta de diagnóstico de memoria. Existen otras variantes de esta opción del comando que son las siguientes:

bcdedit /displayorder {identificador} /addfirst
bcdedit /displayorder {identificador} /addlast

En estos casos no es necesario indicar la lista completa de sistemas operativos a arrancar, sino solamente cual va el primero o el último.

Cambiar opciones de tiempo y entrada por defecto: bcdedit /timeout 30    y    bcdedit /default {identificador}

Estas opciones (timeout y default) se encuentran definidas en la entrada "Administrador de arranque de Windows". Con estas opciones, se cambia el tiempo en segundos que el gestor de arranque espera hasta que el usuario elija una opción (solo tiene sentido cuando hay más de una opción de arranque). Cuando ha transcirrido este tiempo y el usuario ha movido el cursor, el sistema elige la entrada por defecto. La entrada por defecto, se define con la opción /default.

Cambiar el orden provisional del arranque: bcdedit /bootsequence {identificador}

Esta opción permite decidir cuál será la entrada elegida en el próximo reinicio. Solo tiene validez por una vez. Esto puede ser útil, si por ejemplo hemos detectado algún problema de hardware, y deseamos que en el próximo reinicio arranque el programa de chequeo de la memoria.

Bootrec

Vamos a conocer otra herramienta, muy útil en caso de deterioro del Master Boot Code (código de arranque presente en el MBR), del Volume Boot Code (código de arranque de la partición de arranque) o del almacén BCD. En caso de haberse destruido la tabla de particiones presente en el MBR, el sistema será irrecuperable por este procedimiento, y habrá que usar copias de seguridad.

La Knowledge Base de Microsoft, habla de esta herramienta en la página http://support.microsoft.com/kb/927392/es.

Para poder ejecutar la herramienta bootrec.exe, debemos iniciar la consola de recuperación de Windows Server 2008. Para acceder a dicha consola, es preciso seguir los siguientes pasos:

  • Insertar el disco de Windows Server 2008 en la unidad lectora de DVD del servidorArrancar el equipo. Nota: La BIOS debe estar configurada para que el orden de arranque busque antes en el DVD que en el disco duro.
  • Elegir el idioma (español) cuando Windows muestra la ventana "Instalar Windows".
  • A continuación se muestra la opción "Instalar ahora". En esta misma ventana se puede encontrar la opción "Reparar el equipo".
  • Pantalla de instalación de WindowsEn la ventana "Opciones de recuperación del sistema", hacer clic en siguiente. No hay que preocuparse si no muestra un sistema operativo, ya que puede que el sistema no haya sido capaz de acceder a él.
  • En la ventana "Elija una herramienta de recuperación", elegimos "Símbolo del sistema", y se abrirá una ventana de "Solo símbolo del sistema".

Las acciones que se mencionan a continuación se realizarán en esta línea de comandos.

Deterioro del Master Boot Code

Para simularlo, escribiremos los siguientes comandos de linux:dd if=/dev/zero of=/dev/sda bs=70 seek=1 count=1

Un deterioro del Master Boot Code, impedirá el correcto arranque del sistema, generando mensajes de error como "Error loading operating system", "Missing Operating System", o directamente un "negro" silencio una vez superada la fase POST de la BIOS.

En cualquiera de estos casos, se puede intentar emplear la herramienta bootrec.

Ejecutar el comando siguiente: bootrec /fixmbr

Este comando restaura el master boot code en el sector de arranque maestro (MBR).

Tras esto, cerrar la línea de comandos, y pulsar "reiniciar". A continuación se extrae el disco del DVD y se trata de arrancar normalmente.

Deterioro del Volume Boot Code

Para simularlo, escribiremos los siguientes comandos de linux :dd if=/dev/zero of=/dev/sda1 bs=6 count=1

Cuando la parte dañada corresponde al código de arranque que está presente en el sector inicial de la partición de arranque (diferente del sector de arranque maestro), el sistema puede mostrar mensajes como "A disk read error ocurred", "BOOTMGR is missing", "BOOTMGR is compressed", o la pantalla se queda en negro una vez superada la fase POST de la BIOS.

Ejecutar el comando siguiente: bootrec /fixboot

Este comando restaura el volume boot code, pudiendo resolver el problema.

Tras esto, cerrar la línea de comandos, y pulsar "reiniciar". A continuación se extrae el disco del DVD y se trata de arrancar normalmente.

Deterioro del almacén BCD

Cuando el almacén BCD está dañado, el sistema generará durante el arranque un error del tipo "BCD registry missing o corrupt error". Esto implica que el sistema no puede acceder a las opciones de arranque, y por tanto, el gestor de arranque (llamado bootmgr.exe) no sabe qué opciones emplear ni qué sistemas arrancar.

En un artículo anterior, se explicó como restaurar una copia del almacén BCD mediante el comando bcdedit /import . Pero si no hemos realizado una copia del almacén BCD, podemos utilizar la herramienta bootrec.exe para generar un almacén BCD básico, suficiente para arrancar Windows Server 2008.

Ejecutar el siguiente comando: bootrec /rebuildbcd

Aunque bootrec permite solucionar algunos problemas como los descritos anteriormente, no se debe dejar de hacer copias de seguridad, puesto que el problema podría incluir más daños de los que bootrec puede solucionar.

Deterioro de la tabla de particiones

La pérdida de la tabla de particiones puede ser un desatre. Se puede hacer una copia de la tabla de particiones mediante el comando dd y posteriormente restaurarla en caso de pérdida.

Con el comando dd de GNU/Linux, se puede hacer una copia de respaldo del MBR, escribiendo: dd if=/dev/sda of=/root/mbr bs=512 count=1. Con este comando la copia se almacena en el directorio /root, pero tendremos que guardarlo en algún soporte externo, como una memoria flash, por ejemplo.

Cuando llega el desastre, y nos aparece el mensaje Invalid partition table, tiramos de la copia que hicimos anteriormente. Por ejemplo, supongamos que he colocado la copia de la mbr en /root. Para simular la destrucción de la tabla de particiones: dd if=/root/mbr of=/dev/sda bs=512 count=1

Hasta aquí una primera parte sobre el arranque de Windows.

Actividad 1. Supongamos que dispones de dos máquinas con Windows Server 2008 instalado, a las que llamaremos W1 y W2. Crea una copia del almacén BCD en W1. Después añade el disco duro de W2 a W1. Modifica el almacén BCD para que durante el arranque puedas elegir entre iniciar entre el Windows Server de W1 o el de W2. Añade también al inicio la posibilidad elegir la herramienta de diagnóstico de memoria.

Entregar: un archivo llamado "bcd1.txt" que contenga la configuración del almacén BCD. Para crearlo, ejecuta bcdedit /enum all > bcd1.txt

Actividad 2. Modifica el almacén BCD para que arraque por defecto desde el disco de W2, y que muestre siempre las opciones de arranque avanzado al elegir dicha entrada. Para ello, deberás insertar la clave AdvancedOptions con valor "yes" en la entrada correspondiente a W2.

Entregar: un archivo llamado "bcd2.txt" que contenga la configuración del almacén BCD. Para crearlo, ejecuta bcdedit /enum all > bcd2.txt

Actividad 3. Modifica el almacén BCD para que arranque la herramienta de diagnóstico de memoria en el próximo reinicio solamente.

Entregar: un archivo llamado "bcd3.txt" que contenga la configuración del almacén BCD. Para crearlo, ejecuta bcdedit /enum all > bcd3.txt

Actividad 4. Destruye parcialmente el almacén BCD. Por ejemplo, puedes utilizar el comando bcdedit /delete {bootmgr} /f. Intenta reiniciar. Restaura la copia de seguridad original de BCD y comprueba que las entradas vuelven a ser las mismas que inicialmente.

Entregar: Captura del momento en que no puedes iniciar. Captura del momento en que restauras el almacén. Captura del reinicio. Entregar las imágenes en un archivo comprimido llamado "bcd4.zip".

Actividad 5. Inicia en la máquina Windows Server 2008 con una distribución GNU/Linux live. Destruye el "Código de Arranque Maestro" mediante el comando dd como sigue: dd if=/dev/zero of=/dev/sda bs=70 seek=1 count=1. Reinicia la máquina.

Una vez que compruebes que no puedes arrancar la máquina, aplica el procedimiento explicado para restaurar el master boot code.

Entregar: Captura con el comando dd ejecutado. Captura con el inicio fallido de Windows. Captura con la reparación. Captura con el reinicio.

Actividad 6.Repite el ejercicio anterior, aunque en esta ocasión deteriorando el volume boot code. El comando en este caso es el siguiente: dd if=/dev/zero of=/dev/sda1 bs=6 count=1

Entregar: Captura con el comando dd ejecutado. Captura con el inicio fallido de Windows. Captura con la reparación. Captura con el reinicio.

Actividad 7. Inicia en la máquina Windows Server 2008 con una distribución GNU/Linux live. Destruye el almacén BCD, ubicado en C:\boot\BCD. Para ello, ejecuta la siguiente secuencia de comandos:

mkdir /mnt/sda1
mount /dev/sda1 /mnt/sda1
rm /mnt/sda1/Boot/BCD
reboot

Suponiendo que no tienes una copia del almacén BCD, restaura el almacén por otros medios

Entregar: Captura con el comando dd ejecutado. Captura con el inicio fallido de Windows. Captura con la reparación. Captura con el reinicio.

Actividad 8. Inicia en la máquina Windows Server 2008 con una distribución GNU/Linux live. Realiza una copia de la MBR a un soporte externo, mediante el comando siguiente: dd if=/dev/sda of=/mnt/flash/mbr bs=512 count=1, donde /mnt/flash es donde supuestamente se ha montado la unidad externa.

Después, destruye la tabla de particiones, mediante el comando siguiente: dd if=/dev/zero of=/dev/sda bs=1 seek=446 count=60.

Trata de arrancar, y finalmente restaura la MBR mediante el comando siguiente: dd if=/media/flash/mbr of=/dev/sda bs=512 count=1. Finalmente arranca.

Entregar: Captura con el comando dd ejecutado. Captura con el inicio fallido de Windows. Captura con la reparación. Captura con el reinicio.

Algunos comentarios sobre el arranque con UEFI

El arranque con UEFI simplifica en gran medida el proceso de arranque, ya que MBC y VBC dejan de tener sentido. El firmware de UEFI tiene la capacidad de acceder directamente a la partición ESP (Efi System Partition) para buscar el gestor de arranque apropiado. El proceso es el siguiente:

  • El firmware busca una partición identificada por el código GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B en los dispositivos de almacenamiento particionados con GPT, o bien una partición con tipo 0xEF marcada como partición de arranque en dispositivos particionados con el esquema MBR. Esta partición es la EFI System Partition que debe tener formato UEFI filesystem.
  • Si se encuentra esa partición, el firmware accede a ella y carga el gestor de arranque por defecto, con extensión .efi que esté determinado como por defecto en el firmware.
  • Para cambiar el gestor de arranque por defecto, hay que entrar a configurarlo a través de la consola de configuración de uefi.

  • UEFI se ejecuta en modo protegido (32 bits) o en long mode (64 bits), lo que hace más segura su ejecución. BIOS utiliza el modo real (16 bits) que no incluye protección de memoria, lo que facilita su trabajo a los Bootkits.
  • El bootloader ejecutado accede al sistema de archivos donde se aloja el sistema operativo usando los servicios de acceso a archivos provistos por el firmware.

Manejo del almacén BCD con UEFI

El manejo del almacén BCD es igual en UEFI que en BIOS. Si se observan la entradas del almacén BCD, se podrá ver que hay algunas entradas relacionadas con el arranque UEFI, como la entrada {fwbootmgr}, que incluye información como cuál es el gestor de arranque por defecto. Para cambiar el gestor de arranque que UEFI considera "por defecto", hay que hacer lo siguiente:

bcdedit /set {fwbootmgr} displayorder {UUID-deseado} /addfirst

Actividad 9. Instala en un sistema con UEFI Windows 7 o Server 2008, y posteriormente instala Linux. Tras instalar Linux, el gestor de arranque Grub será el gestor de arranque por defecto. Arranca con Windows, y ejecuta el comando anteriormente especificado, para que el gestor de arranque de Windows esa el gestor de arranque por defecto.

Entregar captura en el momento de la ejecución del comando pedido.