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로 포맷되며 게스트의 관점에서 단순히 / 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에서 온라인 파일 시스템 크기 조정을 수행 할 수 있습니까? 나는 이것에 관해 몇 가지 토론 / 하우투를 발견했지만 그 대답은 명확하고 명확하지 않은 해결책이없는 곳곳에있는 것처럼 보입니다.

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


방금 로그인 하여이 질문의 내 버전에 현상금을 설정했습니다 : serverfault.com/questions/409543/… . 당신이 저를 50 포인트 저장하면 보자 :)
Bittrance

답변:


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에는 아무것도 없습니다.
Jared

1
qemu는 가상 디스크의 백업 저장소로 블록 장치 또는 파일을 제공하는지 여부를 실제로 신경 쓰지 않습니다. qemu가 파일 시스템을 통과하는 것보다 실제 블록에 더 빨리 도달하기 때문에 블록 개발자가 실제로 더 좋습니다. libvirt는 스토리지 관리에 놀랄만 한 것은 아니지만 LVM 기반 블록 액세스를 지원 virsh합니다 virt-manager. RHEV / oVirt와 같은보다 심각한 시스템은 실제로 FC / iSCSI 기반 스토리지에 항상 LVM을 사용합니다
dyasny

@Jared : libvirt / virsh는 이것을 확실히 지원합니다; 모든 VM 스토리지에 사용합니다.
womble

dyasny, womble-의견을 주셔서 감사하지만 여전히 작동하지 않습니다. libvirt [ libvirt.org/formatdomain.html#elementsDisks](reference) 기반으로 도메인 구성 XML을 수동으로 편집하려고 시도했지만 루트 파일 시스템을 사용할 때 시스템을 부팅 할 수 없습니다. 내가 한 최선의 방법은 attach-disk동적으로 연결하는 것이지만 영구적이지 않으므로 /에서 작동하지 않습니다. 이에 대한 문서를 가리 키거나 특정 힌트를 제공 할 수 있습니까? 감사!
Jared

어떤 오류가 발생합니까? VM이 전혀 부팅됩니까? liveCD ISO를 첨부하여 VM을 시작하고 무엇을보고 보이지 않는지를 조사 할 것입니다. 원인은 디스크 인터페이스가 Xen / dev / xvdX에서 kvm의 / dev / vdX로 변경되었다는 사실 일 것입니다. IDE를 사용하기로 선택한 다음 / dev / hdX입니다. 그렇지 않은 경우 :))
dyasny

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 내의 파티션을 호스트의 블록 장치로 표시하는 데 사용할 수 있습니다.


댓글 주셔서 감사합니다. Richard. 나는 실제로 그 옵션과 losetup을 이미 보았습니다. 문제는 호스트에서 파일 시스템을 마운트하기 위해 게스트를 먼저 종료해야한다는 것입니다. 읽기 전용으로 마운트하려고하면 파일 시스템 손상에 대한 불만이있는 경우 fsck를 실행 한 다음 읽기 전용이므로 중단됩니다. 읽기 / 쓰기 마운트를 시도하지 않았습니다 . 손상을 일으킬 수 있기 때문입니다 . 그러나 온라인 요구 사항없이 일반적으로 qemu 이미지로이 작업을 수행하려는 사람에게 유용한 팁입니다.
Jared

2

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


그냥 해봤 어 또 다른 좋은 아이디어이지만 여전히 새로운 손님에게는 효과가 없습니다. centos 설치 프로그램은 실제로 vda 및 vdb를 ext4 및 swap으로 포맷 된 것으로 보지만 여전히 파티션 대신 디스크로 취급해야하며 직접 사용하지 않으므로 설치를 완료 할 수 없습니다. "정상적으로"설치 한 다음 파일 시스템을 덤프하여 볼륨을 분리하고 grub / fstab으로 바이올린을 작동 시켜서 작동하도록했지만 게스트 배포에 유용한 솔루션은 아닙니다. 나는 이것이 단순히 작동하지 않는다는 사실에 자신을 사임하기 시작했다.
Jared

나는 오해했다. 성가신 설치 프로그램을 사용하지 않고 호스트에서 직접 파티션을 빌드하기 위해 yum --installroot를 사용하고 있습니다. 나의 유스 케이스는 최신 상태를 유지하면서 가능한 한 비슷한 손님을 얻는 것입니다. 이것이 디스크가 아닌 파티션을 원하는 이유입니다.
Bittrance
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.