web-dev-qa-db-ja.com

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

この質問の言い方がよくわからないので(タイトルが悪いので)、私がやろうとしていることの例を挙げましょう。

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

ディスク= [
'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の下にある3つのフォーマットされたパーティションとしてそれらを単に認識します。

(これは多くの作業のように聞こえるかもしれませんが、すばらしい xen-tools などのプロビジョニングスクリプトがあり、ほとんどすべてが自動化されています)。

これは、いくつかの本当に便利な機能を提供します。そのうちの2つは、KVMについて理解することに特に興味があります。

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

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

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

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

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

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

  1. Xenセットアップで説明したように、kvm/qemuでLVMボリュームファイルシステムを直接使用する方法はありますか?それが違いを生む場合、私は管理にlibvirtを使用します。

  2. そうでない場合、KVMで同様のマウント/バックアップ機能を取得するにはどうすればよいですか?これを行うためにFuseでlibguestfsを使用することについての議論を見てきましたが、それは本当に最良のオプションですか?可能であれば、ネイティブのファイルシステムマウントを使用することをお勧めします。

  3. また、そうでない場合、KVMでオンラインファイルシステムのサイズ変更を行うことは可能ですか?私はこれについていくつかのディスカッション/ハウツーを見つけましたが、その答えはあちこちにあり、明確な解決策はなく、明確な解決策もありません。

長い投稿でごめんなさい、それが明確であることを確認したかっただけです。役立つと思われるその他の情報を提供できるかどうかをお知らせください。議論を楽しみにしています。 :-)

22
Jared
  1. qemu-kvmは、LVをファイルの代わりに仮想ディスクとして使用できます。これは実際には非常に一般的な使用例です。
  2. libguestfs(およびvirt-*ツールのセットを探すだけ)は、ホストに直接再マウントするよりもクリーンな方法でゲストファイルシステムへのアクセスを提供できますが、どちらも可能です。
  3. オンラインFSサイズ変更はkvmの機能ではありませんが、ゲストOSで可能な機能です。resize2fsはVMでも機能します物理ハードウェアの場合と同様に、サイズの変更をゲストが再検出する唯一の問題です。標準ツールとしてvirt-resizeを試してください。ただし、lvresizeおよびqemu-imgも簡単に使用できます(ただし、オフラインモード、通常はゲストの再起動が必要です)。

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

9
dyasny

私はqemu-kvm + libvirtを、あなたが質問している構成で正確に使用しますが、それはあなたがリストした理由からですが、さらにmuchより良いパフォーマンスが得られますスコープ内の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

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

2
Bittrance

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

2