KVM / qemu – 直接使用LVM卷,无需映像文件?

我不太清楚如何说出这个问题(因此,这个题目很差),所以让我举个例子来说明我正在做的事情。

在我的(老)Xen主机上,我能够直接向每个来宾呈现LVM文件系统。 这些文件系统实际上是在主机上创build和格式化的,并直接通过。 例如,对于我使用单独的tmp和交换分区的主机之一,我定义了这样的存储:

磁盘= [
'PHY是:/ dev / VG1 / guest1虚拟交换,SDA1,W',
'PHY是:/ dev / VG1 / guest1虚拟盘,SDA2,W',
'PHY是:/ dev / VG1 / guest1虚拟-TMP,sda3的,W',
]

因此,guest1-swap被格式化为交换分区,guest1-disk和guest1-tmp被格式化为ext4,并且从guest虚拟机的angular度来看,它简单地将它们视为/ dev / sda下的三个格式化分区。

(这可能听起来像很多工作,但有供应脚本,如令人敬畏的xen工具 ,自动几乎所有的东西)。

这提供了一些非常有用的function,其中我特别感兴趣的是找出KVM:

  • 从主机操作系统挂载来宾文件系统 。 我可以在任何时候对guest虚拟机文件系统进行只读挂载,即使guest虚拟机正在运行。 这有一个副作用,允许我在客户运行时创build任何现有卷的LVM快照。 这样,我就可以从主机上集中备份所有的客人。

  • 在线音量调整 。 因为这些卷包含标准的Linux文件系统,所以我可以使用lvextend和resize2fs的组合来扩展我的guest文件系统。

我目前正在设置一个将取代Xen主机的KVM主机。 与Xen设置类似,我利用LVM提供直接的文件系统访问,但KVM / qemu的行为不同,因为它始终为guest虚拟机创build映像文件,即使在LVM卷上也是如此。 从客户的angular度来看,它将其视为未分区的磁盘,由客户来应用分区标签,然后创build分区和文件系统。

从客户的angular度来看,这很好,但从服务器/pipe理的angular度来看,它似乎远没有我所描述的Xen设置灵活。 我还是KVM的新手,所以我可能会(希望)错过了一些东西。

当我尝试在KVM主机上重新实现以前的备份解决scheme时遇到了这个问题,并且当我尝试挂载其中一个guest虚拟机的文件系统时,挂载命令被阻塞。 所以说,这是我目前所关心的问题,但也让我担心这个重新调整的事情,因为我相信这个问题也会在某个时候出现。

所以,这是我的问题:

  1. 有没有什么办法让kvm / qemu直接使用LVM卷文件系统? 如果这有所作为,我使用libvirt进行pipe理。

  2. 如果没有,我能做些什么来获得KVM下类似的安装/备份function? 我已经看过关于使用libguestfs w / FUSE来做这个的讨论,但这真的是最好的select吗? 如果可能,我宁愿坚持本地文件系统挂载。

  3. 如果没有,是否有可能在KVM下进行在线文件系统调整? 我已经find了几个关于这个问题的讨论/答案,但是答案似乎并没有明确,也没有明确的答案。

对不起,很长一段文字,只是想确保清楚。 请让我知道,如果我可以提供任何其他信息将是有益的。 期待讨论。 🙂

  1. qemu-kvm可以使用LV作为虚拟磁盘而不是文件。 这实际上是相当常见的用例。
  2. libguestfs(只是寻找一组virt-*工具)可以提供访问guest虚拟机文件系统的方式,而不是直接重新安装到主机上的任何东西,尽pipe两者都是可能的。
  3. 在线FSresize不是kvm的一个特性,而是客户操作系统应该有的function。 resize2fs可以在虚拟机上运行,​​也可以在物理硬件上运行,唯一的问题是客户重新检测大小的变化。 尝试使用virt-resize作为标准工具,但lvresizeqemu-img也可以轻松使用(尽pipe在离线模式下,通常需要重新启动guest lvresize )。

我认为使用resize2fs lvresize实际上可以在没有重新启动guest lvresize情况下工作,但是我还没有尝试过

我不知道如何复制你描述的Xen行为。 但是,可以使用kpartx将包含全盘映像的LV中的分区公开为主机上的块设备,然后可以挂载等。

在KVM启动脱机映像内核和现有分区时,请参阅我对此问题的回答。 简而言之,只要稍微修改guest / etc / fstab文件,使用virt-install为此创buildconfiguration就非常简单。

由于列出的原因,我使用qemu-kvm + libvirt与您所要求的完全相同的configuration,另外,因为没有KVM主机的文件系统层,我的性能会更好。 如果您在virt-manager中将VG添加为“存储池”,则可以使用用户友好的向导来创build此类虚拟机。 (但是现在我只需要使用现有的虚拟机作为模板来手动编写XML)。

这里是我的客人之一的“virsh dumpxml”的清理输出:

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

另一个想法(与你的问题无关,但可能有帮助):如果可以的话,确保你使用的是“半虚拟”networking,块,随机,时钟等驱动程序 – 它们比完全虚拟化的要快得多。 这是上面的“model = virtio”的东西。 您必须将驱动程序模块加载到主机的内核(如virtio_net)中。

这里是'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>