รับรายชื่อไคลเอ็นต์ DHCP ด้วย KVM + libvirt หรือไม่


11

ฉันมี VM หลายเครื่องที่ทำงานบน Ubuntu 9.10 ผ่านทาง KVM + libvirt ฉันต้องการที่จะสามารถที่จะหาที่อยู่ IP ที่ได้รับมอบหมายให้แต่ละพื้นที่โดยไม่ต้องเปิดทางร่างกายทางกายภาพ "คอนโซล" ifconfigเพื่อแต่ละเครื่องและกล่าวอ้าง

พิจารณา:

rascher @ localhost: ~ $ virsh -c qemu: /// รายชื่อระบบ - ทั้งหมด
กำลังเชื่อมต่อกับระบบ uri: qemu: ///
 รหัสชื่อรัฐ
----------------------------------
  1 เครื่องจักร 1 กำลังทำงาน
  2 เครื่องจักร 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>

ดังนั้นฉันจะได้รับรายชื่อซึ่งบอกว่า:

ที่อยู่ IP ของ machine1 = 192.168.122.16
ที่อยู่ IP ของ machine2 = 192.168.122.238
...

ฉันเล่นกับarp:

rascher @ localhost: ~ $ arp
ที่อยู่ HWtype HWaddress Flags Mask Iface
192.168.122.238 อีเธอร์ 00: 16: 36: 00: 61: b0 C virbr0
192.168.122.16 ether 00: 16: 36: 52: e8: 9c C virbr0
...

แต่นี่ไม่ได้จับคู่กับ ID ของเครื่องเสมือน

มีเครื่องมือ (ผ่านบรรทัดคำสั่งvirshหรือvirt-*) ฉันสามารถตรวจสอบข้อมูลนี้ได้หรือไม่? หรือฉันต้องมีสคริปต์แฟนซีที่ทำงานบนแต่ละ VM ตรวจสอบ IP ของตัวเองและรายงานกลับไปยังโฮสต์ระบบปฏิบัติการ

คำตอบ:


10

สถานที่นี้ถูกขอมานานแล้ว ตอนนี้ libvirt สนับสนุนโดยจัดทำสองคำสั่งใหม่: domifaddrและ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

ในสถานการณ์อื่น:

 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 ให้กับแขกดังนั้นคุณสามารถ trawl /var/log/daemon.log หรือขุดผ่านไฟล์ leases ใน / var / lib / libvirt เพื่อรับ IP กับการแมปชื่อโฮสต์


2

ดังนั้นเมื่อตรวจสอบสิ่งนี้ฉันพบว่า libvirt ใช้dnsmasqเพื่อทำ DHCP และ DNS สำหรับแขกระบบปฏิบัติการ

และ dnsmasq จะตั้งชื่อโฮสต์ในตาราง DNS ของโฮสต์ตามชื่อโฮสต์ที่ได้รับจากแขก

ดังนั้นตามคำแนะนำเหล่านี้และ googling จำนวนมากฉันเพียงต้องการสร้างและเพิ่มลงใน /etc/dhclient.conf:

send host-name "machine1"

ตอนนี้จากโฮสต์ระบบปฏิบัติการของฉันฉันสามารถ ping machine1.

ไม่มีใครรู้ว่าทำไมฉันต้องเพิ่มส่วนท้าย "." เพื่อให้รายการ DNS ที่จะแก้ไข? ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร


1
หากไม่มีจุดต่อท้ายตัวแก้ไข DNS ของคุณจะผนวกรายการของโดเมนการค้นหาต่อท้ายชื่อโฮสต์เมื่อทำการค้นหา คุณสามารถส่ง FQDN แทนเช่น machine1.example.com แล้วเพิ่ม example.com ไปยังลำดับการค้นหา DNS ของคุณ
James

