Corrigindo falha de migração do XenServer para o Azure

Fala pessoal! Tudo bem? Vou fugir um pouco do assunto de M365 para passar uma experiência que tive em uma migração para o Microsoft Azure. Para você que está migrando da Citrix On-premises para o Azure, este artigo é para você!


O cenário é resumidamente assim: em uma migração de XenServer para o Microsoft Azure e tive um problema muito peculiar, ao fazer o failover para a nuvem. Todas as VMs Windows, durante o failover, inicializavam esta tela:

tela de oções de recuperação de sistema

Pelo fato de tudo aparecer a tela de recuperação de sistema, eu não tinha como interagir com a Máquina virtual. Após uma análise com o time Premier da Microsoft, este foi o finding que eles tiveram:

Findings

=======
1. Dump Info
Dump Name: memory2.dmp
Windows 7 Kernel Version 7601 (Service Pack 1) UP Free x64
Product: WinNt
Built by: 7601.24545.amd64fre.win7sp1_ldr_escrow.200102-1707
Kernel base = 0xfffff800`01666000 PsLoadedModuleList = 0xfffff800`0189fc90
System Uptime: 0 days 0:00:00.671
Bugcheck: 7E (FFFFFFFFC0000005, 220, FFFFF880009B0C68, FFFFF880009B04D0)
Kernel Complete Dump File: Full address space is available.
 
2. Bugcheck
SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (7e)
This is a very common bugcheck.  Usually the exception address pinpoints
the driver/function that caused the problem.  Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: ffffffffc0000005, The exception code that was not handled
Arg2: 0000000000000220, The address that the exception occurred at
Arg3: fffff880009b0c68, Exception Record Address
Arg4: fffff880009b04d0, Context Record Address
 
3. Call Stack
# Child-SP          RetAddr           Call Site
00 fffff880`009afca8 fffff800`01a091a4 nt!KeBugCheckEx
01 fffff880`009afcb0 fffff800`019c29ec nt!PspUnhandledExceptionInSystemThread+0x24
02 fffff880`009afcf0 fffff800`016e8248 nt!PspSystemThreadStartup$filt$0+0xe
03 fffff880`009afd20 fffff800`017011fd nt!__C_specific_handler+0x8c
04 fffff880`009afd90 fffff800`016c1125 nt!RtlpExecuteHandlerForException+0xd
05 fffff880`009afdc0 fffff800`017e0eee nt!RtlDispatchException+0x415
06 fffff880`009b04a0 fffff800`017083c2 nt!KiDispatchException+0x17e
07 fffff880`009b0b30 fffff800`017060a8 nt!KiExceptionDispatch+0xc2
08 fffff880`009b0d10 00000000`00000220 nt!KiPageFault+0x428
09 fffff880`009b0ea0 fffff880`011db028 0x220
0a fffff880`009b0ea8 fffffa83`02095910 xen+0x1028
0b fffff880`009b0eb0 fffff880`009b0f50 0xfffffa83`02095910
0c fffff880`009b0eb8 fffff880`011e6239 0xfffff880`009b0f50
0d fffff880`009b0ec0 fffff880`011de202 xen!HypercallPopulate+0xd9
0e fffff880`009b0ef0 fffff880`011dc420 xen!XenVersion+0x22
0f fffff880`009b0f20 fffff880`01001bd8 xen!XenTouch+0x50
10 fffff880`009b0f80 fffff800`01bedc48 xenfilt+0x1bd8
11 fffff880`009b1140 fffff800`01bedd9e nt!IopInitializeBuiltinDriver+0x368
12 fffff880`009b1210 fffff800`01bedfa2 nt!PnpInitializeBootStartDriver+0xbe
13 fffff880`009b1290 fffff800`01b4c229 nt!PnpLoadBootFilterDriver+0x142
14 fffff880`009b1300 fffff800`019cfd61 nt!PipCallDriverAddDeviceQueryRoutine+0x269
15 fffff880`009b1400 fffff800`0193543a nt!RtlpCallQueryRegistryRoutine+0x9ae65
16 fffff880`009b1480 fffff800`01a84c96 nt!RtlQueryRegistryValues+0x17e
17 fffff880`009b1550 fffff800`01a84f6f nt!PipCallDriverAddDevice+0x5d6
18 fffff880`009b1700 fffff800`01bec95e nt!PiProcessAddBootDevices+0x4f
19 fffff880`009b1730 fffff800`01ac7ed1 nt!PipAddDevicesToBootDriverWorker+0x1e
1a fffff880`009b1760 fffff800`01bdf0c3 nt!PipApplyFunctionToServiceInstances+0x1e1
1b fffff880`009b17e0 fffff800`01bee7bc nt!PipAddDevicesToBootDriver+0x33
1c fffff880`009b1830 fffff800`01bef20f nt!IopInitializeBootDrivers+0x4cc
1d fffff880`009b1900 fffff800`01bf2463 nt!IoInitSystem+0x80f
1e fffff880`009b1a00 fffff800`01b555b9 nt!Phase1InitializationDiscard+0x1293
1f fffff880`009b1bd0 fffff800`019a52e8 nt!Phase1Initialization+0x9
20 fffff880`009b1c00 fffff800`016ffec6 nt!PspSystemThreadStartup+0x194
21 fffff880`009b1c40 00000000`00000000 nt!KxStartSystemThread+0x16
 
