KVM / qemu - ใช้ปริมาณ LVM โดยตรงโดยไม่ต้องใช้ไฟล์ภาพ?


22

ฉันไม่แน่ใจว่าจะใช้วลีคำถามนี้อย่างไร (ดังนั้นชื่อที่ไม่ดี) ดังนั้นฉันขอยกตัวอย่างสิ่งที่ฉันพยายามทำ

ในโฮสต์ Xen (เก่า) ของฉันฉันสามารถนำเสนอระบบไฟล์ LVM โดยตรงกับแขกแต่ละคนได้ ระบบไฟล์เหล่านี้ถูกสร้างขึ้นจริงและจัดรูปแบบบนโฮสต์และส่งผ่านโดยตรง เช่นสำหรับหนึ่งในโฮสต์ของฉันที่ใช้พาร์ติชัน tmp และ swap แยกกันฉันจะกำหนดที่เก็บข้อมูลดังนี้:

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

ดังนั้น guest1-swap จะถูกฟอร์แมทเป็นพาร์ติชั่น swap, guest1-disk และ guest1-tmp ถูกจัดรูปแบบด้วย ext4, และจากมุมมองของแขกมันก็เห็นว่ามันเป็นพาร์ติชั่นที่จัดรูปแบบสามอันภายใต้ / dev / sda

(นี่อาจฟังดูทำงานเยอะ แต่มีสคริปต์การจัดเตรียมเช่นเครื่องมือ xen ที่ยอดเยี่ยมที่ทำทุกอย่างโดยอัตโนมัติ)

นี่เป็นความสามารถที่มีประโยชน์จริง ๆ ซึ่งฉันสนใจที่จะหา KVM เป็นพิเศษ:

  • ติดตั้งระบบไฟล์ของผู้เข้าพักจาก OS ฉันสามารถทำการเมาท์แบบอ่านอย่างเดียวของระบบไฟล์ของผู้เยี่ยมชมได้ตลอดเวลาแม้ในขณะที่แขกกำลังทำงานอยู่ สิ่งนี้มีประโยชน์ด้านการอนุญาตให้ฉันสร้างสแน็ปช็อต LVM ของโวลุ่มที่มีอยู่ใด ๆ ในขณะที่แขกกำลังทำงาน ด้วยวิธีนี้ฉันสามารถสำรองข้อมูลแขกของฉันทั้งหมดจากส่วนกลางจากโฮสต์

  • ปรับขนาดปริมาณออนไลน์ เนื่องจากวอลุ่มมีระบบไฟล์ Linux มาตรฐานฉันสามารถใช้การรวมกันของ lvextend และ resize2fs เพื่อขยายระบบไฟล์เกสต์ของฉันอีกครั้งในขณะที่กำลังออนไลน์

ขณะนี้ฉันกำลังตั้งค่าโฮสต์ KVM ที่จะแทนที่โฮสต์ Xen คล้ายกับการติดตั้ง Xen ฉันใช้ประโยชน์จาก LVM เพื่อให้การเข้าถึงระบบแฟ้มโดยตรง แต่ KVM / qemu ทำงานแตกต่างกันในการที่จะเสมอสร้างไฟล์ภาพสำหรับผู้เข้าพักแม้ในปริมาณ LVM จากมุมมองของแขกจะเห็นว่านี่เป็นดิสก์ที่ไม่แบ่งพาร์ติชันและขึ้นอยู่กับแขกที่จะใช้ป้ายพาร์ติชันแล้วสร้างพาร์ติชันและระบบแฟ้ม

จากมุมมองของแขกที่ดี แต่จากมุมมองของเซิร์ฟเวอร์ / การจัดการดูเหมือนว่าจะมีความยืดหยุ่นน้อยกว่าการตั้งค่า Xen ที่ฉันอธิบาย ฉันยังใหม่กับ KVM ดังนั้นฉันอาจจะ (ขาดหวัง) บางสิ่งบางอย่างหายไป

