KVM + libvirt के साथ DHCP क्लाइंट की सूची प्राप्त करें?


11

मेरे पास कई वीएम हैं जो KVM + libvirt के माध्यम से उबंटू 9.10 पर चल रहे हैं। मैं आईपी पते का पता लगाने में सक्षम होना चाहता हूं जो प्रत्येक मशीन को भौतिक रूप से "कंसोल" खोलने के बिना प्रत्येक मेजबान को सौंपा गया है और आह्वान कर रहा है ifconfig

विचार करें:

rascher @ localhost: ~ $ virsh -c qemu: /// सिस्टम सूची --all
Uri से कनेक्ट करना: qemu: /// सिस्टम
 आईडी का नाम राज्य
----------------------------------
  1 मशीन 1 चल रहा है
  2 मशीन 2 चल रहा है
  - मशीन 3 बंद

मेरा नेटवर्क कॉन्फ़िगरेशन ऐसा दिखता है:

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

तो मुझे एक सूची कैसे मिल सकती है जो कहती है:

मशीन 1 आईपी पता = 192.168.122.16
मशीन 2 आईपी पता = 192.168.122.238
...

मैंने साथ खेला arp:

rascher @ localhost: ~ $ arp
पता HWtype HWaddress झंडे मुखौटा Iface
192.168.122.238 ईथर 00: 16: 36: 00: 61: b0 C वर्जिन 1
192.168.122.16 ईथर 00: 16: 36: 52: ई 8: 9 सी सी वर्जिन
...

लेकिन यह वर्चुअल मशीन की आईडी पर मैप नहीं करता है।

क्या कोई उपकरण है (कमांड लाइन के माध्यम से, virshया virt-*) मुझे यह जानकारी पता चल सकती है? या क्या मुझे कुछ व्यक्तिगत स्क्रिप्ट पर चलने वाली कुछ फैंसी स्क्रिप्ट की आवश्यकता है, जो अपने स्वयं के आईपी की जांच करती है, और होस्ट ओएस पर वापस रिपोर्ट करती है?

जवाबों:


10

इस सुविधा के लिए बहुत पहले अनुरोध किया गया था। अब libvirt दो नई कमांड प्रदान करके इसका समर्थन करता है: डोमिफ़ाद्र और नेट- डीएचसीपी -लीज़

 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 मेहमानों को DHCP प्रदान करने के लिए dnsmasq का उपयोग करता है, इसलिए आप / w / lib / libvirt को पट्टों के माध्यम से / w / lib / libvirt में ट्रैक कर सकते हैं या एक आईपी से होस्टनाम मैपिंग प्राप्त कर सकते हैं।


2

इसलिए, जब इसकी जांच की, तो मैंने पाया कि libvirt अतिथि OS के लिए DHCP और DNS करने के लिए dnsmasq का उपयोग करता है ।

और dnsmasq मेजबान के DNS तालिका में होस्टनाम सेट करेगा जो अतिथि से प्राप्त होस्टनाम के आधार पर करेगा।

तो इन निर्देशों और बहुत सारे गोग्लिंग के अनुसार , मुझे बस इसे /etc/dhclient.conf बनाने और जोड़ने की आवश्यकता है:

send host-name "machine1"

अब, मेरे मेजबान ओएस से, मैं कर सकता हूं ping machine1.

क्या किसी को पता है कि मुझे अनुगामी जोड़ने की आवश्यकता क्यों है "।" DNS प्रविष्टि को हल करने के लिए? मेरे द्वारा इसे कैसे बदला जा सकता है?


1
अनुगामी डॉट के बिना, आपका DNS रिज़ॉल्वर, जब यह लुकअप करता है, तो इसे होस्टनाम में खोज डोमेन की सूची में जोड़ देगा। आप इसके बजाय एक FQDN भेज सकते हैं, जैसे machine1.example.com और फिर अपने DNS खोज क्रम में example.com जोड़ें।
जेम्स

इसके लिए धन्यवाद। हालाँकि, लिंक किए गए नोट्स मुख्य होस्ट मशीन पर जाने और /etc/resolv.conf को संपादित करने और 192.168.122.1 को प्रथम नाम देने वाले के रूप में जोड़ने के लिए कहते हैं (यानी एक NS के रूप में libvirt dnsmasq जोड़ें), जो अधिकांश आधुनिक linuxes के रूप में काम नहीं करता है नेटवर्किंग के कई सार हैं जो /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

