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.

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.