Frage KVM / qemu - LVM-Volumes direkt ohne Image-Datei verwenden?


Ich bin nicht ganz sicher, wie ich diese Frage formulieren soll (daher der schlechte Titel), also lassen Sie mich ein Beispiel dafür geben, was ich zu tun versuche.

Auf meinem (alten) Xen-Host kann ich LVM-Dateisysteme direkt jedem Gast präsentieren. Diese Dateisysteme werden tatsächlich auf dem Host erstellt und formatiert und direkt weitergeleitet. ZB für einen meiner Hosts, die einen separaten tmp und Swap-Partitionen verwenden, definiere ich den Speicher wie folgt:

Festplatte = [
'phy: / dev / vg1 / gast1-swap, sda1, w',
'phy: / dev / vg1 / gast1-disk, sda2, w',
'phy: / dev / vg1 / gast1-tmp, sda3, w',
]

So ist guest1-swap als Swap-Partition formatiert, guest1-disk und guest1-tmp sind mit ext4 formatiert und aus der Perspektive des Gastes sieht es sie einfach als drei formatierte Partitionen unter / dev / sda.

(Das hört sich nach einer Menge Arbeit an, aber es gibt Provisionierungsskripte, wie zum Beispiel das Tolle Xen-Tools, das hat fast alles automatisiert).

Dies bietet einige wirklich nützliche Funktionen, von denen ich besonders an KVM interessiert bin:

  • Hängen Sie die Gastdateisysteme vom Hostbetriebssystem ein. Ich kann jederzeit ein Gast-Dateisystem mounten, sogar während der Gast läuft. Dies hat den zusätzlichen Vorteil, dass ich LVM-Snapshots eines vorhandenen Volumes erstellen kann, während der Gast läuft. Auf diese Weise kann ich alle meine Gäste zentral vom Host aus sichern.

  • Online-Volumen-Größenanpassung. Da die Volumes standardmäßige Linux-Dateisysteme enthalten, kann ich eine Kombination aus lvextend und resize2fs verwenden, um meine Gastdateisysteme wieder zu vergrößern, während sie online sind.

Ich richte gerade einen KVM-Host ein, der den Xen-Host ersetzt. Ähnlich wie beim Xen-Setup nutze ich LVM, um direkten Dateisystemzugriff zu ermöglichen, aber KVM / qemu verhält sich anders immer erstellt eine Image-Datei für die Gäste, auch auf dem LVM-Volume. Aus der Sicht des Gastes sieht es dies als eine unpartitionierte Platte, und es liegt an dem Gast, eine Partitionsbezeichnung anzulegen und dann die Partitionen und Dateisysteme zu erstellen.

Aus Sicht der Gäste ist das in Ordnung, aber aus Sicht des Servers / Managements scheint es viel weniger flexibel zu sein als das von mir beschriebene Xen-Setup. Ich bin immer noch neu in der KVM, also vermisse ich (hoffentlich) etwas.

Ich stieß auf dieses Problem, als ich versuchte, meine frühere Backup-Lösung auf dem KVM-Host neu zu implementieren und den Mount-Befehl zu blockieren, als ich versuchte, eines der Dateisysteme des Gastes zu mounten. Das ist mein aktuelles Anliegen, aber es hat mich auch über die Größenänderung beunruhigt, weil ich mir sicher bin, dass dieses Problem irgendwann auftauchen wird.

Also, hier sind meine Fragen:

  1. Gibt es eine Möglichkeit, LVM-Volume-Dateisysteme direkt in kvm / qemu zu verwenden, wie ich es für mein Xen-Setup beschrieben habe? Ich benutze libvirt für das Management, wenn das einen Unterschied macht.

  2. Wenn nicht, was kann ich tun, um ähnliche Mount / Backup-Funktionen unter KVM zu erhalten? Ich habe Diskussionen über die Verwendung von libguestfs mit FUSE gesehen, aber ist das wirklich die beste Option? Ich würde lieber mit einem nativen Dateisystem-Mount bleiben, wenn irgend möglich.

  3. Wenn nicht, ist es möglich, eine Online-Dateisystem-Größenänderung unter KVM durchzuführen? Ich habe mehrere Diskussionen / Howtos dazu gefunden, aber die Antworten scheinen überall zu sein, ohne klare und definitiv keine einfachen Lösungen.