लार्स केलॉग-स्टैडमैन ने इस प्रक्रिया में से कुछ को स्वचालित करने के लिए स्क्रिप्ट का एक सेट बनाया है। वह इसे it पुण्य-बर्तन ’कहता है।

वह अपने ब्लॉग पोस्ट में इसका वर्णन यहां करते हैं: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

उनके पास कुछ लिपियों के साथ एक गितुब भी है, जो उन्होंने यहाँ लिखी है:

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

आप मूल रूप से इसे चला सकते हैं:

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

और आपको libvirt के वर्चुअल-मशीन-प्रबंधक के अंदर "डोमेन नाम" द्वारा प्रत्येक वर्चुअल मशीन की एक सूची मिल जाएगी। उदाहरण के लिए, मेरी मशीन पर मेरे पास 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

ध्यान दें, यह 'होस्टनाम' नहीं है जिसे वीएम स्वयं उपयोग कर रहा है, लेकिन बड़ी संख्या में उपयोग-मामलों के लिए, यह 'पर्याप्त रूप से अच्छा' होगा और dhcp भूमि में प्रत्येक वीएम के भीतर से 'ifconfig' होने की समस्या को हल करता है।

लार्स की ब्लॉग पोस्टिंग भी इसके लिए एक रास्ता दिखाती है जैसे कि आपके स्वयं / / / होस्ट फ़ाइल को '' अपडेट '' करने के लिए जैसे कि libvirt शुरू होता है और / या नए VMs को रोकता है। यह आपको हाथ से 192.168.122.x पते खोजने के लिए बिना ssh myname @ fedora20vm या ssh myname @ debian6vm जैसी चीजें करने में सक्षम बनाता है।

मैंने कुछ बहुत मामूली संवर्द्धन जोड़े हैं, जैसे एक स्क्रिप्ट कुछ बाहर थूकने के लिए ~ / .ssh / config विकल्प (VMs पर github का उपयोग करने के लिए बहुत आसान, एजेंट अग्रेषण के माध्यम से), यहाँ:

https://github.com/donbright/virt-utils (हटाया जाना प्रतीत होता है?)

मैं यह भी नोट करना चाहूंगा कि dhclient.conf को 'होस्ट-नेम xxxxx' भेजने की विधि केवल उन्हीं प्रणालियों पर काम करती है जो वास्तव में dhclient.conf का उपयोग मानक तरीके से करती हैं। मागिया, उदाहरण के लिए, यह कैसे काम करता है की एक असामान्य सेटअप है, इसलिए सरल निर्देश आवश्यक रूप से काम नहीं करेगा। हालाँकि, लार्स विधि के साथ, यह अतिथि OS'es dhcp सेटअप की नियमितता का काम करता है, क्योंकि वह VM पर भरोसा नहीं कर रहा है ताकि इसे होस्टनाम भेजा जा सके - वह libvirt के मशीन मैनेजर के भीतर 'डोमेन नाम' का उपयोग कर रहा है।


1

तो मुझे एक सूची कैसे मिल सकती है जो कहती है:

मशीन 1 आईपी पता = 192.168.122.16

मशीन 2 आईपी पता = 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 उत्तर भेजने पर निर्भर करता है।


इसके लिए धन्यवाद। मेरे ubuntu मशीन पर फ़ाइल /var/lib/libvirt/dnsmasq/default.leases dhclient.conf फ़ाइल के साथ होस्ट-नाम "myvirtmachine" भेजने के लिए सेट है; जैसा कि ऊपर सूचीबद्ध है
उज्ज्वल

0

आप defaultनेटवर्क परिभाषा को बदल सकते हैं , 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)

एक बार जब आप एक अतिथि शुरू करते हैं, तो आप सभी मेहमानों के मैक पते को सूचीबद्ध कर सकते हैं

# virsh list --all --mac

मैक पते के अंतिम बाइट के अनुसार, आप एक अतिथि के आईपी पते का अनुमान लगा सकते हैं।


वायर के किस संस्करण के लिए यह काम करना चाहिए? virsh list --all --macसंस्करण 3.0.0 में काम नहीं करता है
पुनः लोड करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.