KVM / qemu-イメージファイルなしでLVMボリュームを直接使用しますか?


22

この質問の言い方がよくわかりません(タイトルが下手です)ので、私がやろうとしていることの例を挙げましょう。

私の(古い)Xenホストでは、各ゲストにLVMファイルシステムを直接提示できます。これらのファイルシステムは実際にホスト上で作成およびフォーマットされ、直接パススルーされます。たとえば、個別のtmpパーティションとスワップパーティションを使用するホストの1つに対して、次のようにストレージを定義します。

disk = [
'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などのプロビジョニングスクリプトがあります)。

これにより、いくつかの非常に便利な機能が提供されます。そのうち2つは、KVMの把握に特に興味があります。

  • ホストOSからゲストファイルシステムをマウントします。ゲストの実行中でも、いつでもゲストファイルシステムの読み取り専用マウントを実行できます。これには、ゲストの実行中に既存のボリュームのLVMスナップショットを作成できるという副次的な利点があります。このように、実行中にホストからすべてのゲストを集中的にバックアップできます。

  • オンラインボリュームのサイズ変更。ボリュームには標準のLinuxファイルシステムが含まれているため、lvextendとresize2fsの組み合わせを使用して、ゲストファイルシステムをオンラインで拡張できます。

現在、Xenホストを置き換えるKVMホストを設定しています。Xenのセットアップと同様に、私はLVMを利用して直接ファイルシステムアクセスを提供していますが、KVM / qemuは、LVMボリューム上であっても常にゲスト用のイメージファイルを作成するという点で動作が異なります。ゲストの観点からは、これはパーティション化されていないディスクと見なされ、パーティションラベルを適用してからパーティションとファイルシステムを作成するのはゲスト次第です。

ゲストの観点からは問題ありませんが、サーバー/管理の観点からは、説明したXenのセットアップよりも柔軟性がはるかに低いようです。私はまだKVMが初めてなので、(うまくいけば)何かが足りないかもしれません。

以前のバックアップソリューションをKVMホストに再実装しようとしたときにこの問題が発生し、ゲストのファイルシステムの1つをマウントしようとしたときにマウントコマンドが停止しました。それで、それに対処することは私の現在の懸念ですが、サイズ変更の問題も心配しました。それは、ある時点で問題が発生することも確信しているからです。

だから、ここに私の質問があります:

  1. Xenのセットアップで説明したように、kvm / qemuがLVMボリュームファイルシステムを直接使用する方法はありますか?管理に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の機能ではありませんが、ゲストOSで可能な機能である必要があります。resize2fsVMでも物理ハードウェアと同様に機能しますが、唯一の問題はゲストがサイズの変更を再検出することです。試してみてくださいvirt-resize標準的なツールとして、しかし、lvresizeおよびqemu-img(オフラインモードでは、通常、ゲストの再起動を必要とするが)も簡単に使用することができます。

lvresizewith resize2fsはゲストを再起動しなくても実際に機能すると思いますが、まだ試していません


返信いただきありがとうございます。「qemu-kvmは、ファイルの代わりにLVを仮想ディスクとして使用できます。」これがlibvirt / virshにも当てはまるかどうか知っていますか?qemuでこれを行うことをほのめかしているものもありますが(明確なものはありませんが)、ドメイン管理に使用しているlibvirtには何もありません。
ジャレッド

1
qemuは、仮想ディスクのバッキングストアとしてブロックデバイスを提供するかファイルを提供するかは、実際には関係ありません。このようにqemuはファイルシステムを経由するよりも実際のブロックに速く到達するため、ブロック開発者の方が実際に優れています。libvirtはストレージの管理に驚くことはありませんが、LVMベースのブロックアクセスをサポートしてvirshvirt-managerます。RHEV / oVirtなどのより深刻なシステムは、FC / iSCSIベースのストレージで常にLVMを実際に使用しています
-dyasny

@Jared:libvirt / virshは間違いなくこれをサポートします。すべてのVMストレージに使用します。
ワンブル

dyasny、womble-コメントに感謝しますが、私はまだこれを機能させることができません。libvirt [ libvirt.org/formatdomain.html#elementsDisks](reference)に基づいてドメイン構成XMLを手動で編集しようとしても、説明したようにルートファイルシステムを使用しているとマシンを起動できません。私が行った最善の方法はattach-disk、動的に接続することです。しかし、これは永続的なものではなく、/で動作させることはできません。このためのドキュメントを参照したり、具体的なヒントを提供したりできますか?ありがとう!
ジャレッド

どのようなエラーが表示されていますか?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を手作業で記述しています)。

ゲストの1人の '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
マイケル・ハンプトン

さて、上の答えに追加しました。
AnotherSmellyGeek

2

あなたが説明するXenの動作を正確に複製する方法は知りません。ただし、kpartxディスク全体のイメージを含むLV内のパーティションをホスト上のブロックデバイスとして公開するために使用できます。これをマウントすることができます。


コメントありがとう、リチャード。私は実際にそのオプションと、同様に機能するlosetupに既に出会っています。そこにある問題は、ホストからファイルシステムをマウントするために、まずゲストをシャットダウンする必要があるということです。読み取り専用でマウントしようとした場合、ファイルシステムの破損について不満があり、fsckを実行したい場合、読み取り専用であるため中止します。破損の原因となる可能性があるため、読み書き可能にマウントしようとしませんでした。ただし、これは一般にqemuイメージを使用してこれを実行したい人にとっては、オンライン要件なしで素晴らしいヒントです。
ジャレッド

2

KVMのオフイメージカーネルと既存のパーティションのブートで、この問題に関する私自身の質問に対する私の答えを参照してください。つまり、ゲストの/ etc / fstabをわずかに変更すれば、virt-installを使用してこの構成を作成するのは非常に簡単です。


ちょうどそれを試してみました。別の素晴らしいアイデアですが、それでも機能しません。少なくとも新しいゲストにはそうではありません。centosインストーラーは、実際にはvdaとvdbをext4とswapでフォーマットされていると見なしますが、パーティションではなくディスクとして扱うことを主張しているため、直接使用しないため、インストールを完了できません。「通常」インストールしてから、ファイルシステムを別のボリュームにダンプし、先ほど述べたようにgrub / fstabをいじって動作させることができると思っていましたが、実際にはゲストを展開するための有効なソリューションではありません。私はこれが単に機能しないという事実に自分自身を辞任し始めています。
ジャレッド

私は誤解しました。厄介なインストーラーを使用せずに、yum --installrootを使用してホストから直接パーティションを構築しています。私のユースケースは、可能な限り最新の状態を維持しながら、できるだけ類似したゲストを取得することです。これが、ディスクではなくパーティションが必要な理由です。
-Bittrance
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.