KVM / qemu - sử dụng khối lượng LVM trực tiếp mà không cần tệp hình ảnh?


22

Tôi không chắc chắn làm thế nào để diễn đạt câu hỏi này (do đó là tiêu đề kém), vì vậy hãy để tôi cung cấp một ví dụ về những gì tôi đang cố gắng làm.

Trên máy chủ Xen (cũ) của tôi, tôi có thể trình bày trực tiếp các hệ thống tệp LVM cho mỗi khách. Các hệ thống tập tin này thực sự được tạo và định dạng trên máy chủ, và được truyền trực tiếp qua. Ví dụ: đối với một trong những máy chủ của tôi sử dụng phân vùng trao đổi và tmp riêng, tôi xác định bộ nhớ như sau:

đĩa = [
'phy: / dev / vg1 / guest1-exchange, sda1, w',
'phy: / dev / vg1 / guest1-đĩa, sda2, w',
'phy: / dev / vg1 / guest1-tmp, sda3 , w ',
]

Vì vậy, guest1-exchange được định dạng dưới dạng phân vùng trao đổi, guest1-đĩa và guest1-tmp được định dạng bằng ext4 và từ phối cảnh của khách, nó chỉ đơn giản xem chúng là ba phân vùng được định dạng dưới / dev / sda.

(Điều này nghe có vẻ như rất nhiều công việc, nhưng có các tập lệnh cung cấp, chẳng hạn như các công cụ xen kẽ tuyệt vời , tự động hóa mọi thứ khá nhiều).

Điều này cung cấp một số khả năng thực sự hữu ích, hai trong số đó tôi đặc biệt quan tâm đến việc tìm ra KVM:

  • Gắn kết hệ thống tập tin khách từ hệ điều hành máy chủ . Tôi có thể thực hiện gắn kết chỉ đọc của bất kỳ hệ thống tệp khách nào bất cứ lúc nào, ngay cả khi khách đang chạy. Điều này có lợi ích phụ là cho phép tôi tạo ảnh chụp nhanh LVM của bất kỳ khối lượng hiện có nào trong khi khách đang chạy. Bằng cách này, tôi có thể sao lưu tập trung tất cả khách của mình, trong khi chạy, từ máy chủ.

  • Thay đổi kích thước âm lượng trực tuyến . Vì các tập chứa hệ thống tệp Linux tiêu chuẩn, tôi có thể sử dụng kết hợp lvextend và resize2fs để phát triển hệ thống tệp khách của mình, một lần nữa khi chúng trực tuyến.

Tôi hiện đang thiết lập máy chủ KVM sẽ thay thế máy chủ Xen. Tương tự như thiết lập Xen Tôi đang tận dụng LVM để cung cấp quyền truy cập hệ thống tệp trực tiếp, nhưng KVM / qemu hoạt động khác nhau ở chỗ nó luôn tạo tệp hình ảnh cho khách, ngay cả trên âm lượng LVM. Từ phối cảnh của khách, nó thấy đây là một đĩa không liên kết và tùy thuộc vào khách để áp dụng nhãn phân vùng, sau đó tạo các phân vùng và hệ thống tệp.

Từ góc độ khách, điều đó tốt, nhưng từ góc độ máy chủ / quản lý, nó dường như kém linh hoạt hơn nhiều so với thiết lập Xen mà tôi đã mô tả. Tôi vẫn chưa quen với KVM, vì vậy tôi có thể (hy vọng) thiếu thứ gì đó.

Tôi gặp phải vấn đề này khi cố gắng thực hiện lại giải pháp sao lưu cũ của mình trên máy chủ KVM và lệnh mount bị nghẹt khi tôi cố gắn một trong các hệ thống tập tin của khách. Vì vậy, giải quyết vấn đề đó là mối quan tâm hiện tại của tôi, nhưng nó cũng khiến tôi lo ngại về vấn đề thay đổi kích thước, bởi vì tôi chắc chắn rằng vấn đề đó cũng sẽ xuất hiện vào một lúc nào đó.

