KVM / qemu-直接使用LVM卷而不使用映像文件?


22

我不太确定该如何表达这个问题(因此标题很差),所以让我提供一个示例来说明我要做什么。

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

磁盘= [
'phy:/ dev / vg1 / guest1-swap,sda1,w',
'phy:/ dev / vg1 / guest1-disk,sda2,w',
'phy:/ dev / vg1 / guest1-tmp,sda3 ,w',
]

因此,guest1-swap格式化为交换分区,guest1-disk和guest1-tmp格式化为ext4,从guest的角度来看,它只是将它们视为/ dev / sda下的三个格式化分区。

(这听起来可能需要做很多工作,但是有一些配置脚本,例如很棒的xen-tools,几乎可以使所有内容自动化)。

这提供了一些非常有用的功能,其中两个我特别想了解KVM:

  • 从主机OS挂载来宾文件系统。即使来宾正在运行,我也可以随时对任何来宾文件系统进行只读装载。这样做的附带好处是,允许我在来宾运行时创建任何现有卷的LVM快照。这样,我可以在运行时从主机集中备份所有来宾。

  • 在线批量调整大小。由于卷包含标准的Linux文件系统,因此我可以结合使用lvextend和resize2fs来增长我的客户机文件系统,使其再次处于联机状态。

我目前正在设置KVM主机,它将替换Xen主机。与Xen设置类似,我利用LVM提供直接的文件系统访问,但是KVM / qemu的行为有所不同,因为它始终为来宾创建映像文件,即使在LVM卷上也是如此。从guest虚拟机的角度来看,它将其视为未分区的磁盘,并且由guest虚拟机负责应用分区标签,然后创建分区和文件系统。

从来宾的角度来看,这很好,但是从服务器/管理的角度来看,它似乎比我描述的Xen设置要灵活得多。我还是KVM的新手,所以(希望)我缺少一些东西。

尝试在KVM主机上重新实现以前的备份解决方案时遇到了这个问题,当我尝试挂载客户机的文件系统之一时,挂载命令出现问题。因此,解决这是我当前的关注,但是这也让我关注调整大小的问题,因为我确定这个问题也会在某个时候出现。

所以,这是我的问题:

  1. 如我为Xen设置所述,有什么方法可以让kvm / qemu直接使用LVM卷文件系统?如果可以,我使用libvirt进行管理。

  2. 如果没有,我该怎么做才能在KVM下获得类似的挂载/备份功能?我已经看到了有关使用带有FUSE的libguestfs进行此操作的讨论,但这真的是最好的选择吗?如果可能的话,我宁愿坚持使用本机文件系统挂载。

  3. 如果不是,是否可以在KVM下调整在线文件系统的大小?我已经找到了一些关于此的讨论/方法,但是答案似乎无处不在,没有明确的,绝对没有直接的解决方案。

抱歉,很长的帖子,只想确保它清楚。请让我知道是否可以提供其他有用的信息。期待讨论。:-)


我刚刚登录以针对这个问题的版本设置赏金:serverfault.com/questions/409543/…。让我们看看您是否为我节省了50分:)
Bittrance

Answers:


9
  1. qemu-kvm可以将LV用作虚拟磁盘而不是文件。实际上,这是相当普遍的用例。
  2. libguestfs(只需查找一组virt-*工具)可以提供比直接重新安装到主机的任何方式更干净的方式来宾文件系统的访问,尽管两者都可行。
  3. 在线FS调整大小不是kvm的功能,而是客户机OS应该具备的功能。resize2fs它将在VM中以及在物理硬件上均能正常工作,唯一的问题是客户机重新检测大小更改。尝试将其virt-resize作为标准工具,但lvresizeqemu-img可以轻松使用(尽管在离线模式下,通常要求来宾重新启动)。

我认为lvresizewith resize2fs可以在不重新启动客户机的情况下正常工作,但是我还没有尝试过


