Criando um Kernel Linux preparado para Microsoft Hyper-V

Há alguns meses venho trabalhando com Microsoft Hyper-V, no intuito de justificar o custo-benefício deste em relação ao poderoso VMware vSphere, porém alguns desafios começaram a surgir. O primeiro deles foi como utilizar distribuições Linux baseadas em CentOS e Debian como sistema operacional guest. A princípio não há problema algum, o S.O. é instalado sem dificuldade, os drivers também são reconhecidos sem dificuldade.

Porém, ao se criar uma VM no Hyper-V, com o sistema operacional “Linux” definido, a interface de rede utilizada é a do tipo “Legacy”, ou seja, é um driver que emula um adaptador DEC/Intel 21140 Ethernet de 10/100Mbps, cuja finalidade é simplesmente ser compatível com a maioria dos sistemas operacionais. É claro que não queremos uma interface de rede dessas nas redes de alta performance encontradas nos datacenters de hoje em dia. Para se utilizar o adaptador do tipo “Synthetic” do Hyper-V é necessário instalar os Integration Components, que pelo menos na versão 2.0 do Hyper-V (Windows Server 2008 R2) só estava disponível para Windows, RedHat, SuSE e algumas poucas versões de kernel do CentOS.

Como na época eu precisava instalar um Debian, comecei a pesquisar e acabei achando num blog de um MVP turco chamado Yusuf Ozturk quase o que eu precisava, uma versão do kernel do Debian que possuísse os drivers necessários para funcionar o adaptador “Synthetic”. No post ele disponibiliza a versão 2.6.36 do kernel para Debian 5, este era o problema, eu precisava de uma versão para o Debian 6. Pesquisando um pouco mais no blog dele mesmo, acabei encontrando um outro post, onde ele ensinava a compilar um kernel de sua preferência, habilitando os drivers necessários para o Hyper-V.

Fiquei intrigado com o fato de haver drivers específicos para o Hyper-V dentro do kernel do Linux, e ao pesquisar sobre o fato, encontrei algumas referências incluindo esta do Brian Lewis comentando sobre a colaboração entre a Microsoft e os desenvolvedores open source, a qual possibilitaram tal feito. Sim, à partir do kernel 3.4, é possível utilizar um Linux como guest no Hyper-V e ainda usufruir dos benefícios do Integration Components, sem muito esforço. Vamos então ao que interessa? Abaixo segue a sequência para se compilar um novo kernel no Debian 6, ainda não testei com outras distribuições, mas acredito não ser muito diferente disso:

apt-get update
aptitude update
apt-get install build-essential
apt-get install ncurses-dev kernel-package fakeroot
apt-get install linux-headers-`uname -r`
apt-get install linux-source-`uname -r | awk -F"-" '{print $1}'`
cd /usr/src
wget -c #link do kernel desejado em kernel.org
bzip2 -d #arquivo baixado
tar -xf #arquivo descompactado
cd linux-#versão do kernel baixado
cp /boot/config-$(uname -r) ./.config

Antes de iniciarmos a compilação do kernel, é necessário se atentar para alguns detalhes. Execute o comando abaixo para entrar no menu de configuração do kernel, e siga os passos referente à versão do kernel que você baixou:

make menuconfig
  • Kernel anterior à versão 3.4:

Você precisará instalar os drivers através da versão do Linux Integration Components referente à distribuição que você está utilizando, o Linux IC é fornecido diretamente pela Microsoft. Ou, você pode compilar uma versão de Kernel, habilitando os drivers para Hyper-V na seção “Stagging” conforme as duas imagens abaixo:

  • Kernel 3.4 em diante:

Os drivers para Hyper-V finalmente saem da classificação “Stagging” e entram de vez no kernel do Linux. Para habilitá-los, siga as telas abaixo:

O driver de rede, especificamente, está em um local separado, volte para Device Drivers, e siga o caminho abaixo:

  • Kernel 3.6 em diante:

Boa notícia! os drivers para Hyper-V já estão habilitados por padrão!

Após preparar o kernel com os drivers necessários, vamos então ao processo de compilação. Este processo é demorado, e depende muito dos recursos de hardware que estão alocados para a máquina.

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-hyperv kernel_image kernel_headers

Após o último comando, basta aguardar o kernel ser compilado, e você irá encontrar dois arquivos .deb na raiz do /usr/src/. Instale estes dois pacotes conforme abaixo, e depois basta reiniciar, você já estará utilizando o novo kernel:

dpkg -i #informe os dois arquivos .deb que você criou
echo -e "hv_vmbus\nhv_storvsc\nhv_blkvsc\nhv_netvsc" >> /etc/initramfs-tools/modules
update-initramfs -u -k #versão kernel

Bom, é isso, agora é só aproveitar e montar seu plano de migração do VMware para Hyper-V!

Criando um Kernel Linux preparado para Microsoft Hyper-V