4. Process
Found KCB = fffff8a0000c9a70 :: \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES\XENFILT
 
Hive         fffff8a000024010
KeyNode      fffff800012777fc
 
[SubKeyAddr]         [SubKeyName]
fffff80001278a74     Parameters
 
[SubKeyAddr]         [VolatileSubKeyName]
fffff8a000041da4     Enum
 
 Use '!reg keyinfo fffff8a000024010 <SubKeyAddr>' to dump the subkey details
 
[ValueType]         [ValueName]                   [ValueData]
REG_DWORD           Type                          1
REG_DWORD           Start                         0
REG_DWORD           ErrorControl                  1
REG_DWORD           Tag                           8
REG_EXPAND_SZ       ImagePath                     system32\drivers\xenfilt.sys
REG_SZ              DisplayName                   XenServer Generic Bus Filter
REG_SZ              Group                         Boot Bus Extender
 
Next action
==========
According to our analysis, the issue is due to system loads the xenfilt.sys driver as a system driver during boot up process, which is not necessary for both Azure VM and hyper-v VM.

Ou seja, o que causou o problema em questão foi o driver de inicialização presente no XenServer Tools. Durante as conversas com o time Microsoft, eles informaram que realmente o Azure Site Recovery não possui suporte para lidar com ambientes baseados em Xen. Desta forma, é possível que erros como este sejam frequentes nas migrações.

O driver em questão foi o xenfilt.sys e a Microsoft solicitou a remoção. A seguir, eu apresento como fiz para remover o driver. Devo informar que este processo somente foi testado em Windows Server 2008 R2 SP1.

Infelizmente, não há garantia de que seja o mesmo para outras versões do Windows Server. Novos artigos serão postados em caso de haver um processo diferenciado.

Leia este aviso!

Aviso: NÃO REALIZE ESTE PROCESSO se você NÃO POSSUIR uma solução de backup existente no seu ambiente. Este guia tem por objetivo apresentar o que funcionou para o ambiente onde apliquei estas alterações. A partir das próximas estapas, siga por sua conta em risco.

Agora que você entende os riscos, acesse a VM que você pretende migrar e siga as etapas a seguir:

  1. Vá ao Menu Iniciar > Digitar “msconfig” e pressionar enter;
  • Então, na aba Services > marcar o checkbox Hide all Windows Services e desmarcar TODOS os serviços do XenServer, pode ser que apareça mais de um, faça questão de desmarcar também. Finalizada esta atividade, clicar em Apply seguido de OK.
  • Ao receber o pop-up de aviso do Windows para reinicialização do sistema clique em Restart;

* Se por qualquer motivo você for impedido de reinicializar o servidor force a reinicialização mesmo assim. NÃO prossiga para a próxima etapa enquanto esta não tiver sido concluída com êxito. Caso tenha ocorrido qualquer problema com o servidor, restaure o Snapshot e comece novamente as etapas.

  • Entre novamente no Menu Iniciar > Painel de Controle
  • Troque a visualização do Menu para “Ícones Grandes” ou “Ícones pequenos”, à sua escolha;
  • Clique em Programs and Features e desinstale os aplicativos da Citrix, iniciando pelo Agent, em seguida PV, e depois cada um dos drivers individualmente (se houver). Caso nenhuma das ferramentas XenServer tools esteja instalada, vá para a próxima etapa;
  • Em C:\Windows\System32\drivers\, mova todos os arquivos xen*.sys para uma pasta de backup, conforme abaixo:
  • Clique no Menu Iniciar, digite regedit e pressione enter;
  • Exporte a chave HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\xenfilt\ para uma pasta de backup e REMOVA;
  1. Exporte a chave HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\services\xenfilt\ para uma pasta de backup e REMOVA;
  1. Procure por mais ocorrências da chave xenfilt e remova.
  2. Ainda no Regedit, procure por estas classes  HKLM\SYSTEM\CurrentControlSet\Control\Class{4d36e96a e HKLM\SYSTEM\CurrentControlSet\Control\Class{4d36e97d e LIMPE o valor “XENFILT” do registro UpperFilters. Deixe vazio se for necessário;
  1. Reinicie a VM.

Conclusão

Aqui você pode ver como corrigir estre problema de driver que impediu a inicialização bem sucedida do Windows após uma tentativa de migração para o Azure. Se este guia ajudou você, compartilhe para que mais pessoas tenham acesso a este conteúdo!

Com isso termino este artigo. Muito obrigado por ter lido até aqui e até a próxima!