谢谢回复。“ qemu-kvm可以将LV用作虚拟磁盘而不是文件。” 您知道libvirt / virsh是否也适用吗?我已经看到一些暗示使用qemu进行此操作的东西(虽然没有明确的定义),但是对于libvirt而言却没有,我正在使用它进行域管理。
贾里德

1
qemu并不在乎您是否提供块设备或文件作为虚拟磁盘的后备存储。块开发者实际上更好,因为与通过文件系统相比,qemu更快地到达实际块。libvirt在管理存储方面并不出色,但是它确实支持基于LVM的块访问,这有点难以理解,virsh但也很容易实现virt-manager。像RHEV / oVirt更严重的系统实际使用LVM所有的时间用于FC / iSCSI的存储基础
dyasny

@Jared:libvirt / virsh的确支持这一点;我们将其用于所有VM存储。
womble

dyasny,womble-感谢您的评论,但我仍然无法解决这个问题。甚至尝试基于libvirt [ libvirt.org/formatdomain.html#elementsDisks](reference)手动编辑域配置XML ,但是如上所述,使用根文件系统时,我无法启动计算机。我所做的最好的事情就是使用attach-disk它来动态连接,但这不是永久性的,因此我无法使其用于/。您可以为此指出任何文档或提供具体提示吗?谢谢!
贾里德

您看到什么错误?VM是否完全启动?我将通过附加一个liveCD ISO来启动VM,并调查它所看到的和未看到的,罪魁祸首可能是因为磁盘接口从Xen / dev / xvdX更改为kvm的/ dev / vdX(除非您选择使用IDE,然后是/ dev / hdX。如果您这样做,则不要:))
dyasny 2012年

4

我用QEMU-KVM + libvirt的与正是你问的是配置,为您列出的理由,但还因为我得到很多没有范围KVM主机的文件系统层更好的性能。如果在virt-manager中将VG添加为“存储池”,则可以使用其用户友好向导创建此类VM。(但是,这些天我只是使用现有的VM作为模板手工编写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>

另一个想法(与您的问题无关,但可能会有所帮助):如果可以,请确保使用“半虚拟化”网络,阻止,随机,时钟等驱动程序-它们比完全虚拟化的驱动程序快得多。这是上面的“ 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>

4
我认为查看存储池的XML也将很有用,例如virsh pool-dumpxml mypool
Michael Hampton

好的,添加到上面的答案中。
AnotherSmellyGeek

2

我不知道一种完全复制您描述的Xen行为的方法。但是,您可以使用kpartx将包含整个磁盘映像的LV中的分区公开为主机上的块设备,然后将其挂载,等等。


感谢您的评论,理查德。实际上,我已经遇到过该选项,以及lostup,其工作原理类似。那里的问题是我必须先关闭来宾,才能从主机挂载其文件系统。如果我尝试以只读方式挂载,则抱怨文件系统损坏,想要运行fsck,然后中止,因为它是只读的。我没有尝试以读写方式安装它,因为这很可能会导致损坏。这是对一般希望使用qemu图像进行此操作的人的一个很好的提示,但是无需在线要求。
贾里德

2

KVM引导映像外内核和现有分区时,请查看我对这个问题的回答。简而言之,由于对来宾/ etc / fstab进行了少许修改,因此通过virt-install来为此创建配置非常简单。


刚刚尝试过。这是另一个好主意,但仍然不起作用,至少对新来宾不起作用。centos安装程序实际上将vda和vdb视为使用ext4和swap进行了格式化,但是它仍然坚持将它们视为磁盘而不是分区,并且不会直接使用它们,因此无法完成安装。我以为我可以“正常地”安装,然后将文件系统转储到单独的卷中,并像您提到的那样使用grub / fstab来摆弄它,使其正常工作,但这并不是部署guest虚拟机的真正可用的解决方案。我开始对这根本行不通的事实表示不满。
杰瑞德

我误解了。我正在使用yum --installroot直接从主机构建分区,而没有繁琐的安装程序。我的用例是让宾客尽可能保持相似,同时保持最新状态。这就是为什么我要分区而不是磁盘的原因。
Bittrance
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.