ฉันพบปัญหานี้เมื่อพยายามใช้โซลูชันสำรองข้อมูลเดิมของฉันอีกครั้งบนโฮสต์ KVM และคำสั่ง mount chocked เมื่อฉันพยายามติดตั้งหนึ่งในระบบไฟล์ของแขก ดังนั้นการพูดถึงสิ่งที่เป็นข้อกังวลในปัจจุบันของฉัน แต่มันก็ทำให้ฉันกังวลเกี่ยวกับสิ่งที่ปรับขนาดเพราะฉันแน่ใจว่าปัญหาจะเกิดขึ้นในบางจุดเช่นกัน

ดังนั้นนี่คือคำถามของฉัน:

  1. มีวิธีใดที่จะให้ kvm / qemu ใช้ระบบไฟล์ปริมาณ LVM โดยตรงตามที่ฉันอธิบายสำหรับการตั้งค่า Xen ของฉัน ฉันใช้ libvirt เพื่อการจัดการหากนั่นสร้างความแตกต่าง

  2. ถ้าไม่ฉันจะทำอย่างไรเพื่อให้ได้ฟังก์ชั่นการติดตั้ง / สำรองที่คล้ายกันภายใต้ KVM ฉันเคยเห็นการสนทนาเกี่ยวกับการใช้ libguestfs ด้วย FUSE เพื่อทำสิ่งนี้ แต่นั่นเป็นตัวเลือกที่ดีที่สุดจริง ๆ หรือ ฉันต้องการติดกับระบบไฟล์ดั้งเดิมถ้าเป็นไปได้

  3. นอกจากนี้ถ้าไม่เป็นไปได้หรือไม่ที่จะทำการปรับขนาดระบบไฟล์ออนไลน์ภายใต้ KVM? ฉันได้พบการสนทนาหลายครั้ง / วิธีการเกี่ยวกับเรื่องนี้ แต่คำตอบดูเหมือนจะอยู่ทั่วสถานที่ที่ไม่มีความชัดเจนและแน่นอนไม่มีวิธีแก้ปัญหาที่ตรงไปตรงมา

ขออภัยสำหรับความยาวโพสต์เพียงต้องการให้แน่ใจว่ามันชัดเจน โปรดแจ้งให้เราทราบหากฉันสามารถให้ข้อมูลอื่น ๆ ที่จะเป็นประโยชน์ รอการอภิปราย :-)


ฉันเพียงแค่ลงทะเบียนในการตั้งเงินรางวัลในรุ่นของฉันคำถามนี้: serverfault.com/questions/409543/... เรามาดูกันว่าคุณช่วยฉันได้ 50 คะแนนหรือ
เปล่า

คำตอบ:


9
  1. qemu-kvm สามารถใช้ LVs เป็นดิสก์เสมือนแทนที่จะเป็นไฟล์ นี่เป็นกรณีการใช้งานทั่วไปจริง ๆ แล้ว
  2. libguestfs (และเพียงแค่มองหาชุดvirt-*เครื่องมือ) สามารถให้การเข้าถึงระบบไฟล์เกสต์ในวิธีที่สะอาดกว่าสิ่งใดก็ตามที่คุณเชื่อมต่อกับโฮสต์โดยตรงแม้ว่าจะเป็นไปได้ก็ตาม
  3. การปรับขนาด FS แบบออนไลน์ไม่ใช่คุณลักษณะของ kvm แต่มีบางสิ่งที่ guest OS ควรมีความสามารถ resize2fsจะทำงานใน VM เช่นเดียวกับที่ทำบนฮาร์ดแวร์ทางกายภาพปัญหาเดียวที่ผู้เยี่ยมชมตรวจสอบคือการเปลี่ยนแปลงขนาด ลองvirt-resizeเป็นเครื่องมือมาตรฐาน แต่lvresizeและqemu-imgยังสามารถนำมาใช้อย่างง่ายดาย (แม้ว่าในโหมดออฟไลน์ต้องเริ่มต้นใหม่ของผู้เข้าพักปกติ)

ผมคิดว่าlvresizeมีresize2fsจริงจะทำงานได้โดยไม่ต้องเริ่มต้นใหม่ของผู้เข้าพัก แต่ฉันไม่ได้พยายามมันยัง