Sorry für den langen Post, wollte nur sicher gehen, dass es klar war. Bitte lassen Sie mich wissen, wenn ich weitere Informationen bereitstellen kann, die hilfreich wären. Ich freue mich auf die Diskussion. :-)


20
2017-07-23 07:23


Ursprung


Ich habe mich gerade eingeloggt, um ein Kopfgeld auf meine Version dieser Frage zu setzen: serverfault.com/questions/409543/ .... Mal sehen, ob Sie mir 50 Punkte sparen :) - Bittrance


Antworten:


  1. qemu-kvm kann LVs als virtuelle Laufwerke anstelle von Dateien verwenden. Das ist eigentlich ein häufiger Anwendungsfall.
  2. libguestfs (und einfach nach einer Menge suchen virt-* Tools) können den Zugriff auf Gast-Dateisysteme auf eine sauberere Weise ermöglichen als alles, was Sie direkt an den Host zurückmelden, obwohl beides möglich ist.
  3. Online-FS-Größenanpassung ist keine Funktion von kvm, aber etwas, zu dem das Gastbetriebssystem in der Lage sein sollte. resize2fs funktioniert auf einer VM genauso wie auf physischer Hardware. Das einzige Problem ist, dass der Gast die Größenänderungen neu erkennt. Versuchen virt-resize als das Standardwerkzeug, aber lvresize und qemu-img kann auch einfach verwendet werden (obwohl im Offline-Modus, in der Regel ein Gast Neustart erforderlich).

Meiner Ansicht nach lvresize mit resize2fs wird eigentlich ohne einen Gastneustart funktionieren, aber ich habe es noch nicht ausprobiert


9
2017-07-23 08:21



Danke für die Antwort. "qemu-kvm kann LVs als virtuelle Festplatten anstelle von Dateien verwenden." Weißt du, ob dies auch für libvirt / virsh gilt? Ich habe einige Dinge gesehen, die darauf hinweisen, dies mit qemu zu tun (obwohl nichts definitives), aber nichts für libvirt, das ich für die Domänenverwaltung verwende. - Jared
qemu ist es egal, ob Sie ein Block-Gerät oder eine Datei als Backing-Speicher für die virtuelle Festplatte bereitstellen. Block-Devs sind eigentlich besser, weil qemu auf diese Weise die tatsächlichen Blöcke schneller erreicht als durch ein Dateisystem. libvirt ist nicht erstaunlich in der Verwaltung von Speicher, aber es unterstützt LVM-basierten Blockzugriff, ein bisschen schwer zu erreichen virsh aber einfach genug durch virt-manager. Die ernsteren Systeme wie RHEV / oVirt verwenden LVM ständig für FC / iSCSI-basierten Speicher - dyasny
@ Jared: libvirt / virsh unterstützt das definitiv; Wir verwenden es für unseren gesamten VM-Speicher. - womble♦
dyasny, womble - schätzen die Kommentare, aber ich kann immer noch nicht zur Arbeit. Es wurde sogar versucht, die Domänenkonfigurations-XML basierend auf dem libvirt manuell zu bearbeiten.libvirt.org/formatdomain.html#elementsDisks] (Referenz), aber ich kann die Maschine nicht starten, wenn ich ein Root-Dateisystem verwende, wie ich es beschrieben habe. Das Beste, was ich getan habe, ist zu benutzen attach-disk um es dynamisch zu verbinden, aber das ist nicht dauerhaft und ich kann es nicht für / arbeiten. Können Sie auf eine Dokumentation dafür verweisen oder spezielle Hinweise geben? Vielen Dank! - Jared
Welche Fehler siehst du? Startet die VM überhaupt? Ich würde die VM mit einem LiveCD ISO anhängen und untersuchen, was es sieht und was es nicht sieht, der Täter ist wahrscheinlich um die Tatsache herum, dass sich die Festplattenschnittstellen von Xen / dev / xvdX zu kvms / dev / vdX geändert haben (außer Du hast dich für IDE entschieden und dann ist es / dev / hdX. Wenn du das getan hast, dann tu es nicht :)) - dyasny


