sábado, 5 de agosto de 2017

Cliente NFS dañado: Troubleshooting con Process Monitor de sysinternals

En un servidor corriendo Windows Server 2003 que debía montar unas unidades de red NFS, me topé con el siguiente caso:

  • Al intentar mapear un NFS export desde el explorador de Windows se recibe el error “Network Path not found”. Lo mismo sucede con los comandos net use y mount.  

Si ahí terminara la cosa, sería una buena justificación para culpar al NFS, pero lo mas raro es el otro síntoma:

  •   Al escribir la ruta de red desde el menú ejecutar, se puede acceder al export NFS correctamente, aunque se siente algo de lentitud al recorrer directorios o copiar archivos. 

Las primeras pruebas realizadas -sin éxito- fueron tan básicas como crear un nuevo perfil de usuario y verificar que el servicio "Estación de trabajo" esté iniciado. Luego de algunas búsquedas de problemas similares, intenté verificar la negociación de versión de NFS y descartar alguna que algún recurso NFS accedido anteriormente haya dejado una configuración residual de AnonymousUID o AnonymousGID en el registro. Llegué a intentar soluciones tan desesperadas como tratar de engañar al Windows con un enlace simbólico al NFS.

Era hora de utilizar la famosa premisa que repite Mark Russinovich en cada una de sus sesiones "The case of the unexplained": Ante la duda, ejecuta Process Monitor.

Ejecuto Process Monitor y dejo corriendo las trazas sin filtros, intento montar con net use el NFS share y con la función find de Process Monitor busco la cadena de texto correspondiente a la dirección IP del servidor NFS. Aquí encuentro la primera pista útil, en el path que llama el proceso explorer puede verse una cadena de texto extraña en la ruta del export NFS, con un resultado de BAD_NETWORK_NAME.




Comparando esta traza con otra tomada en un sistema que funciona correctamente se comprueba que desde luego, esa cadena de texto es completamente anormal. Otra busqueda revela que RDPNP, que es el lo que se agrega al path del NFS, es un proveedor de red controlado por la librería mpr.dll (Multiple Provider Router):



Technet - Multiple Provider Router:
The Multiple Provider Router (MPR) handles communication between the Windows operating system and the installed network providers. It enables Windows to present an integrated network to the user.When the MPR starts, it checks the registry to determine which network providers are installed on the system and the order they should be cycled through. It loads all registered network provider DLLs and uses them to process subsequent WNet calls made by the user interface or other applications.
Curioso por conocer la evidente diferencia entre los mecanismos para acceder a un recurso de red mediante net use y acceder mediante el menú ejecutar, y ya con la librería mpr.dll ya en la mira, le dí una revisión al libro de Mark Russinovich "Windows Internals: 6th Edition", un libro "viejo" para los estándares de los libros de IT (Basado en Windows Vista y Server 2008), pero aún así vigente en su mayor parte. El siguiente diagrama muestra que hay dos vías para llegar a un recurso de red NFS, via el Multiple Provider Router o vía User Mode.





Esto explica porque es posible acceder al NFS share vía el menú ejecutar pero no es posible montarlo, pero aún no resuelve el problema. El siguiente paso fué un sfc /scannow seguido de una verificación del hash del archivo mpr.dll y posteriormente compararlo con el mismo archivo en otro servidor funcional. También se compararon permisos entre ambos archivos, lectura y ejecución, todo se ve normal en el archivo en sí.

Paso al registro, toca revisar los Network Providers, estos son unos mini-redirectores proveídos por Microsoft o terceros para acceder a servicios de Red como SMB, NFS, Unidades compartidas mediante Terminal Server y WebDav, estos redirectores están seteados en la clave del registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order\ProviderOrder, usualmente deben verse como en la siguiente imagen:


En el sistema afectado esta clave tiene un solo provider, correspondiente al componente SnacNP del fabricante Symantec:



Mientras que en otro sistema funcional se ve que el SnacNP se antepone a los demas providers:



Al intentar desinstalar el software encuentro que el mismo ya no está presente en el sistema, lo cual es bueno, pero evidentemente su instalación/desinstalación fue errática, ya que cuando fue instalado el SnacNP de Symantec sobrescribió completamente el valor existente en este sistema, en lugar de simplemente agregar la cadena de texto necesaria.

Otra curiosidad es que al intentar agregar los providers manualmente desde Centro de Redes y Recursos Compartidos > Configuración del Adaptador > Configuración avanzada, había una pestaña ausente:



Mientras que en un servidor sano vemos lo siguiente:




Finalmente el problema se corrigió editando el registro y agregando las cadenas faltantes (LanmanWorkstation, RDPNP y Nfsclientnp) al registro. Con esto ya apareció la pestaña de Network Providers que no se veía anteriormente, se logró montar la unidad NFS y la performance del recorrido por los directorios mejoró notablemente.

Por último, dejo algunos enlaces interesantes sobre el uso de las herramientas de sysinternals para troubleshooting en Windows:











martes, 1 de agosto de 2017

Bash en Windows 10: Como habilitar el Subsistema de Windows para Linux

Hace unos días Microsoft anunció que el Subsistema de Windows para Linux ya salió de version beta. Esta característica, que estaba disponible para usuarios de Windows Insider ya desde el año pasado, pasa ahora a ser un feature estable que estará disponible en los releases generales del sistema operativo.

Antes de instalar el feature, debemos verificar que nuestra versión de Windows es la 1607 en adelante, desde Configuración > Sistema > Acerca de, o desde PowerShell:

PS C:\WINDOWS\system32> [environment]::OSVersion.Version

En mi caso tengo el Build 14393, que corresponde al build 1607 de acuerdo a este articulo.





Para habilitar esta característica, ejecutar el siguiente comando desde una sesión de PowerShell corriendo con permisos elevados:

PS C:\WINDOWS\system32> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux



Luego del reinicio, en el Windows Store, hay 3 distribuciones de Linux que podemos elegir:
  • ubuntu
  • sles12
  • opensuse-42
Para instalar ubuntu desde PowerShell, ir a Configuración --> Actualización y Seguridad --> Para programadores y elegir Modo de programador. Luego de esto, con el comando bash se iniciará la descarga de ubuntu. Al finalizar la descarga, deben configurarse las opciones regionales y el nombre de usuario.



Si se presenta algún problema durante la instalación desde el Windows Store, este articulo de MSDN recopila los problemas mas comunes que se presentan y como solucionarlos.


      lunes, 31 de julio de 2017

      Node fairness: Controlando el Balanceo de maquinas virtuales en Hyper-V 2016

      En Windows Server 2016, Microsoft introdujo una nueva característica de Failover Clustering disponible exclusivamente para el rol Hyper-V. Se trata de Node Fairness, una funcionalidad pensada para mantener balanceada la carga de los nodos del cluster redistribuyendo maquinas virtuales cuando detecta que algún nodo esta sobrecargado. Las maquinas virtuales se mueven a nodos con menor carga mediante migraciones en vivo y por lo tanto sin disrupción de servicios.



      El feature viene activo por defecto y ya sea mediante Powershell o la consola de Failover Cluster Manager, puede desactivarse, configurar cuando entrará en acción y ajustar la agresividad de la heuristica que utiliza el cluster para determinar cuando un nodo esta sobrecargado.

      AutoBalancerLevel

      Hay 3 niveles de agresividad para esta heuristica:

      AutoBalancerLevel Agresividad Porcentaje de carga del Host
      1 Baja 80%
      2 Media 70%
      3 Alta 60%


      Para visualizar el valor por defecto:

      PS C:\Users\Administrador.CONTOSO> Get-Cluster -Name cluster01 | fl autobalancerlevel
      AutoBalancerLevel : 1

      Como puede verse, AutoBalancerLevel esta por defecto establecido en 1, un valor bastante relajado, que indica que si la CPU o memoria llegan al 80% de uso deberá empezar a hacer migraciones en vivo de maquinas virtuales a otros nodos del cluster.

      Para ajusta el valor de AutoBalancerLevel con PowerShell:

      PS C:\Users\Administrador.CONTOSO> (Get-Cluster).AutoBalancerLevel = 2


      AutoBalancerMode

      Otro valor configurable es AutoBalancerMode, que determina en que momentos se verificará la carga de trabajo de los nodos, por defecto viene establecido 2, lo cual hace uso de los nuevos nodos agregados al cluster para rebalancear la carga de VMs y también controla cada 30 minutos que ningún nodo este sobrecargado, de forma que si algún nodo del cluster falla y las maquinas virtuales migran a otros nodos, Node Fairness se encargará de corregir la distrubución de carga de VMs en los nodos sobrevivientes.

      AutoBalancerMode Comportamiento
      0 Deshabilitado
      1 Balancear solo al agregar nuevos nodos
      2 Balancear al agregar nodos y cada 30 minutos

      Para cambiar este valor con PowerShell:

      PS C:\Users\Administrador.CONTOSO> (Get-Cluster).AutoBalancerMode = 1  


      Para modificar estos valores desde la consola Failover Cluster Manager, en las propiedades del clúster, modificar las opciones de la pestaña equilibrador:



      Salvo excepciones por necesidades específicas, la configuración por defecto es apropiada para la mayoría de los escenarios. Node Fairness respeta las políticas existentes de anti-affinity y possible owners configuradas en el cluster.

      Balanceo de VMs en Virtual Machine Manager

      En un clúster manejado por VMM, Node Fairness se desactiva automáticamente en favor del feature Dynamic Optimization presente desde Virtual Machine Manager 2012, cuya funcionalidad es equivalente e incluso va un poco mas allá, permitiendo configurar que el balanceo ocurra en schedules establecidos por el administrador.


      sábado, 29 de julio de 2017

      Virtual Machine Manager: Error durante fase "specialize" al crear VM desde plantilla

      Recientemente estuve realizando un deployment del controlador SDNv2 de Microsoft Network Controller en un ambiente de pruebas, para esto utilice la plantilla de servicio para VMM disponible en el Github de Microsoft. La tarea terminaba con un warning e inspeccionando la consola de las 3 máquinas virtuales en todas aparecía el siguiente error:

      Error durante el sysprep de los nodos de Network Controller
       
      Luego de otros intentos fallidos tratando de determinar si se trataba de que el VHD de Windows Server 2016 estuviese dañado, me fijé en un detalle mas básico que omití modificar en el template de VMM, la zona horaria establecida en la plantilla era distinta a la del Domain Controller del lab, y para complicar aún mas el escenario, el servidor VMM también tenía otra zona horaria. Luego de corregido este detalle el deployment del servicio finalizó correctamente. Si bien este no era mi caso, otra causa de este error podría ser que la cuenta especificada en la plantilla para unir el equipo al dominio no cuente con privilegios para hacerlo.

      En otros casos donde el origen del error no sea tan evidente, puede montarse el VHD de la VM problemática y revisarse la ruta %WINDIR%\Panther\ para investigar que datos arroja el log del sysprep.