KVM / qemu - usa volumes LVM diretamente sem arquivo de imagem?

20

Não sei ao certo como formular essa pergunta (daí o título ruim), então deixe-me fornecer um exemplo do que estou tentando fazer.

No meu (antigo) host Xen, posso apresentar sistemas de arquivos LVM diretamente a cada convidado. Esses sistemas de arquivos são realmente criados e formatados no host e transmitidos diretamente. Por exemplo, para um dos meus hosts usando uma partição tmp e swap separada, eu defino o armazenamento da seguinte forma:

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

Assim, guest1-swap é formatado como uma partição swap, guest1-disk e guest1-tmp são formatados com ext4, e da perspectiva do convidado ele simplesmente os vê como três partições formatadas em / dev / sda.

(isso pode parecer muito trabalho, mas há scripts de provisionamento, como as incríveis xen-tools , que automatizou praticamente tudo).

Isso fornece alguns recursos realmente úteis, dois dos quais estou especialmente interessado em descobrir o KVM:

  • Monte os sistemas de arquivos convidados no sistema operacional host . Eu posso fazer uma montagem somente leitura de qualquer sistema de arquivos convidado a qualquer momento, mesmo enquanto o convidado estiver em execução. Isso tem o benefício de permitir que eu crie instantâneos de LVM de qualquer volume existente enquanto o convidado está em execução. Dessa forma, sou capaz de fazer o backup central de todos os meus convidados, durante a execução, do host.

  • Redimensionamento de volume on-line . Como os volumes contêm sistemas de arquivos padrão do Linux, posso usar uma combinação de lvextend e resize2fs para desenvolver meus sistemas de arquivos convidados, novamente enquanto estiverem on-line.

Atualmente, estou configurando um host KVM que substituirá o host Xen. Semelhante à configuração do Xen, estou aproveitando o LVM para fornecer acesso direto ao sistema de arquivos, mas o KVM / qemu se comporta de maneira diferente, pois sempre cria um arquivo de imagem para os convidados, mesmo no volume LVM. Do ponto de vista do convidado, ele vê isso como um disco não particionado, e cabe ao convidado aplicar um rótulo de partição e criar as partições e os sistemas de arquivos.

Do ponto de vista do convidado, tudo bem, mas do ponto de vista do servidor / gerenciamento, ele parece ser bem menos flexível do que a configuração do Xen que descrevi. Eu ainda sou novo no KVM, então posso estar (com alguma sorte) faltando alguma coisa.

Corri para esse problema ao tentar reimplementar minha antiga solução de backup no host KVM e o comando mount ficou chocado quando tentei montar um dos sistemas de arquivos do guest. Então, abordar isso é minha preocupação atual, mas também me preocupou com o redimensionamento, porque tenho certeza de que a questão surgirá em algum momento.

Então, aqui estão minhas perguntas:

  1. Existe alguma maneira de fazer com que o kvm / qemu use sistemas de arquivos de volume LVM diretamente, como descrevi para minha configuração do Xen? Eu uso o libvirt para gerenciamento se isso faz diferença.

  2. Se não, o que posso fazer para obter uma funcionalidade semelhante de montagem / backup no KVM? Eu vi discussões sobre o uso de libguestfs com FUSE para fazer isso, mas essa é realmente a melhor opção? Eu prefiro ficar com uma montagem de sistema de arquivos nativa, se possível.

  3. Além disso, se não, é possível redimensionar o sistema de arquivos on-line sob o KVM? Eu encontrei várias discussões / howtos sobre isso, mas as respostas parecem estar em todo lugar, sem soluções claras e definitivamente sem respostas.

Desculpe pelo longo post, só queria ter certeza de que estava claro. Por favor, deixe-me saber se eu posso fornecer qualquer outra informação que seria útil. Ansioso para a discussão. : -)

    
por Jared 23.07.2012 / 09:23

4 respostas

9

  1. O qemu-kvm pode usar LVs como discos virtuais em vez de arquivos. este é um caso de uso bastante comum, na verdade.
  2. libguestfs (e apenas procure por um conjunto de virt-* tools) pode fornecer acesso a sistemas de arquivos guest de uma maneira mais limpa do que qualquer coisa que você remonta ao host diretamente, embora ambos sejam possíveis.
  3. O redimensionamento online do FS não é um recurso do kvm, mas algo que o sistema operacional convidado deve ser capaz de fazer. resize2fs funcionará em uma VM, assim como em hardware físico, sendo o único problema que o convidado redetora as mudanças de tamanho. Tente virt-resize como a ferramenta padrão, mas lvresize e qemu-img também podem ser usados facilmente (embora no modo offline, exigindo uma reinicialização geral do convidado).

Acho que lvresize com resize2fs funcionará sem a reinicialização do convidado, mas ainda não tentei

    
por 23.07.2012 / 10:21
2

Eu não sei exatamente como replicar o comportamento Xen que você descreve. No entanto, você pode usar kpartx para expor as partições dentro de um LV que contém uma imagem de disco inteiro como dispositivos de bloco no host, que você pode montar, etc.

    
por 24.07.2012 / 10:12
2

Veja a minha resposta à minha própria pergunta sobre este assunto em inicialização do KVM kernel fora da imagem e partição existente . Em suma, obter o virt-install para criar uma configuração para isso é bastante direto, dada uma pequena modificação do guest / etc / fstab.

    
por 24.07.2012 / 14:51
2

Eu uso o qemu-kvm + libvirt exatamente com a configuração que você está perguntando, pelas razões que você listou, mas adicionalmente porque obtenho muito melhor desempenho sem a camada do sistema de arquivos do host KVM no escopo. Se você adicionar o VG como um 'pool de armazenamento' no virt-manager, poderá criar essas VMs usando seu assistente fácil de usar. (Mas eu apenas escrevo o XML manualmente usando uma VM existente como modelo).

Aqui está a saída higienizada de 'virsh dumpxml' para um dos meus convidados:

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

Outro pensamento (não relevante para sua pergunta, mas pode ajudar): se você puder, certifique-se de usar os drivers de rede, bloco, aleatório, relógio etc paravirtualizados - eles são significativamente mais rápidos do que os totalmente virtualizados uns. Este é o material "model = virtio" acima. Você precisa carregar os módulos do driver no kernel do host, como o virtio_net.

Aqui está a saída de '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>
    
por 22.11.2014 / 09:15