Microsoft, su tecnología y yo

El Blog de David Cervigón (Microsoft)

March, 2009

  • Salpicón de enlaces interesantes

    Hola

    Algunos enlaces a información sobre temas que suelen surgir frecuentemente:

    Otro día escribiremos algo más elaborado.

    Saludos

    David Cervigón

  • Limpiando roña del Directorio Activo

    Hola

    Como cualquier almacén de datos, el Directorio Activo puede convertirse en un lugar poco recomendable donde acumular toda clase de roña, sobre todo si las operaciones que se llevan a cabo sobre el mismo se descuidan.

    Agregar objetos es particularmente sencillo, y esto es precisamente la base de su diseño y su funcionalidad para hacer posible que muchos productos se apoyen en su capacidad de servir todo tipo de información. Sin embargo la eliminación de lo que ya no nos sirve es algo que en ocasiones se deja para luego o se hace de aquella manera. A mayor complejidad de la arquitectura del AD en lo tocante a numero de Dominios, Sites y controladores de dominio, más pueden acentuarse este tipo de problemas y mayor será la necesidad de definir y respetar una buena guía de operaciones para el Directorio Activo.

    Lo complicado en este punto es definir que es lo que entendemos por roña. En este post nos vamos a centrar en tres tipos:

    • Usuarios/equipos que estuvieron y ya no están, pero cuyas cuentas siguen repartidas por nuestra estructura de Unidades Organizativas, o lo que es peor, no sabemos si deben seguir ahí o si las podemos borrar tranquilamente.
    • Controladores de Dominio, o incluso dominios enteros, que desaparecieron sin más. En ocasiones los equipos se apagan para siempre cuando ya no se necesitan más y por unas razones u otras no recordamos que en el caso de los DCs es muy conveniente hacer un DCPROMO que elimine la información correctamente de la estructura de AD, y que traspase los roles de manera amable y ordenada a otro DC de la red.
    • Objetos que han sido borrados del directorio activo, pero cuya desaparición ha pasado desapercibida para un DC que ha estado mucho tiempo sin replicar con los demás o desconectado de la red.

    1.- Identificar cuentas de usuario y equipos en desuso

    Las cuentas de usuario/servicios deberían borrarse en el momento de que el usuario o aplicación que las ha estado utilizando no la necesiten más. Igualmente la cuentas de las máquinas debería hacerse desaparecer sacando al equipo del dominio antes de proceder a reconfigurarlo/reinstalarlo/eliminarlo. Sin embargo las prisas hacen que esto se deje demasiado a menudo para luego, y que llegue el momento de preocuparse cuantos de mis miles de objetos de usuario/equipo solo están ocupando espacio y haciendo al AD más gordito y pesadote.

    Salvo que a alguien se le ocurra algo mejor, lo que se suele utilizar para detectar estos objetos olvidados es buscar un atributo que sepamos que haya cambiado seguro la última vez que el usuario/equipo las utilizaron y que no cambie salvo que sea vuelto a utilizar. Esto sucede cada vez que un alguien (usuario o equipo) inicia sesión. En ese momento el controlador de dominio encargado de llevar a cabo la operación de autenticación actualiza un par de atributos de la cuenta en particular con la fecha y la hora en la que se ha iniciado sesión. Si lo que queremos es hacer una operación de borrado masiva de este tipo de roña, deberemos establecer una fecha límite a partir de la cual, todo objeto que no haya iniciado sesión será considerado en desuso. El último inicio de sesión se almacena en dos atributos presentes tanto en la cuentas de usuarios como de los equipos: LastLogonTimeStamp y LastLogon.

    • LastLogonTimeStamp solo está presente en el Directorio Activo si su nivel funcional es 2003 Nativo o posterior. Este atributo se replica al resto de DCs, por lo que si nuestra replicación está funcionando como debe, cuando un DC actualiza el atributo se actualiza en los demás, manteniéndose el valor consistente a lo largo de todo el dominio
    • LastLogon está presente en todas los niveles funcionalidades de AD, en particular en 2000 y 2003 Mixto, pero tiene el inconveniente de que no se replica entre los diferentes DCs del dominio, sino que solo permanece en el DC que realizó la autenticación. Si usamos este valor como base, deberemos comprobar el valor de este atributo en todos los DCs del dominio

    El valor de estos atributos almacena los tiempos en un tipo de dato especial llamado Integer8, que almacena el número de intervalos de 100 nanosegundos desde el 1 de enero de 1601. Para realizar la conversión de una fecha/hora a este formato es conveniente tener a mano herramientas como esta. El paso contrario es sencillo, pues basta con usar w32time /ntte.

    Veamos como podemos sacar fácilmente esta información:

    • Con la herramienta DSQUERY, que hace amablemente por nosotros queries LDAP al AD sin que tengamos que ser un mago del *. Esta herramienta usa LastLogonTimeStamp, lo que significa que solo podremos usarlas contra directorios en niveles funcionales 2003 o superior. Simplemente deberemos definir el número de semanas que utilizaremos como criterio para detectar usuarios o equipos inactivos
      • DSQUERY user –inactive <nº de semanas>
      • DSQUERY computer –inactive <nº de semanas>
    • Para administradores frikis, podemos lanzar las siguientes queries LDAP (el valor corresponde al 1 de Agosto de 2008). Esto queda muy bonito en el apartado “Saved Queries” de la MMC de Usuarios y Equipos del Directorio Activo:
      • Equipos: (objectCategory=computer)(|(lastLogonTimestamp<=128442204000000000)(!(lastLogonTimestamp=*))
      • Usuarios: : (objectCategory=user)(|(lastLogonTimestamp<=128442204000000000)(!(lastLogonTimestamp=*))
      • Usuarios y equipos a la vez: (|(objectCategory=user)(objectCategory=computer))(|(lastLogonTimestamp<=128442204000000000)(!(lastLogonTimestamp=*)))
    • Para organizaciones basadas en Directorios Activos del pasado (perdón), deberemos usar las queries anteriores, pero usando el atributo LasLogon en lugar de LastLogonTimeStamp, y deberemos hacerlo contra todos los DCs del dominio para posteriromente sacar una especie de factor común y saber que se puede borrar y qué no.

    Si buscáis por Internet sobre estos atributos, obtendreis un montón de referencias a scripts basados en VBS, powershell, etc que hacen esto mismo

    2.- Dominios / Controladores de Dominio perdidos en combate

    Esto sucede cuando no se ha utilizado DCPROMO para eliminar los DCs de un dominio, y en el caso de los dominios cuando hemos olvidado la graciosa casilla “este es el ultimo DC del dominio”. Es decir, apagar DCs y borrar ramas del DNS no es ni mucho menos equivalente a eliminar dominios del AD:

    El proceso de eliminar del AD este tipo de objetos huérfanos se llama Metadata Cleanup, y suele incluir también un proceso de “seize” de los roles que tuvieran los DCs perdidos y que no han sido reasignados. Los paso a seguir están bien documentados en estos dos artículos de la Knowledge Base:

    • KB216498: How to remove data in Active Directory after an unsuccessful domain controller demotion
    • KB230306: How to remove orphaned domains from Active Directory

    3.- Lingering Objects

    Lo cierto es que a mi este nombre siempre me ha hecho gracia, ya que dando una enorme patada al diccionario de la lengua de Shakespeare, lo de los “objetos en paños menores” representa bien lo que son. Cuando borramos un objeto, por ejemplo como hemos hecho en el primer punto, no desaparece realmente de la base de datos sino que se le pone a TRUE el valor de su atributo IsDeteled, lo que se conoce como ponerle un tombstone. Los objetos así marcados serán borrados cada cierto tiempo (60 días en 2000 y 2003, o 180 días en 2003 SP1) mediante un proceso que hace las veces de camión de la basura (“garbage collection"). Pues bien, supongamos que hemos tenido un controlador de dominio parado o sin replicar por algún tipo de problema durante más tiempo que lo definido en el “Tombstone Lifetime”. Pues bien, en ese DC, los objetos borrados y eliminados están más frescos que una rosa, y se quedan en ahí, en paños menores, ya que el resto de DCs no quieren saber nada de ellos. dado que el camión de la basura ya pasó, no queda más remedio que llevarlos personalmente al vertedero:

    Todo esto así contado parece fácil de entender, pero en el fondo no lo es tanto ya que la forma en la que replica el Directorio Activo tiene su aquel. Así es que nunca está de más tener a mano la información de How the Active Directory Replication Model Works.

    Agradecimientos especiales a mis compañeros del grupo de soporte de Directorio Activo, quienes estarán encantados de responder a todas vuestras preguntas a través de su blog, que me ayudaron a acotar lo que podía caer bajo la categoría de “roña” en AD, y en especial a Javier Rama que encima tuvo la paciencia de ponerlo por escrito. En su correo me decía que tenía la sensación de que se nos olvidaba algo, y yo de hecho estoy seguro de que si (de hecho, no hemos hablado nada de NTFRS ni de sus colisiones, grupos vacíos, objetos de políticas de grupo…).

    ¿Que más roña te has encontrado tu en un AD?

    Saludos

    David Cervigón

  • Anuncios tras el letargo

    Hola de nuevo

    Tras un par de semanas en las que he tenido el blog hibernando, vamos a aprovechar la llegada de la primavera con un post sencillito sobre algunos anuncios que se me han ido acumulando entre el ajetreo diario y algunos días de asueto en el prado de la cabecera de esta página:

    Y por último en el apartado de destacados, el Evento Virtualización Inteligente que tendrá lugar en Madrid y Barcelona los días 31 de Marzo y 2 de Abril respectivamente. Intel, Microsoft, HP, Dell, Sun, Fujitsu-Siemens, Quest, Citrix y NetApp todos juntos y revueltos mágicamente para hablar de virtualización en un evento de mañana y tarde.

    Saludos

    David Cervigón

  • Cómo evitar que dos grupos coincidan en el mismo nodo de un cluster

    O lo que es lo mismo, cómo evitar que dos máquinas virtuales coincidan en el mismo nodo de un cluster. Esto puede tener ciertas aplicaciones para aumentar la alta disponibilidad y la tolerancia a fallos de lo que quiera que sea que este corriendo por encima. Por ejemplo:

    • Controladores de dominio. No queremos que, por ejemplo, los dos que tenemos se caigan juntos si lo hace el nodo sobre el que están corriendo.
    • Nodos de clusteres virtuales. Tampoco queremos que los dos nodos de un cluster virtual corran sobre le mismo nodo del cluster físico. De este modo, un fallo de un nodo físico
    • Nodos de granjas NLB. Puede interesarnos que los frontales de una granja estén siempre los más repartidos posible entre los nodos físicos, de modo que la caída de uno de ellos afecte lo menos posible a la carga de trabajo que pude asumir el conjunto.
    • Reparto de la carga de trabajo (CPU, IO, red…). Puede que tengamos algunas VMs muy pesadas, y queremos que no lleguen a coincidir en un mismo nodo en la medida de lo posible.
    • Etc.

    Esto obviamente se puede hacer solo si tenemos más de dos nodos en el cluster, y generalmente se logra mediante la configuración de los “Possible Owners” del grupo. A mayor número de nodos, más podemos confiar en que de este modo disminuya la probabilidad de que ciertos grupos coincidan en el mismo host.

    Si queremos un mayor grado de control podemos usar una propiedad pública que puede tener todo grupo de cluster llamada AntiAffinityClasNames. Dicha propiedad puede almacenar un cierto numero de cadenas de caracteres que actúan a modo de etiquetas de modo que si en ese nodo está corriendo un grupo con una etiqueta coincidente, pasaremos al siguiente “possible owner”. Se especifica mediante este simple comando:

    • cluster group "<group name> /prop AntiAffinityClassNames="<value1>"," <value2>"

    Siguiendo los ejemplos anteriores supongamos que en un cluster tenemos dos VMs que son dos controladores de dominio, que están definidas en dos grupos de cluster llamados DC1 y DC2. Además, DC2 es también a su vez un nodo de un cluster virtual de tres nodos, nodo1, nodo2 y DC2 (estupenda mala idea, pero si no no me sale el ejemplo). Entonces:

    • cluster group "DC1" /property AntiAffinityClassNames="NoAjuntoAOtroDC"
    • cluster group "DC2" /property AntiAffinityClassNames="NoAjuntoAOtroDC",”NoAjuntoAOtroNodo”
    • cluster group "nodo1" /property AntiAffinityClassNames=”NoAjuntoAOtroNodo”
    • cluster group "nodo2" /property AntiAffinityClassNames=”NoAjuntoAOtroNodo”

    De este modo, DC1 y DC2 evitarán coincidir porque tienen "NoAjuntoAOtroDC" y nodo1, nodo2 y DC2 también se evitarán porque tienen ”NoAjuntoAOtroNodo”.

    Es importante mencionar que aquí la palabra evitar no significa una prohibición total. Es decir, en caso de ser necesario, en última instancia los grupos pueden acabar por levantarse en el mismo nodo. Basta con probarlo en un cluster con solo dos nodos. La propiedad no evita el failover en ningún caso al no existir mas posibles propietarios que el único nodo que queda vivo.

    La descripción exacta del comportamiento del sistema de failover, un artículo un poco más extenso sobre todo esto, y la descripción de la propiedad AntiAffinityClasNames se pueden encontrar en estos enlaces:

    Como reza el título, esto vale para cualquier tipo de grupo de recursos de cluster, y no solamente para VMs en HA. Huelga decir que estamos hablando de tolerancia a fallos. Los movimientos de maquinas virtuales entre nodos, manuales o automáticos, pueden llegar a tener una riqueza en su control mucho más fina.

    Saludos

    David Cervigón

  • Una snapshot no es lo mismo que una snapshot

    Elemental. Al igual que es evidente que una instantánea no es igual que una instantánea, no sea que alguien me riña por usar los anglicismos.

    Cuando se habla de hacer copias de seguridad de máquinas virtuales surgen técnicas y métodos para todos los gustos, y el problema es que a dos de ellas se les da desafortunadamente el mismo nombre. Vamos a ver algunas opciones:

    1. Snapshots/Instantáneas de las que aparecen como acción en la consola de Hyper-V. Es seguramente el peor método de copia de seguridad que podemos utilizar para una máquina virtual, con ciertas salvedades. La razón subyace en su propio funcionamiento. Una instantánea consiste básicamente en un fichero diferencial respecto al VHD de la máquina (AVHD) más una copia de la configuración (xml) de la VM y, si se obtuvo con la máquina encendida, un par de ficheros que representan el estado de la memoria y el procesador (.vsv y .bin). Además, las instantáneas de Hyper-V pueden encadenarse unas con otras, creando árboles con ramas que representan diferentes estados de ejecución a los que podemos volver, y que podemos descartar en cualquier momento. Esta característica es importante en durante los procesos de instalación y configuración de equipos, en baterías de pruebas y desarrollo, e incluso en situaciones en las que debemos probar un parche o un cambio en un momento dado. Sin embargo su uso como estrategia de seguridad tiene las siguientes e importantes limitaciones:
      • Los .avhd son discos diferenciales de crecimiento dinámico, por lo que tienen un impacto en el rendimiento de la máquina virtual. A mayor número de snapshots existentes entre el VHD original y el estado de ejecución actual, más se acumula este efecto.
      • La restauración de un punto anterior supone una vuelta atrás en el estado de ejecución de la máquina. El ir y venir por el túnel del tiempo puede tener consecuencias nefastas en cualquier aplicación o servicio mínimamente transaccional que corra dentro de la VM. Controladores de dominio, bases de datos, sistemas de correo, etc., sobre todo si no están solos en la red y si están en producción, deberían tener esta operación estrictamente limitada.
      • Cuando descartamos instantáneas, dejamos pendientes operaciones de fusión de datos entre los .vhd y los .avhd. Estos “merge” no suceden inmediatamente sino que se llevan a cabo cuando apagamos la VM. Si no somos conscientes de este hecho, es posible que ocurra justo en el momento en el que no nos podemos permitir el tiempo de caída que supone el proceso
    2. Parar la máquina virtual y copiar el/los .VHD de los que consta la VM. Es quizás uno de los métodos de backup más utilizados por muchos de nosotros, a la par que cutre.
      • Al igual que el anterior tiene la pega de que su “restauración” supone, como todas, una perdida de datos, pero es tan evidente que somos conscientes de ello y lo asumimos de forma natural.
      • Por otro lado, los VHD solo contienen la información de la VM. Su configuración radica en el .xml asociado, y al volver a crear la VM en su ausencia, notaremos principalmente que se nos crean unas nuevas tarjetas de red. Esto sucede porque en ese .xml se referencian unos identificadores únicos para los elementos de la VM que se regeneran al crear la VM desde cero.  Puede también copiarse todo el sistema de carpetas que contienen el .xml y los .vhd al igual que hacíamos en Virtual Server con los .vmc y .vhd. Sin embargo deberemos registrar manualmente la VM, lo que logramos creando un “hard link” al .xml en una carpeta del sistema en particular. Hace tiempo puse por aquí un pequeño script para ello.
    3. Usar la función exportar/importar incluida en Hyper-V. Debe hacerse con la máquina parada, o con el estado salvado, y permite llevarnos todo lo necesario para restaurar una VM a otra localización. Esta funcionalidad está detrás de algunas acciones de SCVMM como las migraciones y  los clonados. Para importar la VM de nuevo, deberemos copiar el conjunto de carpetas y archivos a la localización final donde deseamos que resida la VM, e importarlo desde la consola de Hyper-V
    4. image Snapshots/Instantáneas basadas en VSS. Estas son las buenas y es lo que podemos llamar estrictamente copias de seguridad de máquinas virtuales, que se pueden sacar en caliente o templado, según cómo las estemos obteniendo. La idea es sacar una copia consistente de los VHDs mientras están siendo utilizados por la VM, y esto puede suceder a dos niveles:
      • Copia consistente de los VHDs a nivel de partición padre. En resumen, estamos usando el VSS provider de Hyper-V para que nos dé un snapshot de los .VHD en estado consistente. De esta manera solamente garantizamos la consistencia de los VHDs a nivel de fichero, pero no podemos garantizar nada a nivel de los ficheros que haya dentro de esos VHDs. La única manera de hacerlo es pausando la VM mientras los VHDs se están copiando. A esto se le llama generalmente Offline Backup.
      • Copia consistente de los VHDs a nivel de partición hija. Para eso se necesita la inestimable colaboración de los componentes de integración instalados en el sistema operativo de la VM. En este caso usamos el VSS provider de Hyper-V para sacar la copia consistente del VHD, pero se solicita a la VM mediante sus componentes de integración que ponga en estado consistente todos los datos mediante los VSS providers registrados. Esto garantiza la consistencia tanto a nivel de VHD como de los datos que residen dentro de dicha VM. Esta copia de seguridad puede llevarse a cabo totalmente en caliente, sin interrupción de la ejecución de la VM, razón por la cual se la llama Online Backup.
    5. Copia de seguridad a nivel de la VM. Es decir tratando a la VM como si fuese un servidor físico, y usando las herramientas de copia de seguridad como siempre.

    Una buena estrategia de recuperación de desastres debe pasar por una combinación de los puntos 3 (automatizado), 4 y 5, dejando los 1, 2 y 3 (manual) para pruebas sin importancia e informática recreativa.

    Ya hablaremos más en detalle de como usar Virtual Machine Manager y sobre todo Data Protection Manager para todo esto, sin ser desde luego los únicos productos del mercado que lo hacen. Mientras tanto, algunas lecturas interesantes al respecto:

    Saludos

    David Cervigón

  • Cambiando herramientas

    Hola

    Llevo toda la semana de acá para allá y en los ratos libres he estado dando una vuelta a la configuración de mis máquinas de trabajo, aprovechando el cambio de una de ellas. Desde Octubre he estado utilizando equipos prestados para una u otra cosa, y durante este tiempo me he dado cuenta de que necesitaba cambiar un poco la forma de trabajar y aplicarme un poco el cuento de la virtuazación y el “cloud computing”. En mi caso Microsoft tiene a bien dotar la posición que ocupo con dos equipos, uno pensado para trabajar y otro para pruebas y demos. El cómo se utilicen finalmente esas máquinas, es asunto de cada uno.

    Había estado usando un equipo portátil grandote (17” y 8GB) como estación de trabajo y a la vez para correr la miríada de VMs que necesito en mi día a día. Es una estrategia útil, pero:

    • Un portátil con Hyper-V no puede ni suspenderse ni hibernarse, y además cuanto mejor es la tarjeta de video, peor es el rendimiento de sus operaciones. (Si usas Hyper-V en un portátil, el mejor rendimiento de la partición padre lo obtienes con el driver de la VGA Estándar, pero si tienes que proyectar, por ejemplo, pues es un problema)
    • Un equipo de 17” casi no cabe en la bandejita de los asientos del AVE, y lo que es peor, no deja sitio para la escasa merienda y la botellita de vino de 25 c.c. Además el calor que despide y lo que pesa sobre las piernas es malo para la salud, seguro.
    • Padezco un grave e-Diógenes. He llegado a contar más de 30 aplicaciones en la aplicación padre, y ni se sabe las carpetas con megas y megas de cosas de todo tipo. Por ejemplo, un bonito documento de cómo escribir ficheros .inf para Windows 95. Me he dado cuenta de que además este mal no tienen cura. No lo pienso borrar.

    Viendo por donde vienen los tiros a corto plazo, he decidido trabajar de la siguiente manera:

    • Portátil de 12” y 4 GB: Equilibrio perfecto entre potencia y portabilidad. Tres particiones. Una con Windows 7, unida al dominio de Microsoft para trabajar, instalando las herramientas mínimas para realizar el trabajo del día a día. Otra con una instalación de Windows Server 2008 Enterprise con el role de Hyper-V, simplemente con los drivers necesarios para correr las VMs que sea capaz. La última con los datos necesarios para trabajar. PSTs, documentos, presentaciones y los VHDs de las VMs que corran del disco local (otras lo harán de discos USB para repartir el IO, principal cuello de botella en esta configuración).
    • Portátil de 17” y 8 GB: Buena potencia, y todavía portable. Dos particiones. Una para Windows Server 2008 con Hyper-V, con ciertas herramientas ofimáticas que permitan un uso ocasional de este equipo también como estación de trabajo, y otra para datos. La idea es desplazar el e-Diogenes a esta segunda residencia, y si es posible, almacenar la roña en dos localizaciones. Un USB dedicado a ficheros de todo tipo (el nombre correcto de esto es un USB dedicado a “Archiving”). Las múltiples aplicaciones que uno se dedica a probar o que usa de forma ocasional quedaran distribuidas entre la partición padre y una VM personal dedicada a este tipo de cosas.

    De esta manera, en “modo demo” cuento con un dominio virtual basado en dos hosts físicos con Hyper-V, capaces de correr lo que quepa que 12 Gb, dos discos SATA internos y dos o tres discos USB externos. Mientras me dedico a otros menesteres, disfruto de Windows 7 mientras que el otro equipo es capaz de mover todo lo que 8Gb, un SATA interno y varios USB externos son capaces de albergar.

    Cuando se vaya acercando el lanzamiento de las versiones finales de Windows 7 y Windows Server 2008 R2 / Hyper-V Server R2 esta aproximación seguramente evolucionará. Tengo pendiente contar un poco más de lo que cuenta Cesar acerca del arranque de VHD que soportan estas versiones, y de las posibilidades que esto ofrece, y de alguna otra cosa más que ya contaremos.

    Saludos

    David Cervigón