KVM + libvirt를 사용하여 DHCP 클라이언트 목록을 얻으십니까?


11

KVM + libvirt를 통해 Ubuntu 9.10에서 여러 VM을 실행 중입니다. 각 컴퓨터에 물리적 "콘솔"을 실제로 열고 호출하지 않고 각 호스트에 할당 된 IP 주소를 찾을 수 있기를 원합니다 ifconfig.

치다:

rascher @ localhost : ~ $ virsh -c qemu : /// 시스템 목록 --all
URI에 연결 : qemu : /// system
 ID 이름 상태
----------------------------------
  1 대의 기계
  2 대의 기계
  -machine3 차단

내 네트워크 구성은 다음과 같습니다.

<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>

그렇다면 다음과 같은 목록을 어떻게 얻을 수 있습니까?

machine1 IP 주소 = 192.168.122.16
machine2 IP 주소 = 192.168.122.238
...

나는 함께 연주 arp:

rascher @ localhost : ~ $ arp
주소 HWtype HWaddress Flags 마스크 Iface
192.168.122.238 에테르 00 : 16 : 36 : 00 : 61 : b0 C virbr0
192.168.122.16 에테르 00 : 16 : 36 : 52 : e8 : 9c C virbr0
...

그러나 이것은 가상 머신의 ID에 매핑되지 않습니다.

이 정보를 확인할 수 있는 도구가 있습니까 (명령 줄을 통 virsh하거나 virt-*)? 아니면 각각의 개별 VM에서 실행되고 자체 IP를 확인한 후 호스트 OS에 다시보고하는 멋진 스크립트가 필요합니까?

답변:


10

이 기능은 오래 전에 요청되었습니다. 이제 libvirt는 domifaddrnet-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

다른 시나리오에서 :

 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

4

libvirt는 dnsmasq를 사용하여 게스트에게 DHCP를 제공하므로 /var/log/daemon.log를 트롤링하거나 / var / lib / libvirt의 임대 파일을 통해 IP에서 호스트 이름으로 매핑 할 수 있습니다.


2

그래서 이것을 조사 할 때 libvirt는 dnsmasq 를 사용 하여 게스트 OS에 대해 DHCP 및 DNS를 수행 한다는 것을 알았 습니다.

그리고 dnsmasq는 게스트로부터받은 호스트 이름에 따라 호스트의 DNS 테이블에 호스트 이름을 설정합니다.

따라서 이러한 지침과 많은 인터넷 검색 결과 에 따라 간단히 이것을 /etc/dhclient.conf에 추가하고 추가해야했습니다.

send host-name "machine1"

이제 호스트 OS에서 ping machine1.

왜 내가 뒤에 "."를 추가해야하는지 알고 있습니까? DNS 항목을 해결하기 위해? 이것을 어떻게 바꿀 수 있습니까?


1
끝에 점이 없으면 DNS 확인자가 검색 할 때 검색 도메인 목록을 호스트 이름에 추가합니다. 대신 machine1.example.com과 같은 FQDN을 전송 한 다음 example.com을 DNS 검색 순서에 추가 할 수 있습니다.
James

감사합니다. 그러나 연결된 노트는 기본 호스트 시스템으로 이동하여 /etc/resolv.conf를 편집하고 192.168.122.1을 첫 번째 네임 서버로 추가합니다 (즉, libvirt dnsmasq를 NS로 추가). 물론 대부분의 최신 Linux에서는 작동하지 않습니다. 오늘날 네트워킹에는 /etc/resolv.conf를 다시 쓰는 추상화가 여러 개 있습니다. havent 아직 내 생각을 알아 냈어.
밝게 돈

2

같은 문제가 발생하여 다음 스크립트를 만들었습니다.

#!/bin/bash



