Nhận danh sách khách hàng DHCP với KVM + libvirt?


11

Tôi có một số máy ảo chạy trên Ubuntu 9.10 thông qua KVM + libvirt. Tôi muốn có thể tìm ra địa chỉ IP đã được gán cho từng máy chủ mà không cần mở "bàn điều khiển" vật lý cho mỗi máy và gọi ifconfig.

Xem xét:

rascher @ localhost: ~ $ virsh -c qemu: /// danh sách hệ thống --all
Kết nối với uri: qemu: /// hệ thống
 Tên Id Nhà nước
----------------------------------
  1 máy1 đang chạy
  2 máy2 đang chạy
  - Máy3 tắt

Cấu hình mạng của tôi trông như sau:

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

Vì vậy, làm thế nào tôi có thể nhận được một danh sách có nội dung:

máy1 địa chỉ IP = 192.168.122.16
địa chỉ máy2 = 192.168.122.238
...

Tôi đã chơi với arp:

rascher @ localhost: ~ $ arp
Địa chỉ HWtype HWaddress Flag 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
...

Nhưng điều này không ánh xạ tới ID của máy ảo.

Có một số công cụ (thông qua dòng lệnh, virshhoặc virt-*) tôi có thể xác định thông tin này không? Hoặc tôi cần phải có một số tập lệnh ưa thích chạy trên từng VM riêng lẻ, kiểm tra IP của chính nó và báo cáo lại cho hệ điều hành máy chủ?

Câu trả lời:


9

Tính năng này đã được yêu cầu từ lâu. Bây giờ libvirt hỗ trợ nó bằng cách cung cấp hai lệnh mới: domifaddrnet-dhcp-cho thuê

 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

Trong một kịch bản khác:

 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 sử dụng dnsmasq để cung cấp DHCP cho khách, vì vậy bạn có thể truy tìm /var/log/daemon.log hoặc đào qua tệp cho thuê trong / var / lib / libvirt để lấy IP sang ánh xạ tên máy chủ.


2

Vì vậy, khi điều tra điều này, tôi thấy rằng libvirt sử dụng dnsmasq để làm DHCP và DNS cho các hệ điều hành khách.

Và dnsmasq sẽ đặt tên máy chủ trong bảng DNS của máy chủ dựa trên bất kỳ tên máy chủ nào nó nhận được từ khách.

Vì vậy, theo các hướng dẫn này và rất nhiều thông tin, tôi chỉ cần tạo và thêm phần này vào /etc/dhclient.conf:

send host-name "machine1"

Bây giờ, từ hệ điều hành máy chủ của tôi, tôi có thể ping machine1.

Có ai biết tại sao tôi cần thêm dấu "." để mục DNS giải quyết? Làm thế nào tôi có thể thay đổi điều này?


1
Nếu không có dấu chấm, trình phân giải DNS của bạn sẽ nối thêm danh sách các miền tìm kiếm vào tên máy chủ khi thực hiện tra cứu. Thay vào đó, bạn có thể gửi FQDN, ví dụ machine1.example.com và sau đó thêm example.com vào thứ tự tìm kiếm DNS của bạn.
James

cảm ơn vì điều đó. tuy nhiên các ghi chú được liên kết nói sẽ đi trên máy chủ chính và chỉnh sửa /etc/resolv.conf và thêm 192.168.122.1 làm máy chủ tên đầu tiên (nghĩa là thêm libvirt dnsmasq dưới dạng NS), tất nhiên không hoạt động trên hầu hết các linux hiện đại như có nhiều bản tóm tắt ngày nay của mạng viết lại /etc/resolv.conf. havent có của tôi khá tìm ra chưa.
don sáng

2

Tôi đã có cùng một vấn đề vì vậy tôi đã tạo ra kịch bản sau đây:

#!/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 đã tạo ra một tập hợp các kịch bản để tự động hóa một số quy trình này. Anh ta gọi đó là "công dụng".

Ông mô tả nó trong bài đăng trên blog của mình ở đây: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Anh ấy cũng có một github với một số kịch bản anh ấy đã viết, ở đây:

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

