Obter lista de clientes DHCP com KVM + libvirt?

9

Eu tenho várias VMs rodando no Ubuntu 9.10 via KVM + libvirt. Eu quero ser capaz de descobrir o endereço IP que foi atribuído a cada host sem abrir fisicamente um "console" físico para cada máquina e invocar ifconfig .

Considere:

rascher@localhost:~$ virsh -c qemu:///system list --all
Connecting to uri: qemu:///system
 Id Name                 State
----------------------------------
  1 machine1          running
  2 machine2          running
  - machine3          shut off

Minha configuração de rede é semelhante a:

<network>
  <name>default</name>
  <uuid>1be...</uuid>
  <forward mode='route' dev="eth0"/>
  <bridge name='virbr0' stp='on' forwardDelay='0' />
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network>

Então, como posso obter uma listagem que diz:

machine1 IP address = 192.168.122.16
machine2 IP address = 192.168.122.238
...

Eu joguei com arp :

rascher@localhost:~$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.122.238          ether   00:16:36:00:61:b0   C                     virbr0
192.168.122.16           ether   00:16:36:52:e8:9c   C                     virbr0
...

Mas isso não é mapeado para o ID de uma máquina virtual.

Existe alguma ferramenta (através da linha de comando, virsh ou virt-* ) posso verificar esta informação? Ou preciso ter algum script sofisticado que seja executado em cada VM individual, verifique seu próprio IP e relate-o de volta ao sistema operacional host?

    
por rascher 12.01.2010 / 18:25

8 respostas

2

Então, ao investigar isso, descobri que a libvirt usa dnsmasq para fazer o DHCP e o DNS para sistemas operacionais convidados.

E o dnsmasq definirá o nome do host na tabela DNS do host com base no nome do host que ele receber do convidado.

Então, de acordo com estas instruções e muito googling, eu simplesmente precisava criar e adicionar isso ao /etc/dhclient.conf:

send host-name "machine1"

Agora, no meu sistema operacional host, posso ping machine1.

Alguém sabe por que eu preciso adicionar o "." à direita para que a entrada de DNS seja resolvida? Como posso mudar isso?

    
por 24.01.2010 / 04:37
7

Este recurso foi solicitado há muito tempo. Agora o libvirt o suporta fornecendo dois novos comandos: domifaddr e net-dhcp-leases

 Usage: domifaddr <domain> [interface] [--full] [--source lease|agent]

 Example outputs:
 virsh # domifaddr f20 --source agent
 Name       MAC address          Protocol     Address
 -------------------------------------------------------------------------------
 lo         00:00:00:00:00:00    ipv4         127.0.0.1/8
 -          -                    ipv6         ::1/128
 eth0       52:54:00:2e:45:ce    ipv4         10.1.33.188/24
 -          -                    ipv6         2001:db8:0:f101::2/64
 -          -                    ipv6         fe80::5054:ff:fe2e:45ce/64
 eth1       52:54:00:b1:70:19    ipv4         192.168.105.201/16
 -          -                    ipv4         192.168.201.195/16
 -          -                    ipv6         2001:db8:ca2:2:1::bd/128
 eth2       52:54:00:36:2a:e5    N/A          N/A
 eth3       52:54:00:20:70:3d    ipv4         192.168.105.240/16
 -          -                    ipv6         fe80::5054:ff:fe20:703d/64

 virsh # domifaddr f20 --full
 Name       MAC address          Protocol     Address
 -------------------------------------------------------------------------------
 vnet0      52:54:00:2e:45:ce    ipv6         2001:db8:0:f101::2/64
 vnet1      52:54:00:b1:70:19    ipv4         192.168.105.201/16
 vnet1      52:54:00:b1:70:19    ipv6         2001:db8:ca2:2:1::bd/128
 vnet3      52:54:00:20:70:3d    ipv4         192.168.105.240/16

 virsh # domifaddr f20 eth0 --source agent --full
 Name       MAC address          Protocol     Address
 -------------------------------------------------------------------------------
 eth0       52:54:00:2e:45:ce    ipv4         10.1.33.188/24
 eth0       52:54:00:2e:45:ce    ipv6         2001:db8:0:f101::2/128
 eth0       52:54:00:2e:45:ce    ipv6         fe80::5054:ff:fe2e:45ce/64

For eth0, ipv6 is managed by libvirt, but ipv4 is not.
For eth1, the second IP is created using ip aliasing.
For eth2, there is no IP configured as of yet.
For eth3, only ipv4 has been configured.
fd00::/8 are private ipv6 ranges. Hence not visible through --source lease

Em um cenário diferente:

 Example Usage: net-dhcp-leases <network> [mac]

 virsh # net-dhcp-leases --network default6
 Expiry Time          MAC address        Protocol  IP address                Hostname        Client ID or DUID
 -------------------------------------------------------------------------------------------------------------------
 2014-06-16 03:40:14  52:54:00:85:90:e2  ipv4      192.168.150.231/24        fedora20-test   01:52:54:00:85:90:e2
 2014-06-16 03:40:17  52:54:00:85:90:e2  ipv6      2001:db8:ca2:2:1::c0/64   fedora20-test   00:04:b1:d8:86:42:e1:6a:aa:cf:d5:86:94:23:6f:94:04:cd
 2014-06-16 03:34:42  52:54:00:e8:73:eb  ipv4      192.168.150.181/24        ubuntu14-vm     -
 2014-06-16 03:34:46  52:54:00:e8:73:eb  ipv6      2001:db8:ca2:2:1::5b/64   -               00:01:00:01:1b:30:c6:aa:52:54:00:e8:73:eb
    