function showMAC(){
    virsh dumpxml ${1}|grep "mac address"|sed "s/.*'\(.*\)'.*/\1/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

2

Lars Kellogg-Stedman은이 프로세스 중 일부를 자동화하는 스크립트 세트를 작성했습니다. 그는 그것을 'virt-utils'라고 부릅니다.

그는 블로그 게시물 http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/ 에서 설명합니다.

그는 또한 그가 작성한 스크립트 중 일부가있는 github을 가지고 있습니다 :

https://github.com/larsks/virt-utils

기본적으로 이것을 실행할 수 있습니다.

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

libvirt의 virtual-machine-manager에 "도메인 이름"으로 각 가상 머신의 목록이 표시됩니다. 예를 들어 내 컴퓨터에서 3 개의 vms가 실행 중입니다.

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

이것은 VM 자체가 사용하는 '호스트 이름'이 아니지만 많은 유스 케이스의 경우 '충분히'좋으며 dhcp land의 각 VM 내에서 'ifconfig'가 발생하는 문제를 해결합니다.

Lars의 블로그 게시물은 libvirt가 새 VM을 시작 및 / 또는 중지 할 때 자신의 / etc / hosts 파일을 '자동 업데이트'하는 방법도 보여줍니다. 이를 통해 192.168.122.x 주소를 직접 찾을 필요없이 ssh myname @ fedora20vm 또는 ssh myname @ debian6vm과 같은 작업을 수행 할 수 있습니다.

~ / .ssh / config 옵션을 추출하는 스크립트와 같이 약간의 개선이 추가되었습니다 (에이전트 전달을 통해 VM에서 github을 사용하는 데 매우 유용함).

https://github.com/donbright/virt-utils (삭제 된 것으로 나타남)

또한 dhclient.conf를 'host-name xxxxx 보내기'로 편집하는 방법은 실제로 표준 방식으로 dhclient.conf를 사용하는 시스템에서만 작동합니다. 예를 들어, Mageia는 dhclient 작동 방식에 대한 특이한 설정을 가지고 있으므로 간단한 지침이 반드시 작동하지는 않습니다. 그러나 Lars의 방법을 사용하면 VM에 의존하여 호스트 이름을 보내지 않기 때문에 게스트 OS의 dhcp 설정을 다시 수행합니다. 그는 libvirt의 시스템 관리자에서 '도메인 이름'을 사용하고 있습니다.


1

그렇다면 다음과 같은 목록을 어떻게 얻을 수 있습니까?

machine1 IP 주소 = 192.168.122.16

machine2 IP 주소 = 192.168.122.238

적어도 페도라에서는 다음과 같은 방법으로 해당 정보를 얻을 수 있습니다.

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

다음과 유사한 출력이 있습니다.

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

그것은 당신이 요청한 것보다 조금 더 있지만


0

우분투에서는 dnsmasq를 사용하여 VM에 DNS 및 DHCP 서비스를 제공합니다. 호스트의 dnsmasq 프로세스는이 파일에 임대를 저장합니다.

/var/lib/misc/dnsmasq.leases

이것은 일반적인 텍스트 파일이며 그 줄은 다음과 비슷할 것입니다.

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

관심있는 필드는 세 번째 및 네 번째 열입니다. 세 번째 필드에는 VM의 IPv4 주소가 있고 네 번째 필드에는 별표 또는 VM의 호스트 이름이 있습니다. 이는 게스트가 dnsmasq 서비스 프로세스로 보내는 DHCP 응답에 따라 다릅니다.


감사합니다. 내 우분투 컴퓨터에서 파일은 /var/lib/libvirt/dnsmasq/default.leases이며 dhclient.conf 파일은 호스트 이름 "myvirtmachine"을 보내도록 설정되어 있습니다. 위에 나열된
돈 밝은

0

default네트워크 정의를 변경 하고 xml 내에서 MAC을 IP로 매핑 할 수 있습니다 .

# 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)

손님을 시작하면 다음을 통해 모든 손님의 MAC 주소를 나열 할 수 있습니다

# virsh list --all --mac

MAC 주소의 마지막 바이트에 따라 게스트의 IP 주소를 유추 할 수 있습니다.


어떤 버전의 virsh가 작동해야합니까? virsh list --all --mac버전 3.0.0에서 작동하지 않습니다
reox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.