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

22

Não tenho muita certeza de como formular esta pergunta (daí o título ruim), então deixe-me dar um exemplo do que estou tentando fazer.

No meu antigo host Xen, posso apresentar sistemas de arquivos LVM diretamente a cada convidado. Na verdade, esses sistemas de arquivos são criados e formatados no host e transmitidos diretamente. Por exemplo, para um dos meus hosts usando partições tmp e swap separadas, defino o armazenamento da seguinte maneira:

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

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

(Isso pode parecer muito trabalhoso, mas existem scripts de provisionamento, como as incríveis ferramentas xen , que automatizaram praticamente tudo).

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

  • Monte os sistemas de arquivos convidados no sistema operacional host . 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 a vantagem de permitir que eu crie instantâneos LVM de qualquer volume existente enquanto o convidado estiver em execução. Dessa forma, eu posso fazer backup centralizado de todos os meus convidados, durante a execução, do host.

  • Redimensionamento de volume online . Como os volumes contêm sistemas de arquivos Linux padrão, posso usar uma combinação de lvextend e resize2fs para aumentar meus sistemas de arquivos convidados, novamente enquanto estão online.

No momento, estou configurando um host KVM que substituirá o host Xen. Semelhante à configuração do Xen, estou utilizando 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 do LVM. Da perspectiva 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 servidor / gerenciamento, parece ser muito menos flexível do que a configuração do Xen que descrevi. Eu ainda sou novo na KVM, então talvez esteja perdendo alguma coisa.

Encontrei este problema ao tentar reimplementar minha solução de backup anterior no host KVM e o comando mount chocou quando tentei montar um dos sistemas de arquivos do convidado. Portanto, abordar essa é a minha preocupação atual, mas também me preocupou com o redimensionamento, porque tenho certeza de que esse problema também surgirá em algum momento.

Então, aqui estão as minhas questões:

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

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

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

Desculpe pelo longo post, só queria ter certeza de que estava claro. Informe-me se posso fornecer outras informações que possam ser úteis. Ansioso para a discussão. :-)

Jared
fonte
Acabei de fazer login para definir uma recompensa na minha versão desta pergunta: serverfault.com/questions/409543/… . Vamos ver se você me salvar 50 pontos :)
Bittrance

Respostas:

9
  1. O qemu-kvm pode usar LVs como discos virtuais em vez de arquivos. esse é um caso de uso bastante comum, na verdade.
  2. O libguestfs (e apenas procure um conjunto de virt-*ferramentas) pode fornecer acesso aos sistemas de arquivos convidados de uma maneira mais limpa do que qualquer coisa que você remonte diretamente ao host, embora ambos sejam possíveis.
  3. O redimensionamento do FS online não é um recurso do kvm, mas algo que o sistema operacional convidado deve ser capaz. resize2fsfuncionará tanto em uma VM quanto em hardware físico, o único problema é o convidado redetectar as alterações de tamanho. Tente virt-resizecomo a ferramenta padrão, mas lvresizee qemu-imgtambém pode ser facilmente utilizado (embora em modo offline, o que requer um reinício convidado geralmente).

Eu acho que lvresizecom resize2fsrealmente funcionará sem a reinicialização de um convidado, mas ainda não tentei