Vì vậy, đây là những câu hỏi của tôi:

  1. Có cách nào để kvm / qemu sử dụng các hệ thống tập tin âm lượng LVM trực tiếp như tôi đã mô tả cho thiết lập Xen của mình không? Tôi sử dụng libvirt để quản lý nếu điều đó tạo ra sự khác biệt.

  2. Nếu không, tôi có thể làm gì để có được chức năng gắn / sao lưu tương tự trong KVM? Tôi đã thấy các cuộc thảo luận về việc sử dụng libguestfs w / FUSE để làm điều này, nhưng đó có thực sự là lựa chọn tốt nhất không? Tôi muốn gắn bó với một hệ thống tập tin gốc nếu có thể.

  3. Ngoài ra nếu không, có thể thay đổi kích thước hệ thống tập tin trực tuyến theo KVM không? Tôi đã tìm thấy một số cuộc thảo luận / howtos về điều này, nhưng câu trả lời dường như ở khắp mọi nơi không có giải pháp rõ ràng và chắc chắn không có giải pháp đơn giản.

Xin lỗi cho bài viết dài, chỉ muốn chắc chắn rằng nó rõ ràng. Xin vui lòng cho tôi biết nếu tôi có thể cung cấp bất kỳ thông tin nào khác sẽ hữu ích. Mong được thảo luận. :-)


Tôi vừa đăng nhập để đặt tiền thưởng cho phiên bản của câu hỏi này: serverfault.com/questions / 409543 / . Hãy xem bạn có tiết kiệm cho tôi 50 điểm không :)
Bittrance

Câu trả lời:


9
  1. qemu-kvm có thể sử dụng LV làm đĩa ảo thay vì tệp. Đây thực sự là một trường hợp sử dụng phổ biến.
  2. libguestfs (và chỉ cần tìm một bộ virt-*công cụ) có thể cung cấp quyền truy cập vào các hệ thống tệp khách theo cách sạch hơn bất kỳ thứ gì bạn gửi trực tiếp đến máy chủ, mặc dù cả hai đều có thể.
  3. Thay đổi kích thước FS trực tuyến không phải là một tính năng của kvm, nhưng điều mà hệ điều hành khách nên có khả năng. resize2fssẽ hoạt động trong máy ảo cũng như trên phần cứng vật lý, vấn đề duy nhất là khách có thể thay đổi kích thước. Hãy thử virt-resizenhư công cụ tiêu chuẩn, nhưng lvresizeqemu-imgcũng có thể dễ dàng được sử dụng (mặc dù trong chế độ offline, đòi hỏi phải khởi động lại khách thường).

Tôi nghĩ rằng lvresizevới resize2fsthực tế sẽ làm việc mà không cần khởi động lại của khách, nhưng tôi đã không thử nó chưa


Cảm ơn vi đa trả lơi. "qemu-kvm có thể sử dụng LV làm đĩa ảo thay vì tệp." Bạn có biết điều này cũng đúng với libvirt / virsh không? Tôi đã thấy một số điều ám chỉ để làm điều này với qemu (mặc dù không có gì rõ ràng), nhưng không có gì cho libvirt, mà tôi đang sử dụng để quản lý tên miền.
Jared

1
qemu không thực sự quan tâm đến việc bạn cung cấp một thiết bị khối hay một tệp làm kho lưu trữ sao lưu cho đĩa ảo. khối dev thực sự tốt hơn bởi vì cách này qemu tiếp cận các khối thực tế nhanh hơn bằng cách đi qua một hệ thống tập tin. libvirt không tuyệt vời trong việc quản lý lưu trữ, nhưng nó hỗ trợ truy cập khối dựa trên LVM, hơi khó để vượt qua virshnhưng đủ dễ dàng thông qua virt-manager. Các hệ thống nghiêm trọng hơn như RHEV / oVirt thực sự sử dụng LVM mọi lúc để lưu trữ dựa trên FC / iSCSI
dyasny

