KVM / qemu - gunakan volume LVM secara langsung tanpa file gambar?

22

Saya tidak yakin bagaimana mengungkapkan pertanyaan ini (karena itu judulnya jelek), jadi izinkan saya memberikan contoh tentang apa yang saya coba lakukan.

Pada host Xen saya (lama), saya dapat menghadirkan sistem file LVM langsung ke setiap tamu. Sistem file ini sebenarnya dibuat dan diformat pada host, dan diteruskan langsung. Misalnya, untuk salah satu host saya menggunakan partisi tmp dan swap terpisah, saya mendefinisikan penyimpanan seperti ini:

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

Jadi, guest1-swap diformat sebagai partisi swap, guest1-disk dan guest1-tmp diformat dengan ext4, dan dari perspektif tamu, mereka hanya melihat mereka sebagai tiga partisi yang diformat di bawah / dev / sda.

(Ini mungkin terdengar seperti banyak pekerjaan, tetapi ada skrip provisi, seperti xen-tools yang luar biasa , yang mengotomatiskan hampir semuanya).

Ini memberikan beberapa kemampuan yang sangat berguna, dua di antaranya saya sangat tertarik mencari tahu untuk KVM:

  • Pasang sistem file tamu dari OS host . Saya dapat melakukan mount read-only dari setiap sistem file tamu kapan saja, bahkan ketika tamu sedang berjalan. Ini memiliki keuntungan tambahan yaitu memungkinkan saya untuk membuat snapshot LVM dari volume apa pun yang ada saat tamu sedang berjalan. Dengan cara ini, saya dapat mem-backup semua tamu saya secara terpusat, saat berjalan, dari tuan rumah.

  • Pengubahan ukuran volume online . Karena volume berisi sistem file Linux standar, saya dapat menggunakan kombinasi lvextend dan resize2fs untuk menumbuhkan sistem file tamu saya, lagi ketika sedang online.

Saat ini saya sedang menyiapkan host KVM yang akan menggantikan host Xen. Mirip dengan pengaturan Xen saya meningkatkan LVM untuk menyediakan akses sistem file langsung, tetapi KVM / qemu berperilaku berbeda karena selalu membuat file gambar untuk para tamu, bahkan pada volume LVM. Dari perspektif tamu, ia melihat ini sebagai disk yang tidak dipartisi, dan tergantung pada tamu untuk menerapkan label partisi, lalu membuat partisi dan sistem file.

Dari sudut pandang tamu itu baik-baik saja, tetapi dari perspektif server / manajemen tampaknya jauh lebih fleksibel daripada pengaturan Xen yang saya jelaskan. Saya masih baru di KVM, jadi saya mungkin (semoga) melewatkan sesuatu.

Saya mengalami masalah ini ketika mencoba untuk mengimplementasikan kembali solusi cadangan saya sebelumnya pada host KVM dan perintah mount terhenti ketika saya mencoba untuk me-mount salah satu sistem file tamu. Jadi, mengatasi itu adalah kekhawatiran saya saat ini, tetapi itu juga membuat saya khawatir tentang ukurannya, karena saya yakin masalah itu akan muncul di beberapa titik juga.

Jadi inilah pertanyaanku:

  1. Apakah ada cara agar kvm / qemu menggunakan sistem file volume LVM secara langsung seperti yang saya jelaskan untuk pengaturan Xen saya? Saya menggunakan libvirt untuk manajemen jika itu membuat perbedaan.

  2. Jika tidak, apa yang bisa saya lakukan untuk mendapatkan fungsionalitas pemasangan / pencadangan serupa di bawah KVM? Saya telah melihat diskusi tentang menggunakan libguestfs w / FUSE untuk melakukan ini, tetapi apakah itu benar-benar pilihan terbaik? Saya lebih suka tetap menggunakan mount sistem file asli jika memungkinkan.

  3. Juga jika tidak, apakah mungkin untuk melakukan resize sistem file online di bawah KVM? Saya telah menemukan beberapa diskusi / howtos tentang ini, tetapi jawabannya tampaknya di semua tempat tanpa solusi yang jelas, dan jelas tidak langsung.

