KVM / qemu-이미지 파일없이 LVM 볼륨을 직접 사용 하시겠습니까? 대체 할

이 질문을 어떻게 표현해야할지 잘 모르겠으므로 (따라서 제목이 좋지 않습니다), 내가하려는 일의 예를 들어 보겠습니다.

내 (오래된) 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로 포맷되며 게스트의 관점에서 단순히 / dev / sda 아래에 3 개의 포맷 된 파티션으로 표시됩니다.

(이것은 많은 작업처럼 들리지만 , 거의 모든 것을 자동화 하는 굉장한 xen-tools 와 같은 프로비저닝 스크립트가 있습니다 ).

이것은 실제로 유용한 기능을 제공하며, 그중 두 가지는 KVM을 알아내는 데 특히 관심이 있습니다.

  • 호스트 OS에서 게스트 파일 시스템을 마운트하십시오 . 게스트가 실행되는 동안에도 언제든지 게스트 파일 시스템의 읽기 전용 마운트를 수행 할 수 있습니다. 게스트가 실행되는 동안 기존 볼륨의 LVM 스냅 샷을 만들 수 있다는 장점이 있습니다. 이렇게하면 호스트에서 모든 게스트를 실행하는 동안 중앙에서 백업 할 수 있습니다.

  • 온라인 볼륨 크기 조정 . 볼륨에는 표준 Linux 파일 시스템이 포함되어 있으므로 온라인 상태 일 때 lvextend와 resize2fs를 함께 사용하여 게스트 파일 시스템을 키울 수 있습니다.

현재 Xen 호스트를 대체 할 KVM 호스트를 설정하고 있습니다. 젠 설정과 유사 내가 직접 파일 시스템 액세스를 제공하기 위해 LVM을 활용하고 있습니다 만, KVM은 / QEMU는 점에서 다르게 작동 항상 심지어 LVM 볼륨에, 손님 용 이미지 파일을 만듭니다. 게스트의 관점에서 볼 때이 파티션은 파티션되지 않은 디스크로 간주되며 파티션 레이블을 적용한 다음 파티션과 파일 시스템을 만드는 것은 게스트의 책임입니다.

게스트 관점에서는 괜찮지 만 서버 / 관리 관점에서는 내가 설명한 Xen 설정보다 훨씬 유연하지 않은 것 같습니다. 나는 여전히 KVM을 처음 사용하기 때문에 (희망스럽게) 무언가가 빠져있을 수 있습니다.

KVM 호스트에서 이전 백업 솔루션을 다시 구현하려고 할 때이 문제가 발생했으며 게스트의 파일 시스템 중 하나를 마운트하려고 할 때 mount 명령이 막혔습니다. 따라서 현재 해결해야 할 문제이지만 크기 조정에 대해서도 걱정이되었습니다. 문제가 어느 시점에 나올 것이라고 확신하기 때문입니다.

내 질문은 다음과 같습니다.

  1. Xen 설정에 대해 설명한대로 kvm / qemu에서 LVM 볼륨 파일 시스템을 직접 사용하는 방법이 있습니까? 차이가 나는 경우 관리를 위해 libvirt를 사용합니다.

  2. 그렇지 않은 경우 KVM에서 유사한 마운트 / 백업 기능을 사용하려면 어떻게해야합니까? FUSE를 사용하여 libguestfs를 사용하는 방법에 대한 토론을 보았지만 이것이 최선의 선택입니까? 가능한 경우 기본 파일 시스템 마운트를 사용하는 것을 선호합니다.

  3. 또한 그렇지 않은 경우 KVM에서 온라인 파일 시스템 크기 조정을 수행 할 수 있습니까? 나는 이것에 관해 몇 가지 토론 / 하우투를 발견했지만 그 대답은 명확하고 명확하지 않은 해결책이없는 곳곳에있는 것처럼 보입니다.

긴 게시물에 대해 죄송합니다. 명확하게 확인하고 싶었습니다. 도움이 될만한 다른 정보를 제공해 주시면 알려주십시오. 토론을 기대합니다. 🙂



답변

  1. qemu-kvm은 LV를 파일 대신 가상 디스크로 사용할 수 있습니다. 이것은 실제로 일반적인 사용 사례입니다.
  2. libguestfs (및 virt-*툴 세트 만 찾으면 )는 호스트에 직접 마운트하는 것보다 더 깔끔한 방식으로 게스트 파일 시스템에 대한 액세스를 제공 할 수 있습니다.
  3. 온라인 FS 크기 조정은 kvm의 기능이 아니라 게스트 OS가 수행 할 수있는 기능입니다. resize2fs물리적 하드웨어에서와 마찬가지로 VM에서도 작동하며 게스트가 크기 변경을 다시 감지하는 것만 문제가됩니다. 시도 virt-resize표준 도구로하지만, lvresizeqemu-img(오프라인 모드에서, 일반적으로 게스트를 다시 시작을 필요로하지만) 쉽게 사용할 수 있습니다.

실제로 게스트를 다시 시작하지 않고도 lvresizewith resize2fs가 작동 한다고 생각 하지만 아직 시도하지 않았습니다.


답변

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>

답변

설명하는 Xen 동작을 정확하게 복제하는 방법을 모르겠습니다. 그러나 kpartx전체 디스크 이미지를 포함하는 LV 내의 파티션을 호스트의 블록 장치로 표시하는 데 사용할 수 있습니다.


답변

KVM 부팅 이미지 커널 및 기존 파티션 에서이 문제에 대한 본인의 질문에 대한 답변을 참조하십시오 . 간단히 말해, virt-install을 사용하여 구성을 만들면 게스트 / etc / fstab을 약간 수정하면 간단합니다.