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 , ш ',
]

Отже, Guest1-swap відформатований як розділ swap, Guest1-диск та guest1-tmp форматуються з ext4, і з точки зору гостя він просто розглядає їх як три форматовані розділи під / dev / sda.

(Це може здатися великою роботою, але є сценарії забезпечення, такі як дивовижні інструменти xen , які автоматизують майже все).

Це надає кілька дійсно корисних можливостей, два з яких мені особливо цікаво з'ясувати для KVM:

  • Змонтуйте гостьові файлові системи з хост-ОС . Я можу виконати кріплення будь-якої гостьової файлової системи лише для читання, навіть коли гість працює. Це має побічну перевагу, що я можу створювати знімки LVM будь-якого наявного обсягу, поки гість працює. Таким чином, я можу в центральному режимі створити резервне копіювання всіх своїх гостей, під час бігу, від господаря.

  • Змінення розміру в Інтернеті . Оскільки томи містять стандартні файлові системи Linux, я можу використовувати комбінацію lvextend і resize2fs для вирощування моїх гостьових файлових систем, знову ж таки, коли вони в мережі.

Наразі я встановлюю хост KVM, який замінить хост Xen. Як і у налаштуваннях Xen, я використовую LVM для забезпечення прямого доступу до файлової системи, але KVM / qemu поводиться інакше тим, що він завжди створює файл зображення для гостей, навіть на гучності LVM. З точки зору гостя, він розглядає це як нерозподілений диск, і гість повинен застосувати мітку розділу, а потім створити розділи та файлові системи.

З точки зору гостя це добре, але з точки зору сервера / управління, здається, він є менш гнучким, ніж описані нами налаштування Xen. Я все ще новачок у KVM, тому, можливо, я (сподіваюся) щось пропущую.

Я зіткнувся з цією проблемою, намагаючись повторно реалізувати колишнє рішення резервного копіювання на хості KVM, а команда mount забилася, коли я намагався змонтувати одну з файлових систем гостя. Отже, вирішення цього питання є моєю сьогоднішньою проблемою, але це також викликало занепокоєння щодо зміни розміру, тому що я впевнений, що це питання виникне і в якийсь момент.

Отже, ось мої запитання:

  1. Чи є спосіб, щоб kvm / qemu безпосередньо використовував файлові системи файлів LVM, як я описав для моєї настройки Xen? Я використовую libvirt для управління, якщо це має значення.

  2. Якщо ні, що я можу зробити, щоб отримати подібний функціонал монтажу / резервного копіювання під KVM? Я бачив дискусії щодо використання libguestfs w / FUSE для цього, але чи справді це найкращий варіант? Я вважаю за краще би дотримуватися монтажу файлів на рідній файловій системі, якщо це можливо.

  3. Якщо ні, чи можна змінити розмір файлової системи в Інтернеті під KVM? Я знайшов кілька обговорень з цього приводу, але, здається, відповіді є скрізь без чітких і, безперечно, прямолінійних рішень.

Вибачте за довгу посаду, просто хотів переконатися, що це було зрозуміло. Будь ласка, дайте мені знати, чи можу я надати будь-яку іншу інформацію, яка була б корисною. З нетерпінням чекаю дискусії. :-)


Я щойно увійшов, щоб встановити суму моєї версії цього питання: serverfault.com/questions/409543/… . Давайте подивимось, чи врятуєте ви мені 50 очок :)
Bittrance

Відповіді:


9
  1. qemu-kvm може використовувати LV як віртуальні диски замість файлів. це фактично звичайний випадок використання.
  2. libguestfs (і просто шукайте набір virt-*інструментів) може забезпечити доступ до гостьових файлових систем більш чистим способом, ніж все, що ви перераховуєте хосту безпосередньо, хоча обидва можливі.
  3. Змінення розміру FS в Інтернеті не є особливістю kvm, але те, що гостя повинна мати можливість resize2fsбуде працювати як в машині, так і на фізичному обладнанні, єдиною проблемою є гість, який повторно визначає зміни розміру. Спробуйте в virt-resizeякості стандартного інструменту, але lvresizeі qemu-imgтакож може бути легко використана (хоча в автономному режимі, вимагаючи гостьовий перезапуск зазвичай).

Я думаю , що lvresizeз resize2fsдійсно буде працювати без перезавантаження гостя, але я не пробував ще


Дякую за відповідь. "qemu-kvm може використовувати LV як віртуальні диски замість файлів." Чи знаєте ви, що це справедливо і для libvirt / virsh? Я бачив деякі речі, що натякають на це з qemu (хоча нічого певного), але нічого на libvirt, який я використовую для управління доменом.
Джаред

