Como o Ubuntu faz a virtualização: KVM, namespaces e cgroups

Publicado em 2026-09-12 por frfrand

Las tres piezas que trae el kernel de Linux y que sostienen casi toda la infraestructura moderna. Qué hace cada una, cómo se combinan y qué comandos te dejan verlas funcionando.

Como o Ubuntu faz a virtualização: KVM, namespaces e cgroups

Quando alguém diz "Ubuntu pode virtualizar", soa como se viesse com um aplicativo para isso. Não é assim: as capacidades estão no kernel do Linux, e são três peças distintas que resolvem problemas diferentes.

Entendê-las explica como funcionam Docker, LXC, Kubernetes e praticamente toda a hospedagem moderna, porque todas se apoiam nas mesmas três.

KVM: o kernel como hipervisor

KVM (Kernel-based Virtual Machine) está no kernel do Linux desde 2007. Converte o próprio Linux em um hipervisor de tipo 1.

A ideia é elegante: em vez de escrever um hipervisor do zero, aproveita o fato de o kernel já saber escalonar processos, gerenciar memória e se comunicar com dispositivos. Uma máquina virtual passa a ser, para o Linux, um processo a mais ao qual são atribuídos recursos.

O código da máquina virtual é executado diretamente no processador real, usando as extensões de virtualização do hardware. O KVM intervém apenas nas operações privilegiadas.

Verificar se sua máquina pode:

grep -c -E "vmx|svm" /proc/cpuinfo

Se retornar um número maior que zero, o processador possui as extensões. vmx é Intel, svm é AMD.

O KVM geralmente vem acompanhado do QEMU, que emula os dispositivos (discos, rede, vídeo), e do libvirt, que é a camada de administração usada pelas ferramentas de nível superior.

Namespaces: o que um processo pode ver

Um namespace limita a visão que um processo tem do sistema. Existem vários tipos, cada um para um aspecto:

  • PID: quais processos vê. Dentro do seu namespace, o primeiro é o PID 1 e não vê nada de fora.
  • NET: suas próprias interfaces de rede, sua tabela de rotas, suas regras de firewall.
  • MNT: sua própria árvore de diretórios montados.
  • UTS: seu próprio nome de host.
  • USER: correspondências de identificadores, de modo que root dentro não seja root fora.

Quando você está dentro de um contêiner e faz "ps aux" e vê apenas dois processos, isso é um namespace de PID em ação. Os outros mil processos do host continuam existindo: simplesmente não são visíveis.

É possível ver os namespaces de um processo:

ls -l /proc/self/ns/

cgroups: quanto pode consumir

Os namespaces isolam o que se vê; os cgroups limitam o que se usa.

Com cgroups se define quanta CPU, quanta memória, quanta largura de banda de disco um grupo de processos pode consumir. É o que evita que um contêiner leve toda a máquina.

E é também o que o systemd faz por baixo: cada serviço do sistema roda em seu próprio cgroup, e por isso se podem definir limites de memória por serviço.

systemctl set-property miapp.service MemoryMax=512M

A versão 2 do cgroups, que é a que as distribuições modernas usam, unificou a hierarquia e torna esse controle muito mais coerente.

Como se combinam

Docker e LXC usam namespaces e cgroups: isolam e limitam, mas compartilham o kernel do host.

KVM é outra coisa: cria uma máquina com seu próprio kernel.

Um provedor de nuvem costuma combinar os dois: KVM para separar clientes, e dentro de cada máquina, contêineres para separar aplicações.

O interessante é que nada disso requer software adicional. Está no kernel que você já tem instalado. Docker, LXC e Kubernetes são interfaces confortáveis sobre funções que o Linux traz de fábrica.

E por isso um comando tão simples como este:

systemd-detect-virt

te diz em que tipo de ambiente você está rodando: kvm, lxc, docker, ou none se for hardware real.

  • Ubuntu
  • KVM
  • namespaces
  • cgroups
  • virtualización

Continuar lendo

Todos os artigos · Planos VPS