ขอบคุณสำหรับสิ่งนี้. อย่างไรก็ตามบันทึกย่อที่เชื่อมโยงบอกว่าจะไปที่เครื่องโฮสต์หลักและแก้ไข /etc/resolv.conf และเพิ่ม 192.168.122.1 เป็นเนมเซิร์ฟเวอร์แรก (เช่นเพิ่ม libvirt dnsmasq ในฐานะ NS) ซึ่งแน่นอนว่าจะไม่ทำงานบน linux ที่ทันสมัยที่สุดเช่น มีหลาย abstractions วันนี้ของเครือข่ายที่เขียน /etc/resolv.conf ยังไม่ได้คิดออกเลย
ดอนสดใส

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 ได้สร้างชุดสคริปต์เพื่อทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ เขาเรียกมันว่า 'คุณธรรม'

เขาอธิบายไว้ในโพสต์บล็อกของเขาที่นี่: 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 ตัวอย่างเช่นบนเครื่องของฉันฉันมี 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 ใช้ แต่สำหรับกรณีการใช้งานจำนวนมากมันจะ 'ดีพอ' และแก้ปัญหาการต้อง 'ifconfig' จากภายในแต่ละ VM ใน dhcp land

การโพสต์บล็อกของ Lars ยังแสดงให้เห็นถึงวิธีการนี้ในการ 'อัปเดตอัตโนมัติ' ไฟล์ / etc / hosts ของคุณเองเมื่อ libvirt เริ่มทำงานและ / หรือหยุด VM ใหม่ สิ่งนี้ช่วยให้คุณสามารถทำสิ่งต่าง ๆ เช่น ssh myname @ fedora20vm หรือ ssh myname @ debian6vm โดยไม่ต้องค้นหาที่อยู่ 192.168.122.x ด้วยมือ

ฉันได้เพิ่มการปรับปรุงเล็กน้อยบางอย่างเช่นสคริปต์เพื่อคายตัวเลือก ~ / .ssh / config บางตัว (มีประโยชน์มากสำหรับการใช้ github บน VMs ผ่าน Agent Forwarding) ที่นี่:

https://github.com/donbright/virt-utils (ดูเหมือนจะถูกลบหรือไม่)

ฉันยังต้องการที่จะทราบว่าวิธีการแก้ไข dhclient.conf เพื่อ 'send host-name xxxxx' ใช้งานได้กับระบบที่ใช้ dhclient.conf ในรูปแบบมาตรฐานเท่านั้น ตัวอย่างเช่น Mageia มีการตั้งค่าที่ผิดปกติของวิธีการทำงานของ dhclient ดังนั้นคำแนะนำง่ายๆไม่จำเป็นต้องทำงาน อย่างไรก็ตามด้วยวิธีของ Lars มันจะทำการ regarldess ของการตั้งค่า guest OS'es dhcp เนื่องจากเขาไม่ได้อาศัย VM เพื่อส่งชื่อโฮสต์ - เขาใช้ 'ชื่อโดเมน' ภายในตัวจัดการเครื่องของ libvirt


1

ดังนั้นฉันจะได้รับรายชื่อซึ่งบอกว่า:

ที่อยู่ IP ของ machine1 = 192.168.122.16

ที่อยู่ IP ของ machine2 = 192.168.122.238

อย่างน้อยใน fedora คุณจะได้รับข้อมูลด้วยวิธีนี้:

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

บน Ubuntu dnsmasq นั้นใช้เพื่อให้บริการ DNS และ DHCP กับ VMs กระบวนการ 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

ฟิลด์ที่คุณสนใจคือคอลัมน์ที่สามและสี่: ฟิลด์ที่สามประกอบด้วยที่อยู่ IPv4 ของ VM และฟิลด์ที่สี่มีเครื่องหมายดอกจันหรือชื่อโฮสต์ของ VM ขึ้นอยู่กับการตอบกลับ DHCP ที่แขกส่งไปยังกระบวนการบริการ dnsmasq


ขอบคุณสำหรับสิ่งนี้. บนเครื่องอูบุนตูของฉันไฟล์คือ /var/lib/libvirt/dnsmasq/default.leases ด้วยไฟล์ dhclient.conf ที่ตั้งให้ส่งชื่อโฮสต์ "myvirtmachine"; ตามที่ระบุไว้ข้างต้น
don bright

0

คุณสามารถเปลี่ยนdefaultนิยามเครือข่ายแม็ป MAC กับ IP ภายใน 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)

เมื่อคุณเริ่มผู้เยี่ยมชมคุณสามารถแสดงที่อยู่ 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.