Maaf untuk posting lama, hanya ingin memastikan semuanya jelas. Harap beri tahu saya jika saya dapat memberikan info lain yang akan membantu. Menantikan diskusi. :-)

Jared
sumber
Saya baru saja masuk untuk menetapkan karunia pada versi pertanyaan saya ini: serverfault.com/questions/409543/… . Mari kita lihat apakah Anda menyelamatkan saya 50 poin :)
Bittrance

Jawaban:

9
  1. qemu-kvm dapat menggunakan LVs sebagai disk virtual daripada file. ini sebenarnya cukup umum digunakan.
  2. libguestfs (dan hanya mencari seperangkat virt-*alat) dapat memberikan akses ke sistem file tamu dengan cara yang lebih bersih daripada apa pun yang Anda remount ke host secara langsung, meskipun keduanya mungkin.
  3. Mengubah ukuran FS online bukanlah fitur kvm, tetapi sesuatu yang harus mampu dilakukan OS tamu. resize2fsakan bekerja di VM seperti halnya pada perangkat keras fisik, satu-satunya masalah adalah tamu mengubah ukuran perubahan. Coba virt-resizesebagai alat standar, tetapi lvresizedan qemu-imgjuga dapat dengan mudah digunakan (meskipun dalam mode offline, membutuhkan tamu memulai kembali biasanya).

Saya pikir lvresizedengan resize2fsbenar-benar akan bekerja tanpa tamu me-restart, tetapi saya belum mencobanya

dyasny
sumber
Terima kasih balasannya. "qemu-kvm dapat menggunakan LVs sebagai disk virtual, bukan file." Apakah Anda tahu apakah ini berlaku untuk libvirt / virsh juga? Saya telah melihat beberapa hal yang menyinggung untuk melakukan ini dengan qemu (meskipun tidak ada yang pasti), tetapi tidak ada untuk libvirt, yang saya gunakan untuk manajemen domain.
Jared
1
qemu tidak terlalu peduli apakah Anda menyediakan perangkat blok atau file sebagai cadangan penyimpanan untuk disk virtual. block devs sebenarnya lebih baik karena cara ini qemu mencapai blok aktual lebih cepat daripada melalui sistem file. libvirt tidak luar biasa dalam mengelola penyimpanan, tetapi mendukung akses blok berbasis LVM, agak sulit untuk dilalui virshtetapi cukup mudah virt-manager. Sistem yang lebih serius seperti RHEV / oVirt benar-benar menggunakan LVM setiap saat untuk penyimpanan berbasis FC / iSCSI
dyasny
@Jared: libvirt / virsh jelas mendukung ini; kami menggunakannya untuk semua penyimpanan VM kami.
womble
dyasny, womble - menghargai komentar, tapi saya masih belum bisa membuatnya bekerja. Bahkan mencoba mengedit XML config domain secara manual berdasarkan libvirt [ libvirt.org/formatdomain.html#elementsDisks[(reference) , tetapi saya tidak dapat membuat mesin untuk boot ketika menggunakan filesystem root seperti yang telah saya jelaskan. Yang terbaik yang saya lakukan adalah menggunakannya attach-diskuntuk menghubungkannya secara dinamis, tetapi ini tidak permanen dan saya tidak bisa membuatnya bekerja untuk /. Bisakah Anda menunjukkan dokumentasi apa pun untuk ini, atau memberikan petunjuk khusus? Terima kasih!
Jared
kesalahan apa yang kamu lihat? Apakah VM boot sama sekali? Saya akan memulai VM dengan liveCD ISO terpasang dan menyelidiki apa yang dilihatnya dan apa yang tidak dilihatnya, pelakunya mungkin sekitar fakta bahwa antarmuka disk berubah dari Xen / dev / xvdX ke kvm / dev / vdX (kecuali Anda memilih untuk menggunakan IDE dan kemudian / dev / hdX. Jika Anda melakukannya maka jangan :))
dyasny
4