ขอบคุณสำหรับการตอบกลับ. "qemu-kvm สามารถใช้ LVs เป็นดิสก์เสมือนแทนไฟล์ได้" คุณรู้หรือไม่ว่าสิ่งนี้เป็นจริงสำหรับ libvirt / virsh เช่นกัน? ฉันได้เห็นบางสิ่งที่ยิ่งทำให้การทำเช่นนี้กับ qemu (แต่ไม่มีอะไรแน่นอน) แต่ไม่มีอะไรสำหรับ libvirt ซึ่งฉันใช้สำหรับการจัดการโดเมน
Jared

1
qemu ไม่สนใจว่าคุณจะจัดเตรียมอุปกรณ์บล็อกหรือไฟล์เป็นที่เก็บข้อมูลสำรองสำหรับดิสก์เสมือน block devs ดีกว่าเพราะวิธีนี้ qemu ไปถึงบล็อกจริงเร็วกว่าโดยผ่านระบบไฟล์ libvirt ไม่ได้เป็นที่น่าตื่นตาตื่นใจในการจัดการการจัดเก็บ แต่ไม่สนับสนุน LVM ปิดกั้นการเข้าถึงตามบิตยากที่จะได้รับที่จะผ่านแต่ผ่านง่ายพอvirsh virt-managerระบบที่รุนแรงมากขึ้นเช่น RHEV / oVirt ใช้ LVM ตลอดเวลาสำหรับการจัดเก็บข้อมูลแบบ FC / iSCSI
2012

@ Jared: libvirt / virsh สนับสนุนอย่างแน่นอน; เราใช้มันสำหรับพื้นที่เก็บข้อมูล VM ทั้งหมดของเรา
womble