Về cơ bản bạn có thể chạy cái này:

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

và bạn sẽ nhận được một danh sách của mỗi máy ảo bằng "tên miền" bên trong trình quản lý máy ảo của libvirt. Ví dụ, trên máy của tôi, tôi có 3 vms đang chạy.

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

Lưu ý, đây không phải là 'tên máy chủ' mà VM đang sử dụng, nhưng đối với một số lượng lớn các trường hợp sử dụng, nó sẽ 'đủ tốt' và giải quyết vấn đề phải 'ifconfig' từ trong mỗi VM trong vùng đất dhcp.

Bài đăng trên blog của Lars cũng cho thấy một cách để 'cập nhật tự động' tập tin / etc / hosts của bạn khi libvirt bắt đầu và / hoặc dừng VM mới. Điều này cho phép bạn thực hiện những việc như ssh myname @ fedora20vm hoặc ssh myname @ debian6vm mà không phải tìm địa chỉ 192.168.122.x bằng tay.

Tôi đã thêm một vài cải tiến rất nhỏ, như tập lệnh để nhổ một số tùy chọn ~ / .ssh / config (rất tiện dụng để sử dụng github trên máy ảo, thông qua Chuyển tiếp tác nhân), tại đây:

https://github.com/donbright/virt-utils (dường như sẽ bị xóa?)

Tôi cũng muốn lưu ý rằng phương pháp chỉnh sửa dhclient.conf để 'gửi tên máy chủ xxxxx' chỉ hoạt động trên các hệ thống thực sự sử dụng dhclient.conf theo cách tiêu chuẩn. Mageia, chẳng hạn, có một thiết lập khác thường về cách thức hoạt động của nó, vì vậy các hướng dẫn đơn giản sẽ không nhất thiết phải hoạt động. Tuy nhiên, với phương thức của Lars, nó hoạt động hiệu quả trong thiết lập dhcp của hệ điều hành khách, vì anh ta không dựa vào VM để gửi tên máy chủ - anh ta đang sử dụng 'tên miền' trong trình quản lý máy của libvirt.


1

Vì vậy, làm thế nào tôi có thể nhận được một danh sách có nội dung:

máy1 địa chỉ IP = 192.168.122.16

địa chỉ máy2 = 192.168.122.238

ít nhất trên fedora bạn có thể lấy thông tin đó theo cách này:

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

có đầu ra tương tự như:

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

mặc dù đó là một chút nhiều hơn bạn yêu cầu


0

Trên Ubuntu dnsmasq được sử dụng để cung cấp dịch vụ DNS và DHCP cho máy ảo. Các quy trình dnsmasq trên máy chủ lưu trữ hợp đồng thuê của họ trong tệp này:

/var/lib/misc/dnsmasq.leases

Đây là một tệp văn bản bình thường và các dòng trong đó có thể trông giống như ở đây:

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

Các trường bạn quan tâm là cột thứ ba và cột thứ tư: trường thứ ba chứa địa chỉ IPv4 của VM và trường thứ tư chứa dấu hoa thị hoặc tên máy chủ của VM. Điều này phụ thuộc vào phản hồi DHCP được gửi bởi khách đến quy trình dịch vụ dnsmasq.


cảm ơn vì điều đó. trên máy ubfox của tôi, tệp là /var/lib/libvirt/dnsmasq/default.lease với tệp dhclient.conf được đặt để gửi tên máy chủ "myvirtmachine"; như được liệt kê ở trên
don sáng

0

Bạn có thể thay đổi defaultđịnh nghĩa mạng, ánh xạ MAC thành IP trong 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)

Khi bạn bắt đầu một khách, bạn có thể liệt kê tất cả địa chỉ MAC của khách qua

# virsh list --all --mac

Theo byte cuối cùng của địa chỉ MAC, bạn có thể suy ra địa chỉ IP của khách.


Phiên bản nào của virsh nên hoạt động? virsh list --all --mackhông hoạt động trong phiên bản 3.0.0
reox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.