Ich kenne keine Möglichkeit, das Xen-Verhalten, das Sie beschreiben, exakt zu reproduzieren. Sie können jedoch verwenden kpartx um die Partitionen in einem LV freizulegen, die ein Image für ganze Festplatten als Blockgeräte auf dem Host enthalten, die Sie dann mounten können usw.


2
2017-07-24 08:12



Danke für den Kommentar, Richard. Ich bin bereits auf diese Option und losetup, die ähnlich funktioniert, schon gestoßen. Das Problem dort ist, dass ich den Gast zuerst herunterfahren muss, um seine Dateisysteme vom Host zu mounten. Wenn ich versuche, schreibgeschützt zu mounten, wenn ich über Dateisystembeschädigung klag, möchte ich einen fsck ausführen, und bricht dann ab, weil es schreibgeschützt ist. Ich habe nicht versucht, es zu lesen-schreiben, weil das gut könnte Ursache Korruption. Dies ist ein guter Tipp für alle, die dies mit Qemu-Bildern im Allgemeinen tun möchten, jedoch ohne die Online-Anforderung. - Jared


Siehe meine Antwort auf meine eigene Frage zu diesem Thema unter KVM-Boot-Off-Image-Kernel und vorhandene Partition. Kurz gesagt, die Installation von virt-install, um eine Konfiguration dafür zu erstellen, ist ziemlich einfach, wenn man eine kleine Änderung an guest / etc / fstab vornimmt.


2
2017-07-24 12:51



Ich habe das gerade ausprobiert. Es ist eine andere großartige Idee, funktioniert aber immer noch nicht, zumindest nicht für neue Gäste. Das centos-Installationsprogramm sieht VDA und VDB tatsächlich als formatiert mit ext4 und swap, aber es besteht immer noch darauf, sie als Festplatten und nicht als Partitionen zu behandeln und sie nicht direkt zu verwenden, daher kann ich die Installation nicht abschließen. Ich nehme an, ich könnte "normal" installieren, dann delete die Dateisysteme auf separaten Volumes aus und faulen mit grub / fstab, wie du es erwähnt hast, um es zum Laufen zu bringen, aber das ist keine brauchbare Lösung für die Bereitstellung von Gästen. Ich fange an, mich damit abzufinden, dass das einfach nicht funktioniert. - Jared
Ich habe es falsch verstanden. Ich verwende yum --installroot, um die Partitionen direkt vom Host zu erstellen, ohne lästige Installer zu involvieren. Mein Anwendungsfall ist es, möglichst ähnliche Gäste zu bekommen und dabei auf dem neuesten Stand zu bleiben. Deshalb möchte ich Partitionen anstatt Festplatten. - Bittrance


Ich benutze qemu-kvm + libvirt mit genau der Konfiguration, nach der du fragst, aus den Gründen, die du aufgelistet hast, aber zusätzlich, weil ich es bekomme viel bessere Leistung ohne den Dateisystem-Layer des KVM-Hosts. Wenn Sie das VG als 'Speicherpool' in virt-manager hinzufügen, können Sie solche VMs mit dem benutzerfreundlichen Assistenten erstellen. (Aber ich schreibe die XML-Datei in diesen Tagen nur mit einer vorhandenen VM als Vorlage).

Hier ist die bereinigte Ausgabe von 'virsh dumpxml' für einen meiner Gäste:

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

Ein anderer Gedanke (nicht relevant für Ihre Frage, aber es könnte helfen): Wenn Sie können, stellen Sie sicher, dass Sie die "paravirtualisierten" Netzwerk-, Block-, Zufalls-, Uhr usw. Treiber verwenden - sie sind deutlich schneller als die vollständig virtualisierten. Dies ist das "Modell = Virtio" -Sachen oben. Sie müssen Treibermodule wie zB virtio_net in den Kernel des Hosts laden.

Hier ist die Ausgabe von '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>

2
2017-11-22 08:15



Ich denke, es wäre auch nützlich, das XML für den Speicherpool zu sehen, z.B. virsh pool-dumpxml mypool - Michael Hampton♦
Okay, zu der obigen Antwort hinzugefügt. - AnotherSmellyGeek