dyasny, womble - ซาบซึ้งความคิดเห็น แต่ฉันยังไม่สามารถใช้งานได้ แม้พยายามแก้ไข XML การกำหนดค่าโดเมนด้วยตนเองตาม libvirt [ libvirt.org/formatdomain.html#elementsDisks เหมือนกัน (การอ้างอิง)แต่ฉันไม่สามารถทำให้เครื่องบูตเมื่อใช้ระบบไฟล์รูทตามที่ฉันได้อธิบายไว้ สิ่งที่ดีที่สุดที่ฉันทำคือใช้attach-diskเพื่อเชื่อมต่อแบบไดนามิก แต่นี่ไม่ได้เป็นการถาวรและฉันไม่สามารถใช้เพื่อ / คุณสามารถชี้ไปที่เอกสารใด ๆ สำหรับสิ่งนี้หรือให้คำแนะนำเฉพาะได้หรือไม่ ขอบคุณ!
Jared

คุณเห็นข้อผิดพลาดอะไร VM บูตหรือไม่ ฉันจะเริ่มต้น VM ด้วยการแนบ liveCD ISO และตรวจสอบสิ่งที่เห็นและสิ่งที่ไม่เห็นผู้ร้ายน่าจะเกี่ยวกับข้อเท็จจริงที่ว่าอินเตอร์เฟสของดิสก์เปลี่ยนไปในรูปแบบ Xen / dev / xvdX เป็น kvm's / dev / vdX (เว้นแต่ คุณเลือกที่จะใช้ IDE จากนั้นก็เป็น / dev / hdX หากคุณไม่ทำเช่นนั้น :))
dyasny

4

ฉันใช้ qemu-kvm + libvirt กับการกำหนดค่าที่คุณต้องการอย่างแน่นอนด้วยเหตุผลที่คุณระบุไว้ แต่ยังเพิ่มเติมเพราะฉันได้รับประสิทธิภาพที่ดีขึ้นมากโดยไม่มีเลเยอร์ระบบไฟล์ของโฮสต์ KVM ในขอบเขต หากคุณเพิ่ม VG เป็น 'พูลหน่วยเก็บข้อมูล' ใน virt-manager คุณสามารถสร้าง VM ดังกล่าวโดยใช้ตัวช่วยสร้างที่ใช้งานง่าย (แต่ฉันเพิ่งเขียน XML ด้วยมือวันนี้โดยใช้ VM ที่มีอยู่เป็นแม่แบบ)

นี่คือผลลัพธ์ที่ถูกทำให้สะอาดของ '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>

ความคิดอื่น (ไม่เกี่ยวข้องกับคำถามของคุณ แต่อาจช่วยได้): ถ้าเป็นไปได้ตรวจสอบให้แน่ใจว่าคุณใช้เครือข่าย 'paravirtualised' บล็อกการสุ่มควบคุมนาฬิกาและอื่น ๆ - เร็วกว่าการจำลองเสมือนจริงมาก นี่คือสิ่งที่ "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 ที่มีอิมเมจทั้งดิสก์เป็นอุปกรณ์บล็อกบนโฮสต์ซึ่งคุณสามารถเมาท์เป็นต้น


ขอบคุณสำหรับความคิดเห็นริชาร์ด ฉันเจอตัวเลือกนั้นจริง ๆ แล้วรวมถึง losetup ซึ่งใช้งานได้เหมือนกัน ปัญหาคือว่าฉันต้องปิดระบบแขกก่อนเพื่อติดตั้งระบบไฟล์จากโฮสต์ ถ้าฉันพยายามที่จะเมานต์แบบอ่านอย่างเดียวถ้าบ่นเกี่ยวกับความเสียหายของระบบไฟล์ต้องการที่จะเรียกใช้ fsck แล้วยกเลิกเพราะมันเป็นแบบอ่านอย่างเดียว ฉันยังไม่ได้ลองติดตั้งเป็นอ่าน - เขียนเพราะอาจทำให้เกิดความเสียหายได้ นี่เป็นเคล็ดลับที่ยอดเยี่ยมสำหรับทุกคนที่ต้องการทำสิ่งนี้ด้วยภาพ qemu โดยทั่วไปแม้ว่าจะไม่มีข้อกำหนดทางออนไลน์
Jared

2

ดูคำตอบของฉันกับคำถามของตัวเองในเรื่องนี้ที่KVM บูตเคอร์เนลปิดภาพและพาร์ติชันที่มีอยู่ กล่าวโดยสรุปคือการรับ virt-install เพื่อสร้างการกำหนดค่าสำหรับสิ่งนี้ค่อนข้างตรงไปตรงมาเนื่องจากมีการปรับเปลี่ยนเล็กน้อยสำหรับแขก / etc / fstab


แค่ลองดู เป็นความคิดที่ดีอีกอย่างหนึ่ง แต่ก็ยังไม่ได้ผลอย่างน้อยก็ไม่ใช่สำหรับแขกใหม่ Centos installer เห็น vda และ vdb ในรูปแบบของ ext4 และ swap แต่มันยังคงยืนยันว่ามันเป็นดิสก์มากกว่าพาร์ติชันและจะไม่ใช้โดยตรงดังนั้นฉันไม่สามารถติดตั้งให้เสร็จได้ ฉันคิดว่าฉันสามารถติดตั้ง "ปกติ" แล้วทิ้งระบบไฟล์เพื่อแยกวอลลุ่มและซอด้วยด้วง / fstab อย่างที่คุณพูดเพื่อให้มันทำงานได้ แต่นั่นไม่ใช่วิธีแก้ปัญหาที่ใช้งานได้จริงสำหรับการปรับใช้แขก ฉันเริ่มที่จะลาออกจากความจริงที่ว่าสิ่งนี้จะไม่ทำงาน
Jared

ฉันเข้าใจผิด. ฉันใช้ yum - installroot เพื่อสร้างพาร์ติชั่นโดยตรงจากโฮสต์โดยไม่เกี่ยวข้องกับตัวติดตั้งที่น่ารำคาญ กรณีการใช้งานของฉันคือการทำให้แขกที่คล้ายกันมากที่สุดเท่าที่จะเป็นไปได้ในขณะที่ยังคงทันสมัย นี่คือเหตุผลที่ฉันต้องการพาร์ติชันมากกว่าดิสก์
Bittrance
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.