lunes, 18 de febrero de 2013

Arranque diferido de servicios en servidores y estaciones Windows

En muchas ocasiones, algunos errores muy comunes en los sistemas operativos de Microsoft se deben a que algunos servicios arrancan de manera asíncrona, pero sin embargo tienen dependencias entre ellos para poder funcionar. Hay veces que dichas dependencias están ya preconfiguradas por defecto (el típico servicio que no puedes pararlo sin parar antes otros cuatro dependientes de él); pero otras veces las dependencias no están incluídas en la configuración de los servicios, y cuando el servicio dependiente se adelanta a su dependencia, empiezan a producirse todo tipo de problemas.

Varios de estos típicos errores suelen darse en los servidores que son controlador de dominio, especialmente cuando el servicio DNS local se retrasa más de la cuenta. Dado que el DNS es parte del corazón de la infraestructura Active Directory, si dicho servicio no está levantado a tiempo afectará a otros servicios y funciones (sobre todo cuando es necesario interrogar al DC acerca de detalles de la infaestructura, resolver nombres internos, etc.).



Diferentes acercamientos al problema


En realidad es un problema complejo y en cada caso requerirá una estrategia diferente. Sin embargo, hay dos cosas básicas a intentar: crear manualmente dependencias entre servicios y cambiar el orden de arranque de los servicios de tipo driver o controlador. En ocasiones, puede ser un driver el que haya demorado su arranque provocando el fallo de algunos servicios dependientes.

Para crear dependencias de servicios se puede hacer mediante el registro de Windows. Hay otras maneras más elegantes, por ejemplo con un script WSH usando la clase Win32_ServiceSpecification de la WMI/WBEM, pero quedan fuera del alcance de este artículo.

La mayoría de problemas en controladores de dominio se deben a dependencias del servicio Netlogon; trabajemos pues sobre este ejemplo.

Usando la herramienta Regedit o cualquier otra similar, localizamos la clave donde se almacenan los datos de todos los servicios:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\

en este caso:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon

Para crear una dependencia, tenemos que editar o crear un valor de tipo REG_MULTI_SZ que se llame DependOnService y agregar en su interior los nombres de los servicios de los cuáles queremos hacerlo depender (uno por cada línea). En nuestro caso, queremos que el servicio Netlogon no intente levantarse hasta tener certeza de que ya está levantado el servicio DNS local (fundamental en controladores de dominio).

Para ello añadimos dicho servicio y aceptamos los cambios:



Para aplicar los cambios debería reiniciarse el servicio, aunque para asegurarse es uno de esos pocos casos en los que es mejor reiniciar el servidor.

IMPORTANTE: en este caso hemos hecho depender a un servicio crítico como es Netlogon del servicio DNS. Si este último no estuviese instalado en el DC o no pudiese iniciar, estaríamos provocando un problema grave de funcionamiento, por lo que es conveniente tener este cabo bien atado.

En ocasiones los servicios, como dijimos, dependen de drivers o controladores. En Windows, un driver no es más que otro tipo de servicio que no se muestra en la ventana services.msc, pero que internamente funciona de manera similar como de hecho se puede comprobar mirando la lista de servicios en el Regedit.

Windows Server no nos permite establecer el orden exacto de arranque de cada driver, pero sí de cada grupo de drivers. La mayoría de drivers están asociados a un grupo determinado, y esos grupos sí pueden ser ordenados a nuestro antojo.

Para ello tenemos la siguiente clave de registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder

donde el valor List contiene la lista ordenada de grupos de servicios:


Normalmente, los retrasos en casi todos los servicios de red terminan siendo debidos a que las inteterfaces de red (NIC) tardan en estar operativas. Basta con ordenar los grupos de servicios para que todos los que están relacionados con la red arranquen antes.