Preliminares
O seguinte funcionou para mim no Ubuntu 12.04. Você deve desativar o firewall do computador ao testar isso, para que não interfira.
O arquivo / etc / default / qemu-kvm deve ser o originalmente instalado.
Você precisará ter os utilitários de ponte qemu-kvm e libvirt-bin instalados. Todos os usuários que usam máquinas virtuais devem ser adicionados ao grupo libvirtd.
Parece não haver mais necessidade de adicionar o recurso CAP_NET_ADMIN.
Configuração de rede
O modo de rede padrão é o modo de usuário, também chamado de SLIRP. Ele usa uma ponte virbr0 predefinida, que é roteada por NAT para o computador convidado. O roteamento NAT usa o recurso ip_forwarding e o iptables do kernel . O modo Bridge usa uma ponte virtual no convidado ao qual a interface Ethernet (não numerada) se conecta e na qual o host e o convidado têm suas interfaces de rede.
Os diagramas a seguir podem deixar as diferenças mais claras:
Você pode ver como a rede de usuário padrão é definida com:
virsh net-dumpxml default
Eu posso configurar o modo de ponte com as seguintes abordagens:
Em / etc / network / interfaces (da parte da ponte que você mencionou na sua pergunta):
auto lo
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
auto eth0
manual iface eth0 inet
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Reiniciar; e verifique se a rede sem fio não está ativa. Verifique a rota IP padrão com ip route
. Ele deve estar usando a interface br0.
NB: Se a sua Ethernet não estiver conectada quando essa alteração for feita, é necessário conectar o cabo Ethernet e obter uma operadora ou a inicialização será interrompida por dois minutos e você não terá capacidade de rede. Isso ocorre porque a interface eth0, por estar neste arquivo, deve aparecer antes que a inicialização possa prosseguir normalmente.
Nota: geralmente você não pode usar uma rede sem fio em vez de eth0 devido à sua incapacidade de usar vários endereços MAC (eu deduzo que eles precisam de um segundo para a ponte).
Como alternativa, você pode desativar o uso da Ethernet e verificar se ele não possui um endereço IP e se não há uma rota padrão configurada ip route
. Então:
sudo ifconfig eth0 0.0.0.0 up
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0 &
Você também pode fornecer um endereço IP estático aqui, além de definir a rota e o endereço DNS padrão. Para este exemplo, dhclient
faz isso.
Aqui está a minha tabela de rotas:
lista de rotas $ ip
padrão via 192.168.1.1 dev br0 métrica 100
Métrica 1000 do link do escopo dev br0 169.254.0.0/16
192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.45
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
Usando o kvm
Posso então inicializar uma máquina kvm em ponte com:
$ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
O -netdev tap
parâmetro faz do sudo um requisito. Quando a VM é iniciada, o qemu-kvm executa os seguintes comandos:
ifconfig vnet0 0.0.0.0 up
brifl addif brctl addif br0 vnet0
Isso é feito por / etc / qemu-ifup
A interface vnet0 da VM é adicionada à ponte br0 porque a rota padrão acima usa essa interface de ponte. Se não estivesse lá, a interface de toque seria adicionada à interface virbr0. Como não está conectado à Internet, o NAT seria usado para conectar o convidado ao host e à Internet, nas minhas experiências. Você pode direcionar o vnet0 para uma ponte específica em / etc / default / qemu-kvm. Usando o virt-manager abaixo, você pode direcionar explicitamente a qual ponte se conectar.
Por causa dos comandos acima emitidos pelo qemu-kvm e pelo -netdev tap,id=tunnel,ifname=vnet0
parâmetro, a máquina virtual vm está conectada ao túnel vnet0 e o túnel está conectado à ponte br0.
Agora eu posso ssh diretamente nesta VM convidada de outro computador na minha rede.
Meu host ifconfig
(observe a interface vnet0 que aparece na minha rede quando a VM está em execução):
$ ifconfig
br0 Encap de link: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
endereço inet: 192.168.1.45 Bcast: 255.255.255.255 Máscara: 255.255.255.0
Endereço do inet6: fe80 :: 21e: 33ff: fe88: 7e5 / 64 Escopo: Link
UP BROADCAST EM FUNCIONAMENTO MULTICAST MTU: 1500 Métrico: 1
Pacotes RX: 6526 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
Pacotes TX: 7543 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
colisões: 0 txqueuelen: 0
Bytes RX: 2712940 (2,7 MB) Bytes TX: 1071835 (1,0 MB)
eth0 Encap do link: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
UP BROADCAST EM FUNCIONAMENTO MULTICAST MTU: 1500 Métrico: 1
Pacotes RX: 7181 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
Pacotes TX: 7740 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
colisões: 0 txqueuelen: 1000
Bytes RX: 2974585 (2,9 MB) Bytes TX: 1096580 (1,0 MB)
Interrupção: 43 Endereço base: 0x6000
lo Encap do link: Loopback local
inet addr: 127.0.0.1 Máscara: 255.0.0.0
inet6 addr: :: 1/128 Escopo: Host
UP LOOPBACK EM FUNCIONAMENTO MTU: 16436 Métrico: 1
Pacotes RX: 10 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
Pacotes TX: 10 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
colisões: 0 txqueuelen: 0
Bytes RX: 664 (664,0 B) Bytes TX: 664 (664,0 B)
vnet0 Encap de link: Ethernet HWaddr ca: 0c: 73: c3: bc: 45
Endereço do inet6: fe80 :: c80c: 73ff: fec3: bc45 / 64 Escopo: Link
UP BROADCAST EM FUNCIONAMENTO MULTICAST MTU: 1500 Métrico: 1
Pacotes RX: 226 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
Pacotes TX: 429 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
colisões: 0 txqueuelen: 500
Bytes RX: 26919 (26,9 KB) Bytes TX: 58929 (58,9 KB)
virbr0 Encap de link: Ethernet HWaddr d6: 18: 22: db: ff: 93
Endereço inet: 192.168.122.1 Bcast: 192.168.122.255 Máscara: 255.255.255.0
UP BROADCAST MULTICAST MTU: 1500 Métrico: 1
Pacotes RX: 0 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
Pacotes TX: 0 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
colisões: 0 txqueuelen: 0
Bytes RX: 0 (0,0 B) Bytes TX: 0 (0,0 B)
Minha configuração de ponte durante a execução da VM:
$ brctl show
nome da ponte id da ponte interfaces ativadas para STP
br0 8000.001e338807e5 no eth0
vnet0
virbr0 8000.000000000000 sim
Observe que a interface vnet0 da máquina virtual e a interface eth0 estão conectadas à ponte br0.
E os MACs na interface br0:
$ brctl showmacs br0
port no addr mac é local? temporizador de envelhecimento
1 00: 05: 5d: cf: 64: 61 no 2.54
1 00: 19: d2: 42: 5d: 3f não 36.76
1 00: 19: df: da: af: 7c no 2.86
1 00: 1e: 33: 88: 07: e5 sim 0,00
1 00: 60: 0f: e4: 17: d6 não 0,79
2 52: 54: 00: 12: 34: 56 não 0,80
1 58: 6d: 8f: 17: 5b: c0 não 5.91
1 c8: aa: 21: be: 8d: 16 não 167.69
2 ca: 0c: 73: c3: bc: 45 sim 0.00
Observe que a interface br0 conecta meu computador host à mesma ponte que está sendo usada pelo convidado.
Você pode verificar se está em ponte, em vez de roteado por NAT para sua própria rede usando traceroute 8.8.8.8
. Se o primeiro nó for o roteador da sua rede e não o endereço IP do convidado, sua rede deverá estar funcionando corretamente.
Veja esta documentação .
virt-manager
Certifique-se de ter instalado virt-manager
e hal
. O hal
pacote é uma dependência sugerida virt-manager
e é usado para determinar a configuração de rede do seu sistema ao criar ou editar convidados.
Embora tenha a ponte br0 definida como acima, criei uma máquina virtual com o virt-manager da seguinte maneira:
Consegui acessar diretamente o restante da minha rede doméstica e a Internet a partir desse hóspede. Também pude usá-lo com outro computador Ubuntu (não host, não convidado) na minha rede doméstica.
Aqui está o kvm
comando muito longo executado pelo virt-manager (para comparação com EApubs ou qualquer outra pessoa que tenha problemas com isso):
/ usr / bin / kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1, sockets = 1, núcleos = 1, threads = 1 -nome preciso -uuid f057a729-eda6-4b85-84dc-f100c9ae3789 - nodefconfig -nodefaults -chardev socket, id = charmonitor, caminho = / var / lib / libvirt / qemu / preciso.monitor, servidor, nowait -mon chardev = charmonitor, id = monitor, mode = control -rtc base = utc -no- shutdown -drive file = / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2, se = nenhum, id = drive-ide0-0-0, format = qcow2-dispositivo ide-drive, bus = ide.0 , unit = 0, drive = drive-ide0-0-0, id = ide0-0-0, bootindex = 1 -netdev tap, fd = 18, id = hostnet0 -dispositivo rtl8139, netdev = hostnet0, id = net0, mac = 52: 54: 00: 0e: da: 9b, bus = pci.0, addr = 0x3 -chardev pty, id = charserial0 -dispositivo isa-serial, chardev = charserial0, id = serial0 -usb -vnc 127.0.0.1: 0 -vga cirrus -dispositivo intel-hda, id = sound0, bus = pci.0, addr = 0x4 -dispositivo hda-duplex, id = sound0-codec0, bus = sound0.0,cad = 0 - dispositivo virtio-balloon-pci, id = balloon0, bus = pci.0, addr = 0x5
Aqui está a parte da rede da descrição da máquina virtual em /etc/libvirt/qemu/quantal.xml
<interface type='bridge'>
<mac address='52:54:00:b0:8e:aa'/>
<source bridge='br0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
De acordo com este link, para desempenho e confiabilidade, pode ser melhor definir o modelo de dispositivo de rede para virtio
, você pode fazer isso no visualizador de virt pressionando o botão i , indo para a configuração da NIC e definindo o "Modelo do dispositivo "para virtio
. Você também pode adicionar isso ao XML acima adicionando a linha:
<model type='virtio'/>
Em suma
Tudo isso em 12.04 foi:
- Instalando virt-manager, bridge-utils, qemu-kvm e pacotes relacionados
- Certifique-se de que cada usuário que deseja usar o kvm esteja no grupo libvirtd.
- Definir / etc / network / interfaces como acima (que correspondem ao artigo citado)
- Reinicialize, verifique se a Ethernet está conectada e a conexão sem fio (se houver) desativada.
- Execute o kvm em uma imagem diretamente com, por exemplo
-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
, ou crie uma máquina virtual com o virt-manager, especificando o Bridge de rede br0 no painel Etapa 4-> Opções avançadas.
Não foram necessárias mais alterações nas redes, recursos, modelos ou configurações.
Para expor um serviço em seu novo convidado à Internet, você deve:
- Prepare e configure qualquer serviço de firewall necessário.
- Atribua um endereço estático na sua configuração de convidado ou no seu serviço DHCP.
- Se você estiver usando um roteador NAT, abra uma porta para o serviço que você está implementando, direcionando-a para o endereço IP do convidado.
Lembre-se de testar e reativar o serviço de firewall do seu computador host. Pode ser necessária qualquer entrada para encaminhar o tráfego para o hóspede.
Consulte https://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networking e https://help.ubuntu.com/12.04/serverguide/libvirt. html .
ifconfig
,brctl show
,brctl showmacs br0
, eip route
. No convidado:ifconfig
,ip route
,ping 8.8.8.8
,ping <your internet router>
, etraceroute 8.8.8.8
. Não posso dizer que configurei o kvm da maneira que você configurou, mas consegui fazer a ponte para trabalhar usando okvm
comando Eu tive que desconectar a conexão sem fio para que meu host se conectasse à Internet e, como dizem as instruções citadas, você precisa se conectar à Internet com Ethernet.