por 17.03.2015 / 22:46
4

O libvirt usa dnsmasq para fornecer DHCP aos convidados, assim você pode pesquisar /var/log/daemon.log ou vasculhar o arquivo de concessões em / var / lib / libvirt para obter um mapeamento de IP para nome de host.

    
por 12.01.2010 / 23:22
2

Eu tive o mesmo problema, então criei o seguinte script:

#!/bin/bash



function showMAC(){
    virsh dumpxml ${1}|grep "mac address"|sed "s/.*'\(.*\)'.*//g"
}

function showIP(){
    for mac in $($0 -m $1); do
        grep $mac /var/log/daemon.log | tail -n 1 | awk '{print $7}'
    done
}

if test -z "${1}"; then
    echo "Usage: ${0} [-i | -m] <domain>"
    echo "  -i   Show IP address (the default)."
    echo "  -m   Show MAC address."
    exit
fi

addr_type="-i"

if test ${1} = "-i" || test ${1} = "-m"; then
    addr_type=${1}
    shift
fi

domain=${1}

test $addr_type = "-i" && showIP $domain || showMAC $domain
    
por 20.07.2010 / 12:51
2

Lars Kellogg-Stedman criou um conjunto de scripts para automatizar parte desse processo. Ele chama de 'virt-utils'.

Ele descreve isso em seu post aqui: link

Ele também tem um github com alguns dos scripts que ele escreveu, aqui:

link

Você basicamente pode executar isso:

git clone https://github.com/larsks/virt-utils 
cd virt-utils 
sudo make install 
virt-hosts

e você obterá uma listagem de cada máquina virtual por seu "nome de domínio" dentro do gerenciador de máquinas virtuais da libvirt. Por exemplo, na minha máquina eu tenho 3 vms em execução.

don@serebryanya:~/src/virt-utils$ virt-hosts
192.168.122.23  mageia4.x64-net0.default.virt mageia4.x64.default.virt
192.168.122.197 debian7amd64-net0.default.virt debian7amd64.default.virt
192.168.122.15  freebsd10_amd64-net0.default.virt freebsd10_amd64.default.virt

Note que este não é o 'hostname' que a própria VM está usando, mas para um grande número de casos de uso, ele será 'bom o suficiente' e resolve o problema de 'ifconfig' de dentro de cada VM terra dhcp.

A postagem de blog de Lars também mostra uma maneira de "atualizar automaticamente" seu próprio arquivo / etc / hosts à medida que o libvirt é iniciado e / ou interrompe novas VMs. Isso permite que você faça coisas como ssh myname @ fedora20vm ou ssh myname @ debian6vm sem ter que encontrar os endereços 192.168.122.x manualmente.

Eu adicionei algumas melhorias muito pequenas, como um script para cuspir algumas opções ~ / .ssh / config (muito muito útil para usar o github em VMs, via Agente Forwarding), aqui:

link (parece ser excluído?)

Eu também gostaria de observar que o método de edição de dhclient.conf para 'send host-name xxxxx' só funciona em sistemas que realmente usam o dhclient.conf de maneira padrão. A Mageia, por exemplo, tem uma configuração incomum de como o dhclient funciona, portanto as instruções simples não funcionam necessariamente. No entanto, com o método de Lars, ele funciona como a configuração do guest dhcp, porque ele não está confiando na VM para enviar seu hostname - ele está usando os 'nomes de domínio' dentro do gerenciador de máquinas do libvirt.

    
por 13.07.2014 / 06:09
1

So how can I get a listing which says:

machine1 IP address = 192.168.122.16

machine2 IP address = 192.168.122.238

pelo menos no fedora, você pode obter essa informação desta forma:

cat /var/lib/libvirt/dnsmasq/default.leases

tem uma saída semelhante a:

1412006226 52:54:00:fe:b3:c0 192.168.122.117 coreos0 01:52:54:00:fe:b3:c0

embora isso seja um pouco mais do que você pediu

    
por 29.09.2014 / 17:05
0

No Ubuntu, o dnsmasq é usado para fornecer serviços DNS e DHCP para as VMs. Os processos dnsmasq no host armazenam suas concessões neste arquivo:

/var/lib/misc/dnsmasq.leases

Este é um arquivo de texto normal e as linhas nele podem ser semelhantes a esta aqui:

1362729847 52:54:de:ad:be:ef 192.168.122.254 vm-win7 01:52:54:de:ad:be:ef

Os campos de seu interesse são a terceira e a quarta colunas: o terceiro campo contém o endereço IPv4 da VM e o quarto campo contém um asterisco ou o nome do host da VM. Isso depende da resposta do DHCP enviada pelo convidado para o processo do serviço dnsmasq.

    
por 08.03.2013 / 08:56
0

Você pode alterar a definição de rede default , mapear MAC para IP dentro do xml:

# virsh net-edit default
...
<range start='192.168.122.2' end='192.168.122.254' />
<host mac='52:54:00:6c:3c:02' ip='192.168.122.2' />
<host mac='52:54:00:6c:3c:03' ip='192.168.122.3' />
...
<host mac='52:54:00:6c:3c:fe' ip='192.168.122.254' />

# /etc/init.d/libvirtd restart (restart libvirt service)
# virsh net-destroy default    (remove old settings)
# virsh net-start default      (make changes working)

Depois de iniciar um convidado, você pode listar o endereço MAC de todos os convidados via

# virsh list --all --mac

De acordo com o último byte de um endereço MAC, você pode inferir o endereço IP de um convidado.

    
por 01.12.2016 / 17:46