@Jared: libvirt / virsh chắc chắn hỗ trợ điều này; chúng tôi sử dụng nó cho tất cả lưu trữ VM của chúng tôi.
womble

dyasny, womble - đánh giá cao các ý kiến, nhưng tôi vẫn không thể làm cho nó hoạt động. Thậm chí đã thử chỉnh sửa thủ công XML cấu hình miền dựa trên libvirt [ libvirt.org/formatdomain.html#elementsDisks[(reference) , nhưng tôi không thể khởi động máy khi sử dụng hệ thống tệp gốc như tôi đã mô tả. Điều tốt nhất tôi đã làm là sử dụng attach-diskđể kết nối nó một cách linh hoạt, nhưng điều này không phải là vĩnh viễn và tôi không thể làm cho nó hoạt động cho /. Bạn có thể chỉ ra bất kỳ tài liệu cho việc này, hoặc cung cấp gợi ý cụ thể? Cảm ơn!
Jared

bạn đang nhìn thấy những lỗi gì? VM có khởi động được không? Tôi sẽ khởi động VM với ISO ISO được đính kèm và điều tra những gì nó nhìn thấy và những gì nó không thấy, thủ phạm có lẽ xoay quanh việc các giao diện đĩa thay đổi từ Xen / dev / xvdX thành kvm's / dev / vdX (trừ khi bạn đã chọn sử dụng IDE và sau đó là / dev / hdX. Nếu bạn đã không thì :))
dyasny

4

Tôi sử dụng qemu-kvm + libvirt với chính xác cấu hình bạn đang hỏi, vì những lý do bạn đã liệt kê, nhưng ngoài ra vì tôi có hiệu suất tốt hơn nhiều nếu không có lớp hệ thống tệp của máy chủ KVM trong phạm vi. Nếu bạn thêm VG làm 'nhóm lưu trữ' trong trình quản lý tài năng, bạn có thể tạo các máy ảo như vậy bằng trình hướng dẫn thân thiện với người dùng. (Nhưng tôi chỉ viết XML bằng tay những ngày này bằng cách sử dụng VM hiện có làm mẫu).

Đây là đầu ra được khử trùng của 'virsh dumpxml' cho một trong những vị khách của tôi:

<domain type='kvm'>
  <name>somevm</name>
  <uuid>f173d3b5-704c-909e-b597-c5a823ad48c9</uuid>
  <description>Windows Server 2008 R2</description>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-1.1'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>Nehalem</model>
    <vendor>Intel</vendor>
    <feature policy='require' name='tm2'/>
    <feature policy='require' name='est'/>
    <feature policy='require' name='monitor'/>
    <feature policy='require' name='smx'/>
    <feature policy='require' name='ss'/>
    <feature policy='require' name='vme'/>
    <feature policy='require' name='dtes64'/>
    <feature policy='require' name='rdtscp'/>
    <feature policy='require' name='ht'/>
    <feature policy='require' name='ds'/>
    <feature policy='require' name='pbe'/>
    <feature policy='require' name='tm'/>
    <feature policy='require' name='pdcm'/>
    <feature policy='require' name='vmx'/>
    <feature policy='require' name='ds_cpl'/>
    <feature policy='require' name='xtpr'/>
    <feature policy='require' name='acpi'/>
  </cpu>
  <clock offset='localtime'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/vg1/somevm'/>
      <target dev='hda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <interface type='bridge'>
      <mac address='00:00:00:00:00:00'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <video>
      <model type='vga' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='none' model='none'/>
</domain>

Một suy nghĩ khác (không liên quan đến câu hỏi của bạn nhưng nó có thể giúp ích): nếu bạn có thể, hãy chắc chắn rằng bạn đang sử dụng các trình điều khiển mạng, chặn, ngẫu nhiên, đồng hồ, v.v. - chúng nhanh hơn đáng kể so với các trình ảo hóa hoàn toàn. Đây là công cụ "model = virtio" ở trên. Bạn phải tải các mô-đun trình điều khiển vào kernel của máy chủ, chẳng hạn như virtio_net.

Đây là đầu ra của 'virsh pool-dumpxml vg1':

<pool type='logical'>
  <name>vg1</name>
  <uuid>9e26648e-64bc-9221-835f-140f6def0556</uuid>
  <capacity unit='bytes'>3000613470208</capacity>
  <allocation unit='bytes'>1824287358976</allocation>
  <available unit='bytes'>1176326111232</available>
  <source>
    <device path='/dev/md1'/>
    <name>vg1</name>
    <format type='lvm2'/>
  </source>
  <target>
    <path>/dev/vg1</path>
    <permissions>
      <mode>0700</mode>
    </permissions>
  </target>
</pool>

4
Tôi nghĩ rằng nó cũng sẽ hữu ích để xem XML cho hồ lưu trữ, ví dụvirsh pool-dumpxml mypool
Michael Hampton

Được rồi, thêm vào câu trả lời ở trên.
AnotherSmellyGeek

2

Tôi không biết cách sao chép chính xác hành vi Xen mà bạn mô tả. Tuy nhiên, bạn có thể sử dụng kpartxđể hiển thị các phân vùng trong LV có chứa hình ảnh toàn đĩa dưới dạng các thiết bị khối trên máy chủ, sau đó bạn có thể gắn kết, v.v.


Cảm ơn vì nhận xét, Richard. Tôi thực sự đã bắt gặp tùy chọn đó rồi, cũng như losetup, hoạt động tương tự. Vấn đề ở đây là tôi phải tắt máy khách trước để gắn hệ thống tập tin của nó từ máy chủ. Nếu tôi cố gắn kết chỉ đọc, nếu phàn nàn về tham nhũng hệ thống tệp, muốn chạy fsck, sau đó hủy bỏ vì nó chỉ đọc. Tôi đã không thử gắn nó đọc-ghi, vì điều đó cũng có thể gây ra tham nhũng. Đây là một mẹo tuyệt vời cho bất cứ ai muốn làm điều này với hình ảnh qemu nói chung, mặc dù, không có yêu cầu trực tuyến.
Jared

2

Xem câu trả lời của tôi cho câu hỏi của riêng tôi về vấn đề này khi KVM khởi động kernel ngoài hình ảnh và phân vùng hiện có . Nói tóm lại, việc cài đặt virt-install để tạo một cấu hình cho việc này khá đơn giản, được điều chỉnh một chút về khách / etc / fstab.


Chỉ cần thử nó. Đó là một ý tưởng tuyệt vời khác, nhưng vẫn không hiệu quả, ít nhất là không dành cho khách mới. Trình cài đặt centos thực sự thấy vda và vdb được định dạng bằng ext4 và trao đổi, nhưng nó vẫn khăng khăng coi chúng là đĩa chứ không phải phân vùng và sẽ không sử dụng trực tiếp, vì vậy tôi không thể hoàn tất cài đặt. Tôi nghĩ rằng tôi có thể cài đặt "bình thường", sau đó kết xuất các hệ thống tập tin ra để tách khối lượng và fiddle với grub / fstab như bạn đã đề cập để làm cho nó hoạt động, nhưng đó không thực sự là một giải pháp có thể sử dụng để triển khai khách. Tôi bắt đầu cam chịu với thực tế rằng điều này chỉ đơn giản là không hoạt động.
Jared

Tôi đã hiểu nhầm. Tôi đang sử dụng yum --installroot để xây dựng các phân vùng trực tiếp từ máy chủ mà không liên quan đến các trình cài đặt phiền phức. Trường hợp sử dụng của tôi là để có được những vị khách giống nhau nhất có thể, trong khi vẫn cập nhật. Đây là lý do tại sao tôi muốn phân vùng hơn là đĩa.
Bittrance
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.