1
qemu насправді не важливо, чи надаєте ви блоковий пристрій чи файл як сховище для віртуального диска. блокові розробники насправді кращі, тому що таким чином qemu досягає фактичних блоків швидше, ніж шляхом проходження файлової системи. libvirt не дивовижний в управлінні сховищем, але він підтримує доступ до блоку на основі LVM, трохи важко дістатися, virshале досить легко пройти virt-manager. Більш серйозні системи, такі як RHEV / oVirt, фактично використовують LVM весь час для зберігання на базі FC / iSCSI
діасний

@Jared: libvirt / virsh, безумовно, підтримує це; ми використовуємо його для всіх наших VM-накопичувачів.
живіт

дясний, вродливий - оцінюйте коментарі, але я все одно не можу це зробити. Навіть намагався редагувати конфігурацію домену XML вручну на основі libvirt [ libvirt.org/formatdomain.html#elementsDisksSense(reference) , але я не можу змусити машину завантажуватися при використанні кореневої файлової системи, як я описав. Найкраще, що я зробив, - це використовувати attach-diskдля динамічного підключення, але це не є постійним, і я не можу змусити його працювати /. Чи можете ви вказати на якусь документацію для цього чи надати конкретні підказки? Спасибі!
Джаред

які помилки ви бачите? Чи взагалі завантажується VM? Я б запустив VM із доданим ISO LiveCD і досліджував, що він бачить, а що не бачить, винуватець, ймовірно, полягає в тому, що інтерфейси диска змінилися з Xen / dev / xvdX на kvm / dev / vdX (якщо тільки ви вибрали використовувати IDE, і тоді це / dev / hdX. Якщо ви це зробили, то не робіть :))
dyasny

4

Я використовую qemu-kvm + libvirt саме з конфігурацією, про яку ви питаєте, з наведених вами причин, але додатково тому, що я отримую набагато кращі показники без рівня файлової системи хоста KVM за обсягом. Якщо ви додаєте VG як пул зберігання даних у virt-менеджері, ви можете створити такі 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>

Інша думка (не стосується вашого питання, але це може допомогти): якщо ви можете, переконайтеся, що ви використовуєте драйвери "паравіртуалізованої" мережі, блоків, випадкових, годинників тощо - вони значно швидші, ніж повністю віртуалізовані. Це вище "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

Гаразд, додано до відповіді вище.
ЧерговийSmellyGeek

2

Я не знаю способу точно повторити поведінку Xen, яку ви описуєте. Однак ви можете використовувати kpartxдля викриття розділів у межах LV, які містять зображення на цілому диску як блокові пристрої на хості, які ви зможете потім змонтувати тощо.


Дякую за коментар, Річард. Насправді я вже натрапив на цей варіант, а також на програму losetup, яка працює аналогічно. Проблема в тому, що я повинен спочатку відключити гостя, щоб змонтувати його файлові системи від хоста. Якщо я спробую встановити функцію лише для читання, якщо скаржиться на пошкодження файлової системи, хоче запустити fsck, а потім перервати, тому що це лише для читання. Я не намагався встановити його на читання-запис, тому що це може спричинити корупцію. Це чудова порада для тих, хто хоче це зробити із зображеннями qemu взагалі, хоча без вимог Інтернету.
Джаред

2

Дивіться мою відповідь на моє власне запитання з цього питання на KVM завантажуючи ядро ​​зображення та існуючий розділ . Коротше кажучи, отримати virt-install для створення конфігурації для цього досить просто, враховуючи невелику модифікацію гостя / etc / fstab.


Просто спробував це. Це ще одна чудова ідея, але все ще не працює, принаймні, не для нових гостей. Програма встановлення centos насправді бачить vda та vdb відформатованими з ext4 та свопом, але він все ще наполягає на тому, щоб вони розглядалися як диски, а не розділи, і не використовуватимуть їх безпосередньо, тому я не можу завершити встановлення. Я гадав, що я можу встановити "нормально", а потім скинути файлові системи на окремі томи та поспілкуватися з grub / fstab, як ви згадали, щоб працювати, але це не дуже корисне рішення для розміщення гостей. Я починаю змиритися з тим, що це просто не вийде.
Джаред

Я неправильно зрозумів. Я використовую yum --installroot для створення розділів безпосередньо з хоста, не залучаючи прикрі інсталятори. Мій варіант використання - щоб отримати максимально схожих гостей, залишаючись в курсі сучасних. Ось чому я хочу перегородки, а не диски.
Bittrance
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.