Saya menggunakan qemu-kvm + libvirt dengan konfigurasi persis yang Anda tanyakan, untuk alasan yang Anda daftarkan, tetapi juga karena saya mendapatkan kinerja yang jauh lebih baik tanpa ruang lingkup lapisan sistem berkas host KVM. Jika Anda menambahkan VG sebagai 'kumpulan penyimpanan' dalam virt-manager, Anda dapat membuat VM seperti itu menggunakan wizard yang mudah digunakan. (Tapi saya hanya menulis XML dengan tangan hari ini menggunakan VM yang ada sebagai templat).

Berikut ini adalah keluaran bersih dari 'virsh dumpxml' untuk salah satu tamu saya:

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

Pikiran lain (tidak relevan dengan pertanyaan Anda, tetapi mungkin bisa membantu): jika Anda bisa, pastikan Anda menggunakan jaringan 'paravirtualised', blokir, acak, driver jam dll - mereka secara signifikan lebih cepat daripada yang sepenuhnya tervirtualisasi. Ini adalah "model = virtio" hal-hal di atas. Anda harus memuat modul driver ke dalam kernel host seperti virtio_net.

Berikut ini adalah output dari '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
sumber
4
Saya pikir itu juga akan berguna untuk melihat XML untuk kolam penyimpanan, misalnyavirsh pool-dumpxml mypool
Michael Hampton
Oke, ditambahkan ke jawaban di atas.
AnotherSmellyGeek
2

Saya tidak tahu cara persis mereplikasi perilaku Xen yang Anda gambarkan. Namun, Anda dapat menggunakan kpartxuntuk mengekspos partisi di dalam LV yang berisi gambar seluruh disk sebagai perangkat blok di host, yang kemudian dapat Anda pasang, dll.

Richard Kettlewell
sumber
Terima kasih atas komentarnya, Richard. Saya sebenarnya sudah menemukan opsi itu, dan juga losetup, yang berfungsi sama. Masalahnya adalah saya harus mematikan guest terlebih dahulu untuk me-mount filesystem-nya dari host. Jika saya mencoba me-mount read-only, jika mengeluh tentang korupsi filesystem, ingin menjalankan fsck, dan kemudian dibatalkan karena ini read-only. Saya belum mencoba memasangnya baca-tulis, karena itu bisa menyebabkan korupsi. Ini adalah tip yang bagus untuk siapa saja yang ingin melakukan ini dengan gambar qemu secara umum, meskipun, tanpa persyaratan online.
Jared
2

Lihat jawaban saya untuk pertanyaan saya sendiri tentang masalah ini di KVM booting kernel dan partisi yang ada . Singkatnya, mendapatkan virt-install untuk membuat konfigurasi untuk ini cukup mudah, mengingat sedikit modifikasi dari guest / etc / fstab.

Bittrance
sumber
Baru saja mencobanya. Itu ide bagus lainnya, tetapi masih tidak berhasil, setidaknya tidak untuk tamu baru. Installer centos benar-benar melihat vda dan vdb diformat dengan ext4 dan swap, tetapi masih bersikeras memperlakukannya sebagai disk daripada partisi dan tidak akan menggunakannya secara langsung, jadi saya tidak dapat menyelesaikan instalasi. Saya kira saya bisa menginstal "secara normal", kemudian membuang filesystem untuk memisahkan volume dan bermain-main dengan grub / fstab seperti yang Anda sebutkan untuk membuatnya bekerja, tapi itu bukan solusi yang dapat digunakan untuk menggelar tamu. Saya mulai pasrah pada kenyataan bahwa ini tidak akan berhasil.
Jared
Saya salah paham. Saya menggunakan yum --installroot untuk membangun partisi langsung dari host tanpa melibatkan installer yang sial. Kasus penggunaan saya adalah untuk mendapatkan tamu yang semirip mungkin, namun tetap terbarui. Inilah sebabnya saya ingin partisi daripada disk.
Bittrance