O meu Home Lab é composto por quatro servidores montados com as populares HUANANZHI X79 Green Motherboard compradas no AliExpress, e quando fui realizar o deploy do VCF 9 estava ocorrendo uma falha no momento de migração do DVS das Máquinas Virtuais. 

Ao investigar, para minha surpresa (e frustração!), todas essas placas-mãe possuem o mesmo SMBIOS UUID de fábrica. Pelo que pude perceber, isso é um cenário comum com certos fabricantes de hardware de baixo custo, que não se preocupam em gerar identificadores únicos para cada unidade.

Claro que para quase tudo tem uma solução, esse probleminha não é diferente. Vou mostrar como podemos dar um bypass nisso, mas antes irei dar um pouco mais de contexto.

Entendendo o Problema: Por Que SMBIOS UUIDs Duplicados Causam Falha no VCF 9?

Para entender a raiz do problema, precisamos revisitar o conceito de identificadores únicos no ambiente VMware e/ou a importância do instanceUUID e do BIOS UUID para as máquinas virtuais. No entanto, o problema aqui é com o SMBIOS UUID do próprio host ESXi.

O SMBIOS UUID é um identificador único de hardware que o firmware do seu servidor (BIOS/UEFI) reporta ao sistema operacional. Em hosts idênticos, especialmente mini PCs ou servidores de baixo custo, é comum que o fabricante não se preocupe em gerar um SMBIOS UUID único para cada unidade, resultando em identificadores duplicados.

Quando o VCF Installer conclui o deployment do vCenter Server, ele orquestra a criação de um cluster vSphere. Parte fundamental desse processo é a implantação das máquinas virtuais de serviço vCLS (vSphere Cluster Services), isso é padrão e já sabemos disso. 

A questão é que quando qualquer VM é criada, a sua identificação é derivada do SMBIOS UUID do host ESXi.

Se dois ou mais hosts no seu cluster VCF tiverem o mesmo SMBIOS UUID duplicado, o vCenter Server irá criar VMs vCLS com identificadores duplicados. O resultado é uma falha no deployment do VCF, com uma mensagem de erro similar a esta no log /var/log/vmware/vcf/domainmanager/domainmanager.log

com.vmware.evo.sddc.common.client.vmware.vsphere.NoUniqueReferenceException: Expected 1 but found multiple MORs of a type VirtualMachine and name vCLS-03000200-0400-0500-0006-000700080009

Essa mensagem indica claramente que o vCenter esperava encontrar apenas uma VM com aquele identificador, mas encontrou múltiplas, devido aos SMBIOS UUIDs idênticos dos hosts subjacentes.

Workaround 1: Personalizando o SMBIOS UUID do seu Host ESXi

A boa notícia é que podemos “enganar” o ESXi para que ele reporte um SMBIOS UUID diferente do que o hardware físico oferece. Isso é feito em duas etapas principais: instruir o ESXi a ignorar o UUID do hardware e, em seguida, injetar um UUID personalizado.

Vamos precisar de acesso SSH a cada um dos seus hosts ESXi e, para facilitar a geração do comando de injeção, usaremos um script PowerShell do William Lam.

Passo 1: Ignorando o SMBIOS Padrão do Hardware

O primeiro passo é dizer ao ESXi para não usar o SMBIOS UUID que ele detecta do hardware.

01. Habilite e acesse seu host ESXi via SSH: Certifique-se de que o SSH está habilitado no seu host ESXi. Você pode fazer isso via vSphere Client ou diretamente no console do host.

02. Edite o arquivo /bootbank/boot.cfg: Use um editor de texto como vi para abrir o arquivo.
vi /bootbank/boot.cfg

03. Adicione ignoreHwSMBIOSInfo=TRUE à linha kernelopt: Procure pela linha que começa com kernelopt. Adicione o parâmetro ignoreHwSMBIOSInfo=TRUE ao final dessa linha, separando-o dos outros parâmetros por um espaço.

SMBIOS UUID

04. Salve o arquivo e reinicie o host ESXi: Após salvar as alterações, um reboot é necessário para que a configuração entre em vigor.

05. Repita: Repita este passo para CADA um dos seus hosts ESXi.

Passo 2: Gerando e Aplicando um Novo SMBIOS UUID Único para Cada Host

Agora que o ESXi está ignorando o UUID do hardware, vamos injetar um novo e único para cada host. Para isso, usaremos uma função PowerShell que simplifica a criação do comando vsish.

01. Abra o PowerShell no seu computador (não no ESXi) e cole a seguinte função:

Function Generate-CustomESXiSMBIOS {
    param(
        [Parameter(Mandatory=$true)][String]$Uuid,
        [Parameter(Mandatory=$true)][String]$Model,
        [Parameter(Mandatory=$true)][String]$Vendor,
        [Parameter(Mandatory=$true)][String]$Serial,
        [Parameter(Mandatory=$true)][String]$SKU,
        [Parameter(Mandatory=$true)][String]$Family
    )

    $guid = [Guid]$Uuid

    $guidBytes = $guid.ToByteArray()
    $decimalPairs = foreach ($byte in $guidBytes) {
        "{0:D2}" -f $byte
    }
    $uuidPairs = $decimalPairs -join ', '

    Write-Host -ForegroundColor Yellow "`nvsish -e set /hardware/bios/dmiInfo {\`"${Model}\`", \`"${Vendor}\`", \`"${Serial}\`", [${uuidPairs}], \`"1.0.0\`", 6, \`"SKU=${SKU}\`", \`"${Family}\`"}`n"
}

02. Importe essa função no Powershell com o comando:

Import-Module .\Generate-CustomESXiSMBIOS.ps1

03. Gere um comando vsish único para CADA host: Para cada um dos seus hosts ESXi, você precisará gerar um UUID diferente. Você pode usar um gerador de UUID online ou simplesmente alterar alguns caracteres do UUID de exemplo para garantir a unicidade:

Exemplo de uso da função PowerShell para o Host 1:
Generate-CustomESXiSMBIOS -Uuid "43f32ef6-a3a8-44cb-9137-31cb4c6c520a" -Model "HUANANZHI X79" -Vendor "HUANANZHI" -Serial "ESXI-HL-001" -SKU "VCF-LAB" -Family "VMBEER"

Exemplo de uso da função PowerShell para o Host 2:
Generate-CustomESXiSMBIOS -Uuid "43f32ef6-a3a8-44cb-9137-31cb4c6c520b" -Model "HUANANZHI X79" -Vendor "HUANANZHI" -Serial "ESXI-HL-002" -SKU "VCF-LAB" -Family "VMBEER"

E assim por diante para todos os seus hosts, eu fiz para meus 04 hosts, garantindo que o UUID e o Serial sejam únicos para cada um.

04. Copie o comando que foi gerado, iremos colar ele no proximo passo:

SMBIOS UUID

05. Agora conect no host via SSH e aplique o comando vsish gerado em CADA host ESXi:

vsish -e set /hardware/bios/dmiInfo {\"HUANANZHI X79\", \"HUANANZHI\", \"ESXI-HL-001\", [246, 46, 243, 67, 168, 163, 203, 68, 145, 55, 49, 203, 76, 108, 82, 10], \"1.0.0\", 6, \"SKU=VCF-LAB\", \"VMBEER\"}

06. Em seguida, nao precisa reiniciar o host, mas apenas o serviço hostd com o comando abaixo:

/etc/init.d/hostd restart

OBS: Essas alterações feitas via vsish não são persistentes, ou seja, após um reboot do host ESXi elas voltam ao estado inicial. Uma opção seria inserir esses comandos no /etc/rc.local.d/local.sh de cada host, dessa forma sempre que ele reiniciar, essa mesma configuração será realizada automaticamente. Mas se voce quiser apenas para dar o bypass no deploy do VCF 9, acredito que não seja necessário automatizar esses comandos.

Workaround 2: Alterar o vCLS Mode

Atualmente, para o meu caso, o unico problema de ter o SMBIOS UUID igual em todos os hosts, é o fato de falhar o deploy do VCF 9, tanto é que nao tive nenhuma outra situação que isso vinhesse a me incomodar.

Então uma outra forma que encontrei de dar um bypass nisso é logar no vCenter após o deploy falhar e alterar o vCLS Mode para “Retreat“, desta forma as Maquina Virtuais vCLS são removidas.

SMBIOS UUID

Em seguida, basta ir no VCF Installer e clicar no botão RETRY AND PROCEED WITH DEPLOYMENT, que o processo continuiará com sucesso.

SMBIOS UUID

Conclusão

O problema do SMBIOS UUID duplicado é um desafio real para quem busca montar um ambiente VCF 9 em um home lab com hardware idêntico. Eu sei que os mini PC GMKtec K8 Plus possuem as mesmas caracteristicas.

Ao personalizar o SMBIOS UUID de cada um dos seus hosts ESXi, você garante a unicidade necessária para que o vCenter possa gerenciar corretamente as VMs vCLS e, consequentemente, permite que seu deployment do VCF 9 prossiga sem falhas.

Eu apresentei dois Workaround, e tenho ultimamente adotado o segundo, pela praticidade, porém se eu precisar executar o deploy do VCF 9 sem que dependa de mim para evitar alguma interrupção, como algumas vezes mandei executar o deploy na madrugada, entao eu executo o Workaround 1. Tudo vai depender da situação.

Compartilhe suas experiências e dúvidas nos comentários abaixo.