dyasny
fonte
Obrigado pela resposta. "qemu-kvm pode usar LVs como discos virtuais em vez de arquivos." Você sabe se isso também é verdade para libvirt / virsh? Eu vi algumas coisas aludindo a fazer isso com o qemu (embora nada definido), mas nada para libvirt, que estou usando para gerenciamento de domínio.
Jared
1
O qemu realmente não se importa se você fornece um dispositivo de bloco ou um arquivo como armazenamento de suporte para o disco virtual. Os desenvolvedores de bloco são realmente melhores porque desta maneira o qemu alcança os blocos reais mais rapidamente do que através de um sistema de arquivos. A libvirt não é incrível no gerenciamento de armazenamento, mas suporta o acesso a blocos baseado em LVM, um pouco difícil de conseguir, virshmas fácil o suficiente virt-manager. Os sistemas mais graves, como RHEV / oVirt realmente usar LVM todo o tempo para FC / iSCSI base de armazenamento
dyasny
@ Jared: libvirt / virsh definitivamente suporta isso; nós o usamos para todo o nosso armazenamento de VM.
womble
dyasny, womble - aprecie os comentários, mas ainda não consigo fazer isso funcionar. Até tentei editar manualmente o XML de configuração do domínio com base no libvirt [ libvirt.org/formatdomain.html#elementsDisksξ(reference) , mas não consigo inicializar a máquina ao usar um sistema de arquivos raiz, como descrevi. O melhor que fiz foi usá attach-disk-lo para conectá-lo dinamicamente, mas isso não é permanente e não consigo fazê-lo funcionar para /. Você pode apontar para alguma documentação para isso ou fornecer dicas específicas? Obrigado!
Jared
que erros você está vendo? A VM é inicializada? Gostaria de iniciar a VM com um ISO do liveCD anexado e investigar o que vê e o que não vê, o culpado provavelmente está no fato de que as interfaces de disco foram alteradas do Xen / dev / xvdX para o kvm / dev / vdX (a menos que você escolheu usar IDE e então é / dev / hdX Se você, em seguida, fez não :)).
dyasny
4

Eu uso o qemu-kvm + libvirt exatamente com a configuração que você está perguntando, pelos motivos listados, mas além disso, porque eu obtenho um desempenho muito melhor sem o escopo da camada do sistema de arquivos do host KVM. 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 hoje em dia usando uma VM existente como modelo).

Aqui está a saída higienizada do '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 a sua pergunta, mas pode ajudar): se você puder, verifique se está usando os drivers de rede, paravirtualizados, de bloqueio, aleatórios, de relógio etc. - eles são significativamente mais rápidos que os totalmente virtualizados. Este é o material "model = virtio" acima. Você precisa carregar módulos de driver no kernel do host, como virtio_net.

Aqui está a saída do '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>
AnotherSmellyGeek
fonte
4
Eu acho que também seria útil ver o XML para o pool de armazenamento, por exemplovirsh pool-dumpxml mypool
Michael Hampton
Ok, adicionado à resposta acima.
AnotherSmellyGeek
2

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

Richard Kettlewell
fonte
Obrigado pelo comentário, Richard. Na verdade, eu já deparei com essa opção, assim como o losetup, que funciona da mesma forma. A questão é que eu tenho que desligar o convidado primeiro para montar seus sistemas de arquivos a partir do host. Se eu tentar montar somente leitura, se reclamar de corrupção no sistema de arquivos, quiser executar um fsck e abortar porque é somente leitura. Eu não tentei montá-lo de leitura e gravação, porque isso poderia causar corrupção. Essa é uma ótima dica para quem deseja fazer isso com as imagens do qemu em geral, sem a necessidade on-line.
Jared
2

Veja minha resposta para minha própria pergunta sobre esse assunto no KVM, inicializando o kernel off-image e a partição existente . Em resumo, fazer com que o virt-install crie uma configuração para isso é bastante simples, dada uma pequena modificação do guest / etc / fstab.

Bittrance
fonte
Apenas tentei isso. É outra ótima idéia, mas ainda não funciona, pelo menos não para novos convidados. O instalador do centos realmente vê o vda e o vdb como formatado com ext4 e swap, mas ainda insiste em tratá-los como discos, em vez de partições, e não os usará diretamente, por isso não posso concluir a instalação. Eu suponho que eu poderia instalar "normalmente", depois despejar os sistemas de arquivos para separar volumes e mexer no grub / fstab como você mencionou para fazê-lo funcionar, mas essa não é realmente uma solução utilizável para a implantação de convidados. Estou começando a me resignar ao fato de que isso simplesmente não funciona.
Jared
Eu entendi errado. Estou usando o yum --installroot para criar as partições diretamente do host sem envolver instaladores irritantes. Meu caso de uso é obter convidados o mais semelhante possível, mantendo-se atualizado. É por isso que quero partições em vez de discos.
Bittrance 27/07/12